-
Notifications
You must be signed in to change notification settings - Fork 73
/
ChunkManifestPlugin.js
66 lines (58 loc) · 2.49 KB
/
ChunkManifestPlugin.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
var RawSource = require("webpack-core/lib/RawSource");
function ChunkManifestPlugin(options) {
options = options || {};
this.manifestFilename = options.filename || "manifest.json";
this.manifestVariable = options.manifestVariable || "webpackManifest";
this.inlineManifest = options.inlineManifest || false;
}
module.exports = ChunkManifestPlugin;
ChunkManifestPlugin.prototype.constructor = ChunkManifestPlugin;
ChunkManifestPlugin.prototype.apply = function(compiler) {
var manifestFilename = this.manifestFilename;
var manifestVariable = this.manifestVariable;
var inlineManifest = this.inlineManifest;
var oldChunkFilename;
var chunkManifest;
compiler.plugin("this-compilation", function(compilation) {
var mainTemplate = compilation.mainTemplate;
mainTemplate.plugin("require-ensure", function(_, chunk, hash) {
var filename = this.outputOptions.chunkFilename || this.outputOptions.filename;
if (filename) {
chunkManifest = [chunk].reduce(function registerChunk(manifest, c) {
if(c.id in manifest) return manifest;
var hasRuntime = typeof c.hasRuntime === 'function' ? c.hasRuntime() : c.entry;
if(hasRuntime) {
manifest[c.id] = undefined;
} else {
manifest[c.id] = mainTemplate.applyPluginsWaterfall("asset-path", filename, {
hash: hash,
chunk: c
});
}
return c.chunks.reduce(registerChunk, manifest);
}, {});
oldChunkFilename = this.outputOptions.chunkFilename;
this.outputOptions.chunkFilename = "__CHUNK_MANIFEST__";
// mark as asset for emitting
compilation.assets[manifestFilename] = new RawSource(JSON.stringify(chunkManifest));
chunk.files.push(manifestFilename);
}
return _;
});
});
compiler.plugin("compilation", function(compilation) {
compilation.mainTemplate.plugin("require-ensure", function(_, chunk, hash, chunkIdVar) {
if (oldChunkFilename) {
this.outputOptions.chunkFilename = oldChunkFilename;
}
return _.replace("\"__CHUNK_MANIFEST__\"",
"window[\"" + manifestVariable + "\"][" + chunkIdVar + "]");
});
if (inlineManifest){
compilation.plugin("html-webpack-plugin-before-html-generation", function (data, callback) {
var manifestHtml = "<script>window." + manifestVariable + "=" + JSON.stringify(chunkManifest) + "</script>";
callback(null, data.assets[manifestVariable] = manifestHtml);
});
}
});
};