From b7eb243d9204a40977761fb2453070825dfeab97 Mon Sep 17 00:00:00 2001 From: Ori Livneh Date: Wed, 30 Sep 2015 17:26:46 -0700 Subject: [PATCH] resourceloader: Minify per-module instead of per-response * Decline to cache minified private modules, because they exist in as many variants as there are users, and are unlikely to be cache hits now that we use APC. * Other modules are minified individually, to improve cache hit rate. Bug: T107377 Change-Id: Id6f5142062d73b5701126724e0fe8264105f7813 --- includes/resourceloader/ResourceLoader.php | 45 ++++++++++++---------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/includes/resourceloader/ResourceLoader.php b/includes/resourceloader/ResourceLoader.php index 4cec7ef0b8..e2d3990181 100644 --- a/includes/resourceloader/ResourceLoader.php +++ b/includes/resourceloader/ResourceLoader.php @@ -999,9 +999,13 @@ MESSAGE; // Generate output $isRaw = false; + + $filter = $context->getOnly() === 'styles' ? 'minify-css' : 'minify-js'; + foreach ( $modules as $name => $module ) { try { $content = $module->getModuleContent( $context ); + $strContent = ''; // Append output switch ( $context->getOnly() ) { @@ -1009,10 +1013,10 @@ MESSAGE; $scripts = $content['scripts']; if ( is_string( $scripts ) ) { // Load scripts raw... - $out .= $scripts; + $strContent = $scripts; } elseif ( is_array( $scripts ) ) { // ...except when $scripts is an array of URLs - $out .= self::makeLoaderImplementScript( $name, $scripts, array(), array(), array() ); + $strContent = self::makeLoaderImplementScript( $name, $scripts, array(), array(), array() ); } break; case 'styles': @@ -1020,10 +1024,10 @@ MESSAGE; // We no longer seperate into media, they are all combined now with // custom media type groups into @media .. {} sections as part of the css string. // Module returns either an empty array or a numerical array with css strings. - $out .= isset( $styles['css'] ) ? implode( '', $styles['css'] ) : ''; + $strContent = isset( $styles['css'] ) ? implode( '', $styles['css'] ) : ''; break; default: - $out .= self::makeLoaderImplementScript( + $strContent = self::makeLoaderImplementScript( $name, isset( $content['scripts'] ) ? $content['scripts'] : '', isset( $content['styles'] ) ? $content['styles'] : array(), @@ -1032,6 +1036,17 @@ MESSAGE; ); break; } + + if ( !$context->getDebug() ) { + // Don't cache private modules. This is especially important in the case + // of modules which change every time they are built, like the embedded + // user.tokens module (bug T84960). + $filterOptions = array( 'cache' => ( $module->getGroup() !== 'private' ) ); + $strContent = $this->filter( $filter, $strContent, $filterOptions ); + } + + $out .= $strContent; + } catch ( Exception $e ) { MWExceptionHandler::logException( $e ); $this->logger->warning( 'Generating module package failed: {exception}', array( @@ -1058,7 +1073,11 @@ MESSAGE; // Set the state of modules we didn't respond to with mw.loader.implement if ( count( $states ) ) { - $out .= self::makeLoaderStateScript( $states ); + $stateScript = self::makeLoaderStateScript( $states ); + if ( !$context->getDebug() ) { + $stateScript = $this->filter( 'minify-js', $stateScript ); + } + $out .= $stateScript; } } else { if ( count( $states ) ) { @@ -1067,22 +1086,6 @@ MESSAGE; } } - $enableFilterCache = true; - if ( count( $modules ) === 1 && reset( $modules ) instanceof ResourceLoaderUserTokensModule ) { - // If we're building the embedded user.tokens, don't cache (T84960) - $enableFilterCache = false; - } - - if ( !$context->getDebug() ) { - if ( $context->getOnly() === 'styles' ) { - $out = $this->filter( 'minify-css', $out ); - } else { - $out = $this->filter( 'minify-js', $out, array( - 'cache' => $enableFilterCache - ) ); - } - } - return $out; } -- 2.20.1