StartupChunkDependenciesRuntimeModule.js
2.17 KB
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
67
68
69
70
71
72
73
74
75
76
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
"use strict";
const RuntimeGlobals = require("../RuntimeGlobals");
const RuntimeModule = require("../RuntimeModule");
const Template = require("../Template");
/** @typedef {import("../Chunk")} Chunk */
/** @typedef {import("../ChunkGraph")} ChunkGraph */
/** @typedef {import("../Compilation")} Compilation */
class StartupChunkDependenciesRuntimeModule extends RuntimeModule {
/**
* @param {boolean} asyncChunkLoading use async chunk loading
*/
constructor(asyncChunkLoading) {
super("startup chunk dependencies", RuntimeModule.STAGE_TRIGGER);
this.asyncChunkLoading = asyncChunkLoading;
}
/**
* @returns {string | null} runtime code
*/
generate() {
const chunkGraph = /** @type {ChunkGraph} */ (this.chunkGraph);
const chunk = /** @type {Chunk} */ (this.chunk);
const chunkIds = Array.from(
chunkGraph.getChunkEntryDependentChunksIterable(chunk)
).map(chunk => {
return chunk.id;
});
const compilation = /** @type {Compilation} */ (this.compilation);
const { runtimeTemplate } = compilation;
return Template.asString([
`var next = ${RuntimeGlobals.startup};`,
`${RuntimeGlobals.startup} = ${runtimeTemplate.basicFunction(
"",
!this.asyncChunkLoading
? chunkIds
.map(
id => `${RuntimeGlobals.ensureChunk}(${JSON.stringify(id)});`
)
.concat("return next();")
: chunkIds.length === 1
? `return ${RuntimeGlobals.ensureChunk}(${JSON.stringify(
chunkIds[0]
)}).then(next);`
: chunkIds.length > 2
? [
// using map is shorter for 3 or more chunks
`return Promise.all(${JSON.stringify(chunkIds)}.map(${
RuntimeGlobals.ensureChunk
}, ${RuntimeGlobals.require})).then(next);`
]
: [
// calling ensureChunk directly is shorter for 0 - 2 chunks
"return Promise.all([",
Template.indent(
chunkIds
.map(
id => `${RuntimeGlobals.ensureChunk}(${JSON.stringify(id)})`
)
.join(",\n")
),
"]).then(next);"
]
)};`
]);
}
}
module.exports = StartupChunkDependenciesRuntimeModule;