78 lines
2.5 KiB
JavaScript
78 lines
2.5 KiB
JavaScript
|
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;
|