mirror of https://github.com/webpack/webpack.git
				
				
				
			add entry[x].runtime option to allow runtime chunk per entry
This commit is contained in:
		
							parent
							
								
									034cd23209
								
							
						
					
					
						commit
						b3466e996b
					
				| 
						 | 
				
			
			@ -100,6 +100,10 @@ export type LibraryType =
 | 
			
		|||
 * If `output.libraryTarget` is set to umd and `output.library` is set, setting this to true will name the AMD module.
 | 
			
		||||
 */
 | 
			
		||||
export type UmdNamedDefine = boolean;
 | 
			
		||||
/**
 | 
			
		||||
 * The name of the runtime chunk. If set a runtime chunk with this name is created or an existing entrypoint is used as runtime.
 | 
			
		||||
 */
 | 
			
		||||
export type EntryRuntime = string;
 | 
			
		||||
/**
 | 
			
		||||
 * An entry point without name.
 | 
			
		||||
 */
 | 
			
		||||
| 
						 | 
				
			
			@ -798,6 +802,10 @@ export interface EntryDescription {
 | 
			
		|||
	 * Options for library.
 | 
			
		||||
	 */
 | 
			
		||||
	library?: LibraryOptions;
 | 
			
		||||
	/**
 | 
			
		||||
	 * The name of the runtime chunk. If set a runtime chunk with this name is created or an existing entrypoint is used as runtime.
 | 
			
		||||
	 */
 | 
			
		||||
	runtime?: EntryRuntime;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * Options for library.
 | 
			
		||||
| 
						 | 
				
			
			@ -2008,6 +2016,10 @@ export interface EntryDescriptionNormalized {
 | 
			
		|||
	 * Options for library.
 | 
			
		||||
	 */
 | 
			
		||||
	library?: LibraryOptions;
 | 
			
		||||
	/**
 | 
			
		||||
	 * The name of the runtime chunk. If set a runtime chunk with this name is created or an existing entrypoint is used as runtime.
 | 
			
		||||
	 */
 | 
			
		||||
	runtime?: EntryRuntime;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * Multiple entry bundles are created. The key is the entry name. The value is an entry description object.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1743,7 +1743,10 @@ BREAKING CHANGE: Asset processing hooks in Compilation has been merged into a si
 | 
			
		|||
				chunk.filenameTemplate = options.filename;
 | 
			
		||||
			}
 | 
			
		||||
			const entrypoint = new Entrypoint(name);
 | 
			
		||||
			if (!options.dependOn) entrypoint.setRuntimeChunk(chunk);
 | 
			
		||||
			if (!options.dependOn && !options.runtime) {
 | 
			
		||||
				entrypoint.setRuntimeChunk(chunk);
 | 
			
		||||
			}
 | 
			
		||||
			entrypoint.setEntrypointChunk(chunk);
 | 
			
		||||
			this.namedChunkGroups.set(name, entrypoint);
 | 
			
		||||
			this.entrypoints.set(name, entrypoint);
 | 
			
		||||
			this.chunkGroups.push(entrypoint);
 | 
			
		||||
| 
						 | 
				
			
			@ -1788,7 +1791,7 @@ BREAKING CHANGE: Asset processing hooks in Compilation has been merged into a si
 | 
			
		|||
		for (const [
 | 
			
		||||
			name,
 | 
			
		||||
			{
 | 
			
		||||
				options: { dependOn }
 | 
			
		||||
				options: { dependOn, runtime }
 | 
			
		||||
			}
 | 
			
		||||
		] of this.entries) {
 | 
			
		||||
			if (dependOn) {
 | 
			
		||||
| 
						 | 
				
			
			@ -1802,6 +1805,13 @@ BREAKING CHANGE: Asset processing hooks in Compilation has been merged into a si
 | 
			
		|||
					}
 | 
			
		||||
					connectChunkGroupParentAndChild(dependency, entry);
 | 
			
		||||
				}
 | 
			
		||||
			} else if (runtime) {
 | 
			
		||||
				const entry = this.entrypoints.get(name);
 | 
			
		||||
				const chunk = this.addChunk(runtime);
 | 
			
		||||
				chunk.preventIntegration = true;
 | 
			
		||||
				entry.unshiftChunk(chunk);
 | 
			
		||||
				chunk.addGroup(entry);
 | 
			
		||||
				entry.setRuntimeChunk(chunk);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		buildChunkGraph(this, chunkGraphInit);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -23,7 +23,9 @@ class Entrypoint extends ChunkGroup {
 | 
			
		|||
	constructor(name) {
 | 
			
		||||
		super(name);
 | 
			
		||||
		/** @type {Chunk=} */
 | 
			
		||||
		this.runtimeChunk = undefined;
 | 
			
		||||
		this._runtimeChunk = undefined;
 | 
			
		||||
		/** @type {Chunk=} */
 | 
			
		||||
		this._entrypointChunk = undefined;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
| 
						 | 
				
			
			@ -40,7 +42,7 @@ class Entrypoint extends ChunkGroup {
 | 
			
		|||
	 * @returns {void}
 | 
			
		||||
	 */
 | 
			
		||||
	setRuntimeChunk(chunk) {
 | 
			
		||||
		this.runtimeChunk = chunk;
 | 
			
		||||
		this._runtimeChunk = chunk;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
| 
						 | 
				
			
			@ -48,20 +50,39 @@ class Entrypoint extends ChunkGroup {
 | 
			
		|||
	 * @returns {Chunk | null} returns the runtime chunk or null if there is none
 | 
			
		||||
	 */
 | 
			
		||||
	getRuntimeChunk() {
 | 
			
		||||
		if (this.runtimeChunk) return this.runtimeChunk;
 | 
			
		||||
		if (this._runtimeChunk) return this._runtimeChunk;
 | 
			
		||||
		for (const parent of this.parentsIterable) {
 | 
			
		||||
			if (parent instanceof Entrypoint) return parent.getRuntimeChunk();
 | 
			
		||||
		}
 | 
			
		||||
		return null;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Sets the chunk with the entrypoint modules for an entrypoint.
 | 
			
		||||
	 * @param {Chunk} chunk the chunk being set as the entrypoint chunk.
 | 
			
		||||
	 * @returns {void}
 | 
			
		||||
	 */
 | 
			
		||||
	setEntrypointChunk(chunk) {
 | 
			
		||||
		this._entrypointChunk = chunk;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Returns the chunk which contains the entrypoint modules
 | 
			
		||||
	 * (or at least the execution of them)
 | 
			
		||||
	 * @returns {Chunk} chunk
 | 
			
		||||
	 */
 | 
			
		||||
	getEntrypointChunk() {
 | 
			
		||||
		return this._entrypointChunk;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @param {Chunk} oldChunk chunk to be replaced
 | 
			
		||||
	 * @param {Chunk} newChunk New chunk that will be replaced with
 | 
			
		||||
	 * @returns {boolean} returns true if the replacement was successful
 | 
			
		||||
	 */
 | 
			
		||||
	replaceChunk(oldChunk, newChunk) {
 | 
			
		||||
		if (this.runtimeChunk === oldChunk) this.runtimeChunk = newChunk;
 | 
			
		||||
		if (this._runtimeChunk === oldChunk) this._runtimeChunk = newChunk;
 | 
			
		||||
		if (this._entrypointChunk === oldChunk) this._entrypointChunk = newChunk;
 | 
			
		||||
		return super.replaceChunk(oldChunk, newChunk);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -208,7 +208,7 @@ const visitModules = (
 | 
			
		|||
		} else {
 | 
			
		||||
			// The application may start here: We start with an empty list of available modules
 | 
			
		||||
			chunkGroupInfo.minAvailableModules = EMPTY_SET;
 | 
			
		||||
			const chunk = chunkGroup.chunks[0];
 | 
			
		||||
			const chunk = chunkGroup.getEntrypointChunk();
 | 
			
		||||
			for (const module of modules) {
 | 
			
		||||
				queue.push({
 | 
			
		||||
					action: ADD_AND_ENTER_MODULE,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,8 +5,6 @@
 | 
			
		|||
 | 
			
		||||
"use strict";
 | 
			
		||||
 | 
			
		||||
const { STAGE_ADVANCED } = require("../OptimizationStages");
 | 
			
		||||
 | 
			
		||||
/** @typedef {import("../Compiler")} Compiler */
 | 
			
		||||
 | 
			
		||||
class RuntimeChunkPlugin {
 | 
			
		||||
| 
						 | 
				
			
			@ -24,34 +22,17 @@ class RuntimeChunkPlugin {
 | 
			
		|||
	 */
 | 
			
		||||
	apply(compiler) {
 | 
			
		||||
		compiler.hooks.thisCompilation.tap("RuntimeChunkPlugin", compilation => {
 | 
			
		||||
			compilation.hooks.optimizeChunks.tap(
 | 
			
		||||
				{
 | 
			
		||||
					name: "RuntimeChunkPlugin",
 | 
			
		||||
					stage: STAGE_ADVANCED
 | 
			
		||||
				},
 | 
			
		||||
				() => {
 | 
			
		||||
					const chunkGraph = compilation.chunkGraph;
 | 
			
		||||
					for (const entrypoint of compilation.entrypoints.values()) {
 | 
			
		||||
						const chunk = entrypoint.getRuntimeChunk();
 | 
			
		||||
						// Only insert a runtime chunk when the current runtime chunk is part of the entrypoint
 | 
			
		||||
						if (!entrypoint.chunks.includes(chunk)) continue;
 | 
			
		||||
			compilation.hooks.addEntry.tap(
 | 
			
		||||
				"RuntimeChunkPlugin",
 | 
			
		||||
				(_, { name: entryName }) => {
 | 
			
		||||
					const data = compilation.entries.get(entryName);
 | 
			
		||||
					if (data.options.runtime === undefined && !data.options.dependOn) {
 | 
			
		||||
						// Determine runtime chunk name
 | 
			
		||||
						let name = this.options.name;
 | 
			
		||||
						if (typeof name === "function") {
 | 
			
		||||
							name = name(entrypoint);
 | 
			
		||||
						}
 | 
			
		||||
						// Avoid adding runtime chunk twice
 | 
			
		||||
						if (
 | 
			
		||||
							chunkGraph.getNumberOfChunkModules(chunk) > 0 ||
 | 
			
		||||
							!chunk.preventIntegration ||
 | 
			
		||||
							chunk.name !== name
 | 
			
		||||
						) {
 | 
			
		||||
							const newChunk = compilation.addChunk(name);
 | 
			
		||||
							newChunk.preventIntegration = true;
 | 
			
		||||
							entrypoint.unshiftChunk(newChunk);
 | 
			
		||||
							newChunk.addGroup(entrypoint);
 | 
			
		||||
							entrypoint.setRuntimeChunk(newChunk);
 | 
			
		||||
							name = name({ name: entryName });
 | 
			
		||||
						}
 | 
			
		||||
						data.options.runtime = name;
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -217,6 +217,9 @@
 | 
			
		|||
        },
 | 
			
		||||
        "library": {
 | 
			
		||||
          "$ref": "#/definitions/LibraryOptions"
 | 
			
		||||
        },
 | 
			
		||||
        "runtime": {
 | 
			
		||||
          "$ref": "#/definitions/EntryRuntime"
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      "required": ["import"]
 | 
			
		||||
| 
						 | 
				
			
			@ -253,6 +256,9 @@
 | 
			
		|||
        },
 | 
			
		||||
        "library": {
 | 
			
		||||
          "$ref": "#/definitions/LibraryOptions"
 | 
			
		||||
        },
 | 
			
		||||
        "runtime": {
 | 
			
		||||
          "$ref": "#/definitions/EntryRuntime"
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -313,6 +319,11 @@
 | 
			
		|||
        ]
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "EntryRuntime": {
 | 
			
		||||
      "description": "The name of the runtime chunk. If set a runtime chunk with this name is created or an existing entrypoint is used as runtime.",
 | 
			
		||||
      "type": "string",
 | 
			
		||||
      "minLength": 1
 | 
			
		||||
    },
 | 
			
		||||
    "EntryStatic": {
 | 
			
		||||
      "description": "A static entry description.",
 | 
			
		||||
      "anyOf": [
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -935,7 +935,7 @@ declare class Compilation {
 | 
			
		|||
				Dependency,
 | 
			
		||||
				{ name: string } & Pick<
 | 
			
		||||
					EntryDescriptionNormalized,
 | 
			
		||||
					"filename" | "dependOn" | "library"
 | 
			
		||||
					"filename" | "dependOn" | "library" | "runtime"
 | 
			
		||||
				>
 | 
			
		||||
			],
 | 
			
		||||
			void
 | 
			
		||||
| 
						 | 
				
			
			@ -945,7 +945,7 @@ declare class Compilation {
 | 
			
		|||
				Dependency,
 | 
			
		||||
				{ name: string } & Pick<
 | 
			
		||||
					EntryDescriptionNormalized,
 | 
			
		||||
					"filename" | "dependOn" | "library"
 | 
			
		||||
					"filename" | "dependOn" | "library" | "runtime"
 | 
			
		||||
				>,
 | 
			
		||||
				Error
 | 
			
		||||
			],
 | 
			
		||||
| 
						 | 
				
			
			@ -956,7 +956,7 @@ declare class Compilation {
 | 
			
		|||
				Dependency,
 | 
			
		||||
				{ name: string } & Pick<
 | 
			
		||||
					EntryDescriptionNormalized,
 | 
			
		||||
					"filename" | "dependOn" | "library"
 | 
			
		||||
					"filename" | "dependOn" | "library" | "runtime"
 | 
			
		||||
				>,
 | 
			
		||||
				Module
 | 
			
		||||
			],
 | 
			
		||||
| 
						 | 
				
			
			@ -1185,7 +1185,7 @@ declare class Compilation {
 | 
			
		|||
			| string
 | 
			
		||||
			| ({ name: string } & Pick<
 | 
			
		||||
					EntryDescriptionNormalized,
 | 
			
		||||
					"filename" | "dependOn" | "library"
 | 
			
		||||
					"filename" | "dependOn" | "library" | "runtime"
 | 
			
		||||
			  >),
 | 
			
		||||
		callback: (err?: WebpackError, result?: Module) => void
 | 
			
		||||
	): void;
 | 
			
		||||
| 
						 | 
				
			
			@ -1194,7 +1194,7 @@ declare class Compilation {
 | 
			
		|||
		dependency: Dependency,
 | 
			
		||||
		options: { name: string } & Pick<
 | 
			
		||||
			EntryDescriptionNormalized,
 | 
			
		||||
			"filename" | "dependOn" | "library"
 | 
			
		||||
			"filename" | "dependOn" | "library" | "runtime"
 | 
			
		||||
		>,
 | 
			
		||||
		callback: (err?: WebpackError, result?: Module) => void
 | 
			
		||||
	): void;
 | 
			
		||||
| 
						 | 
				
			
			@ -2244,7 +2244,7 @@ declare interface EntryData {
 | 
			
		|||
	 */
 | 
			
		||||
	options: { name: string } & Pick<
 | 
			
		||||
		EntryDescriptionNormalized,
 | 
			
		||||
		"filename" | "dependOn" | "library"
 | 
			
		||||
		"filename" | "dependOn" | "library" | "runtime"
 | 
			
		||||
	>;
 | 
			
		||||
}
 | 
			
		||||
declare abstract class EntryDependency extends ModuleDependency {}
 | 
			
		||||
| 
						 | 
				
			
			@ -2272,6 +2272,11 @@ declare interface EntryDescription {
 | 
			
		|||
	 * Options for library.
 | 
			
		||||
	 */
 | 
			
		||||
	library?: LibraryOptions;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * The name of the runtime chunk. If set a runtime chunk with this name is created or an existing entrypoint is used as runtime.
 | 
			
		||||
	 */
 | 
			
		||||
	runtime?: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
| 
						 | 
				
			
			@ -2297,6 +2302,11 @@ declare interface EntryDescriptionNormalized {
 | 
			
		|||
	 * Options for library.
 | 
			
		||||
	 */
 | 
			
		||||
	library?: LibraryOptions;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * The name of the runtime chunk. If set a runtime chunk with this name is created or an existing entrypoint is used as runtime.
 | 
			
		||||
	 */
 | 
			
		||||
	runtime?: string;
 | 
			
		||||
}
 | 
			
		||||
type EntryItem = string | [string, ...string[]];
 | 
			
		||||
type EntryNormalized =
 | 
			
		||||
| 
						 | 
				
			
			@ -2321,7 +2331,7 @@ declare class EntryPlugin {
 | 
			
		|||
			| string
 | 
			
		||||
			| ({ name: string } & Pick<
 | 
			
		||||
					EntryDescriptionNormalized,
 | 
			
		||||
					"filename" | "dependOn" | "library"
 | 
			
		||||
					"filename" | "dependOn" | "library" | "runtime"
 | 
			
		||||
			  >)
 | 
			
		||||
	);
 | 
			
		||||
	context: string;
 | 
			
		||||
| 
						 | 
				
			
			@ -2330,7 +2340,7 @@ declare class EntryPlugin {
 | 
			
		|||
		| string
 | 
			
		||||
		| ({ name: string } & Pick<
 | 
			
		||||
				EntryDescriptionNormalized,
 | 
			
		||||
				"filename" | "dependOn" | "library"
 | 
			
		||||
				"filename" | "dependOn" | "library" | "runtime"
 | 
			
		||||
		  >);
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
| 
						 | 
				
			
			@ -2343,7 +2353,7 @@ declare class EntryPlugin {
 | 
			
		|||
			| string
 | 
			
		||||
			| ({ name: string } & Pick<
 | 
			
		||||
					EntryDescriptionNormalized,
 | 
			
		||||
					"filename" | "dependOn" | "library"
 | 
			
		||||
					"filename" | "dependOn" | "library" | "runtime"
 | 
			
		||||
			  >)
 | 
			
		||||
	): EntryDependency;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -2356,8 +2366,6 @@ declare interface EntryStaticNormalized {
 | 
			
		|||
	[index: string]: EntryDescriptionNormalized;
 | 
			
		||||
}
 | 
			
		||||
declare abstract class Entrypoint extends ChunkGroup {
 | 
			
		||||
	runtimeChunk: Chunk;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Sets the runtimeChunk for an entrypoint.
 | 
			
		||||
	 */
 | 
			
		||||
| 
						 | 
				
			
			@ -2367,6 +2375,17 @@ declare abstract class Entrypoint extends ChunkGroup {
 | 
			
		|||
	 * Fetches the chunk reference containing the webpack bootstrap code
 | 
			
		||||
	 */
 | 
			
		||||
	getRuntimeChunk(): Chunk;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Sets the chunk with the entrypoint modules for an entrypoint.
 | 
			
		||||
	 */
 | 
			
		||||
	setEntrypointChunk(chunk: Chunk): void;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Returns the chunk which contains the entrypoint modules
 | 
			
		||||
	 * (or at least the execution of them)
 | 
			
		||||
	 */
 | 
			
		||||
	getEntrypointChunk(): Chunk;
 | 
			
		||||
}
 | 
			
		||||
declare class EnvironmentPlugin {
 | 
			
		||||
	constructor(...keys: any[]);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue