| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- const pluginName = 'AsyncChunkSrcVersionParameterPlugin';
- /**
- * Inspired by: https://github.com/webpack/webpack/issues/8115#issuecomment-663902035.
- *
- * This plugin modifies the webpack bootstrap code generated by the plugin at
- * webpack/lib/web/JsonpMainTemplatePlugin.js and the CSS chunk loading code generated
- * by @automattic/mini-css-extract-plugin-with-rtl.
- *
- * It will rename the function jsonpScriptSrc generated by that to webpackJsonpScriptSrc
- * and install a new version that checks a user provided variable containing a script
- * version parameter to specify in async chunk URLs.
- *
- * The jsonpScriptSrc override is only for webpack 4 (tested with 4.43 and 4.44).
- *
- * Webpack 5 has official support for this https://github.com/webpack/webpack/pull/8462
- * so it won't be necessary.
- *
- * It will also append the ?ver parameter to CSS chunk hrefs loaded by @automattic/mini-css-extract-plugin-with-rtl.
- */
- class AsyncChunkSrcVersionParameterPlugin {
- _applyMainTemplate( mainTemplate ) {
- // Append script version to all async JS chunks loaded with jsonpScriptSrc().
- mainTemplate.hooks.localVars.tap(
- // Use stage 1 to ensure this executes after webpack/lib/web/JsonpMainTemplatePlugin.js.
- { name: pluginName, stage: 1 },
- ( source ) => {
- if ( source.includes( 'function jsonpScriptSrc' ) ) {
- const modSource = source.replace(
- 'function jsonpScriptSrc',
- 'function webpackJsonpScriptSrc'
- );
- return `${ modSource }
- function jsonpScriptSrc(chunkId) {
- var src = webpackJsonpScriptSrc(chunkId);
- if ( window.wcAdminAssets && window.wcAdminAssets.version ) {
- src += '?ver=' + window.wcAdminAssets.version;
- }
- return src;
- }
- `;
- }
- return source;
- }
- );
- // Append script version to all async CSS chunks loaded by @automattic/mini-css-extract-plugin-with-rtl.
- mainTemplate.hooks.requireEnsure.tap(
- // Use stage 1 to ensure this executes after @automattic/mini-css-extract-plugin-with-rtl.
- { name: pluginName, stage: 1 },
- ( source ) => {
- if (
- source.includes( '// mini-css-extract-plugin CSS loading' )
- ) {
- return source.replace(
- 'linkTag.href = fullhref;',
- `linkTag.href = fullhref;
- if ( window.wcAdminAssets && window.wcAdminAssets.version ) {
- linkTag.href += '?ver=' + window.wcAdminAssets.version;
- }`
- );
- }
- return source;
- }
- );
- }
- apply( compiler ) {
- compiler.hooks.thisCompilation.tap( pluginName, ( compilation ) => {
- this._applyMainTemplate( compilation.mainTemplate );
- } );
- }
- }
- module.exports = AsyncChunkSrcVersionParameterPlugin;
|