63 lines
1.9 KiB
JavaScript
63 lines
1.9 KiB
JavaScript
/**
|
|
* Copyright (c) 2015-present, Facebook, Inc.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
class InlineChunkHtmlPlugin {
|
|
constructor(htmlWebpackPlugin, tests) {
|
|
this.htmlWebpackPlugin = htmlWebpackPlugin;
|
|
this.tests = tests;
|
|
}
|
|
|
|
getInlinedTag(publicPath, assets, tag) {
|
|
if (tag.tagName !== 'script' || !(tag.attributes && tag.attributes.src)) {
|
|
return tag;
|
|
}
|
|
const scriptName = publicPath
|
|
? tag.attributes.src.replace(publicPath, '')
|
|
: tag.attributes.src;
|
|
if (!this.tests.some(test => scriptName.match(test))) {
|
|
return tag;
|
|
}
|
|
const asset = assets[scriptName];
|
|
if (asset == null) {
|
|
return tag;
|
|
}
|
|
return { tagName: 'script', innerHTML: asset.source(), closeTag: true };
|
|
}
|
|
|
|
apply(compiler) {
|
|
let publicPath = compiler.options.output.publicPath || '';
|
|
if (publicPath && !publicPath.endsWith('/')) {
|
|
publicPath += '/';
|
|
}
|
|
|
|
compiler.hooks.compilation.tap('InlineChunkHtmlPlugin', compilation => {
|
|
const tagFunction = tag =>
|
|
this.getInlinedTag(publicPath, compilation.assets, tag);
|
|
|
|
const hooks = this.htmlWebpackPlugin.getHooks(compilation);
|
|
hooks.alterAssetTagGroups.tap('InlineChunkHtmlPlugin', assets => {
|
|
assets.headTags = assets.headTags.map(tagFunction);
|
|
assets.bodyTags = assets.bodyTags.map(tagFunction);
|
|
});
|
|
|
|
// Still emit the runtime chunk for users who do not use our generated
|
|
// index.html file.
|
|
// hooks.afterEmit.tap('InlineChunkHtmlPlugin', () => {
|
|
// Object.keys(compilation.assets).forEach(assetName => {
|
|
// if (this.tests.some(test => assetName.match(test))) {
|
|
// delete compilation.assets[assetName];
|
|
// }
|
|
// });
|
|
// });
|
|
});
|
|
}
|
|
}
|
|
|
|
module.exports = InlineChunkHtmlPlugin;
|