summaryrefslogtreecommitdiff
path: root/node_modules/webpack/lib/runtime/StartupChunkDependenciesRuntimeModule.js
blob: da2ec7548ebf4da4d8a28640df97ce9937d5ed8d (plain)
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
/*
	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 => 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;