1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- /**
- * 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;
|