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