/** * 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(public htmlWebpackPlugin, public 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