UNPKG

3.03 kBJavaScriptView Raw
1'use strict';
2
3var RawSource = require('webpack-core/lib/RawSource');
4
5function ChunkManifestPlugin(options) {
6 options = options || {};
7 this.manifestFilename = options.filename || 'manifest.json';
8 this.manifestVariable = options.manifestVariable || 'webpackManifest';
9 this.inlineManifest = options.inlineManifest || false;
10 this.extraOption = options.extra || {};
11}
12module.exports = ChunkManifestPlugin;
13
14ChunkManifestPlugin.prototype.constructor = ChunkManifestPlugin;
15ChunkManifestPlugin.prototype.apply = function (compiler) {
16 var manifestFilename = this.manifestFilename;
17 var manifestVariable = this.manifestVariable;
18 var inlineManifest = this.inlineManifest;
19 var oldChunkFilename;
20 var chunkManifest;
21 var extraOption = this.extraOption;
22 compiler.plugin('this-compilation', function (compilation) {
23 var mainTemplate = compilation.mainTemplate;
24 mainTemplate.plugin('require-ensure', function (_, chunk, hash) {
25 var filename = this.outputOptions.chunkFilename || this.outputOptions.filename;
26 var initialJS = {};
27 if (filename) {
28 chunkManifest = [chunk].reduce(function registerChunk(manifest, c) {
29 if (c.id in manifest) {
30 return manifest;
31 }
32 var hasRuntime = typeof c.hasRuntime === 'function' ? c.hasRuntime() : c.entry;
33
34 if (hasRuntime && !c.isInitial()) {
35 //c.isInital issue existing plugin
36 manifest[c.id] = undefined;
37 } else {
38 var filePath = mainTemplate.applyPluginsWaterfall('asset-path', filename, {
39 hash: hash,
40 chunk: c
41 });
42 if (c.isInitial()) {
43 initialJS[c.name || c.id] = filePath;
44 }
45 manifest[c.id] = filePath;
46 }
47 return c.chunks.reduce(registerChunk, manifest);
48 }, {});
49 oldChunkFilename = this.outputOptions.chunkFilename;
50 this.outputOptions.chunkFilename = '__CHUNK_MANIFEST__';
51 // mark as asset for emitting
52 compilation.assets[manifestFilename] = new RawSource(JSON.stringify(Object.assign(extraOption, {
53 manifestVariable: manifestVariable,
54 manifest: chunkManifest,
55 initialJS: initialJS
56 })));
57 chunk.files.push(manifestFilename);
58 }
59
60 return _;
61 });
62 });
63
64 compiler.plugin('compilation', function (compilation) {
65 compilation.mainTemplate.plugin('require-ensure', function (_, chunk, hash, chunkIdVar) {
66 if (oldChunkFilename) {
67 this.outputOptions.chunkFilename = oldChunkFilename;
68 }
69
70 return _.replace('"__CHUNK_MANIFEST__"', 'window["' + manifestVariable + '"][' + chunkIdVar + ']');
71 });
72
73 if (inlineManifest) {
74 compilation.plugin('html-webpack-plugin-before-html-generation', function (data, callback) {
75 var manifestHtml = '<script>window.' + manifestVariable + '=' + JSON.stringify(chunkManifest) + '</script>';
76 callback(null, data.assets[manifestVariable] = manifestHtml);
77 });
78 }
79 });
80};
\No newline at end of file