mirror of https://github.com/webpack/webpack.git
				
				
				
			
		
			
				
	
	
		
			78 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
| /*
 | |
| 	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;
 |