1 | 'use strict';
|
2 |
|
3 | var RawSource = require('webpack-core/lib/RawSource');
|
4 |
|
5 | function 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 | }
|
12 | module.exports = ChunkManifestPlugin;
|
13 |
|
14 | ChunkManifestPlugin.prototype.constructor = ChunkManifestPlugin;
|
15 | ChunkManifestPlugin.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 |
|
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 |
|
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 |