You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
1.9 KiB
62 lines
1.9 KiB
/** |
|
* 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;
|
|
|