allow to disable some deprecations
add `experiments.backCompat: false` (default in `experiments.futureDefaults`) remove unused `experiments.asset` enable `experiments.topLevelAwait` and `experiments.asyncWebAssembly` by default in `experiments.futureDefaults`
This commit is contained in:
parent
95b101fc8e
commit
7afcc5d4ff
|
@ -2738,14 +2738,14 @@ export interface EntryStaticNormalized {
|
|||
* Enables/Disables experiments (experimental features with relax SemVer compatibility).
|
||||
*/
|
||||
export interface ExperimentsCommon {
|
||||
/**
|
||||
* Allow module type 'asset' to generate assets.
|
||||
*/
|
||||
asset?: boolean;
|
||||
/**
|
||||
* Support WebAssembly as asynchronous EcmaScript Module.
|
||||
*/
|
||||
asyncWebAssembly?: boolean;
|
||||
/**
|
||||
* Enable backward-compat layer with deprecation warnings for many webpack 4 APIs.
|
||||
*/
|
||||
backCompat?: boolean;
|
||||
/**
|
||||
* Enable additional in memory caching of modules that are unchanged and reference only unchanged modules.
|
||||
*/
|
||||
|
@ -2755,7 +2755,7 @@ export interface ExperimentsCommon {
|
|||
*/
|
||||
futureDefaults?: boolean;
|
||||
/**
|
||||
* Enable module and chunk layers.
|
||||
* Enable module layers.
|
||||
*/
|
||||
layers?: boolean;
|
||||
/**
|
||||
|
|
|
@ -63,8 +63,9 @@ let debugId = 1000;
|
|||
class Chunk {
|
||||
/**
|
||||
* @param {string=} name of chunk being created, is optional (for subclasses)
|
||||
* @param {boolean} backCompat enable backward-compatibility
|
||||
*/
|
||||
constructor(name) {
|
||||
constructor(name, backCompat = true) {
|
||||
/** @type {number | string | null} */
|
||||
this.id = null;
|
||||
/** @type {(number|string)[] | null} */
|
||||
|
@ -84,7 +85,7 @@ class Chunk {
|
|||
/** @type {RuntimeSpec} */
|
||||
this.runtime = undefined;
|
||||
/** @type {Set<string>} */
|
||||
this.files = new ChunkFilesSet();
|
||||
this.files = backCompat ? new ChunkFilesSet() : new Set();
|
||||
/** @type {Set<string>} */
|
||||
this.auxiliaryFiles = new Set();
|
||||
/** @type {boolean} */
|
||||
|
|
|
@ -429,6 +429,8 @@ class Compilation {
|
|||
* @param {CompilationParams} params the compilation parameters
|
||||
*/
|
||||
constructor(compiler, params) {
|
||||
this._backCompat = compiler._backCompat;
|
||||
|
||||
const getNormalModuleLoader = () => deprecatedNormalModuleLoaderHook(this);
|
||||
/** @typedef {{ additionalAssets?: true | Function }} ProcessAssetsAdditionalOptions */
|
||||
/** @type {AsyncSeriesHook<[CompilationAssets], ProcessAssetsAdditionalOptions>} */
|
||||
|
@ -559,6 +561,7 @@ class Compilation {
|
|||
* @returns {FakeHook<Pick<AsyncSeriesHook<T>, "tap" | "tapAsync" | "tapPromise" | "name">>} fake hook which redirects
|
||||
*/
|
||||
const createProcessAssetsHook = (name, stage, getArgs, code) => {
|
||||
if (!this._backCompat && code) return undefined;
|
||||
const errorMessage =
|
||||
reason => `Can't automatically convert plugin using Compilation.hooks.${name} to Compilation.hooks.processAssets because ${reason}.
|
||||
BREAKING CHANGE: Asset processing hooks in Compilation has been merged into a single Compilation.hooks.processAssets hook.`;
|
||||
|
@ -983,7 +986,6 @@ BREAKING CHANGE: Asset processing hooks in Compilation has been merged into a si
|
|||
this.asyncEntrypoints = [];
|
||||
/** @type {Set<Chunk>} */
|
||||
this.chunks = new Set();
|
||||
arrayToSetDeprecation(this.chunks, "Compilation.chunks");
|
||||
/** @type {ChunkGroup[]} */
|
||||
this.chunkGroups = [];
|
||||
/** @type {Map<string, ChunkGroup>} */
|
||||
|
@ -992,7 +994,10 @@ BREAKING CHANGE: Asset processing hooks in Compilation has been merged into a si
|
|||
this.namedChunks = new Map();
|
||||
/** @type {Set<Module>} */
|
||||
this.modules = new Set();
|
||||
arrayToSetDeprecation(this.modules, "Compilation.modules");
|
||||
if (this._backCompat) {
|
||||
arrayToSetDeprecation(this.chunks, "Compilation.chunks");
|
||||
arrayToSetDeprecation(this.modules, "Compilation.modules");
|
||||
}
|
||||
/** @private @type {Map<string, Module>} */
|
||||
this._modules = new Map();
|
||||
this.records = null;
|
||||
|
@ -1286,7 +1291,8 @@ BREAKING CHANGE: Asset processing hooks in Compilation has been merged into a si
|
|||
}
|
||||
this._modules.set(identifier, module);
|
||||
this.modules.add(module);
|
||||
ModuleGraph.setModuleGraphForModule(module, this.moduleGraph);
|
||||
if (this._backCompat)
|
||||
ModuleGraph.setModuleGraphForModule(module, this.moduleGraph);
|
||||
if (currentProfile !== undefined) {
|
||||
currentProfile.markIntegrationEnd();
|
||||
}
|
||||
|
@ -1701,7 +1707,8 @@ BREAKING CHANGE: Asset processing hooks in Compilation has been merged into a si
|
|||
|
||||
this._modules.set(module.identifier(), module);
|
||||
this.modules.add(module);
|
||||
ModuleGraph.setModuleGraphForModule(module, this.moduleGraph);
|
||||
if (this._backCompat)
|
||||
ModuleGraph.setModuleGraphForModule(module, this.moduleGraph);
|
||||
|
||||
this._handleModuleBuildAndDependencies(
|
||||
originModule,
|
||||
|
@ -2777,8 +2784,10 @@ BREAKING CHANGE: Asset processing hooks in Compilation has been merged into a si
|
|||
);
|
||||
this.chunkGraph = chunkGraph;
|
||||
|
||||
for (const module of this.modules) {
|
||||
ChunkGraph.setChunkGraphForModule(module, chunkGraph);
|
||||
if (this._backCompat) {
|
||||
for (const module of this.modules) {
|
||||
ChunkGraph.setChunkGraphForModule(module, chunkGraph);
|
||||
}
|
||||
}
|
||||
|
||||
this.hooks.seal.call();
|
||||
|
@ -3045,14 +3054,16 @@ Or do you want to use the entrypoints '${name}' and '${runtime}' independently o
|
|||
}
|
||||
this.hooks.afterProcessAssets.call(this.assets);
|
||||
this.logger.timeEnd("process assets");
|
||||
this.assets = soonFrozenObjectDeprecation(
|
||||
this.assets,
|
||||
"Compilation.assets",
|
||||
"DEP_WEBPACK_COMPILATION_ASSETS",
|
||||
`BREAKING CHANGE: No more changes should happen to Compilation.assets after sealing the Compilation.
|
||||
this.assets = this._backCompat
|
||||
? soonFrozenObjectDeprecation(
|
||||
this.assets,
|
||||
"Compilation.assets",
|
||||
"DEP_WEBPACK_COMPILATION_ASSETS",
|
||||
`BREAKING CHANGE: No more changes should happen to Compilation.assets after sealing the Compilation.
|
||||
Do changes to assets earlier, e. g. in Compilation.hooks.processAssets.
|
||||
Make sure to select an appropriate stage from Compilation.PROCESS_ASSETS_STAGE_*.`
|
||||
);
|
||||
)
|
||||
: Object.freeze(this.assets);
|
||||
|
||||
this.summarizeDependencies();
|
||||
if (shouldRecord) {
|
||||
|
@ -3453,7 +3464,8 @@ Or do you want to use the entrypoints '${name}' and '${runtime}' independently o
|
|||
*/
|
||||
addRuntimeModule(chunk, module, chunkGraph = this.chunkGraph) {
|
||||
// Deprecated ModuleGraph association
|
||||
ModuleGraph.setModuleGraphForModule(module, this.moduleGraph);
|
||||
if (this._backCompat)
|
||||
ModuleGraph.setModuleGraphForModule(module, this.moduleGraph);
|
||||
|
||||
// add it to the list
|
||||
this.modules.add(module);
|
||||
|
@ -3589,9 +3601,10 @@ Or do you want to use the entrypoints '${name}' and '${runtime}' independently o
|
|||
return chunk;
|
||||
}
|
||||
}
|
||||
const chunk = new Chunk(name);
|
||||
const chunk = new Chunk(name, this._backCompat);
|
||||
this.chunks.add(chunk);
|
||||
ChunkGraph.setChunkGraphForChunk(chunk, this.chunkGraph);
|
||||
if (this._backCompat)
|
||||
ChunkGraph.setChunkGraphForChunk(chunk, this.chunkGraph);
|
||||
if (name) {
|
||||
this.namedChunks.set(name, chunk);
|
||||
}
|
||||
|
@ -4715,7 +4728,7 @@ This prevents using hashes of each other and should be avoided.`);
|
|||
this.outputOptions;
|
||||
const runtimeTemplate = this.runtimeTemplate;
|
||||
|
||||
const chunk = new Chunk("build time chunk");
|
||||
const chunk = new Chunk("build time chunk", this._backCompat);
|
||||
chunk.id = chunk.name;
|
||||
chunk.ids = [chunk.id];
|
||||
chunk.runtime = runtime;
|
||||
|
|
|
@ -119,8 +119,9 @@ const includesHash = (filename, hashes) => {
|
|||
class Compiler {
|
||||
/**
|
||||
* @param {string} context the compilation path
|
||||
* @param {WebpackOptions} options options
|
||||
*/
|
||||
constructor(context) {
|
||||
constructor(context, options = /** @type {WebpackOptions} */ ({})) {
|
||||
this.hooks = Object.freeze({
|
||||
/** @type {SyncHook<[]>} */
|
||||
initialize: new SyncHook([]),
|
||||
|
@ -240,8 +241,7 @@ class Compiler {
|
|||
|
||||
this.infrastructureLogger = undefined;
|
||||
|
||||
/** @type {WebpackOptions} */
|
||||
this.options = /** @type {WebpackOptions} */ ({});
|
||||
this.options = options;
|
||||
|
||||
this.context = context;
|
||||
|
||||
|
@ -263,6 +263,8 @@ class Compiler {
|
|||
/** @type {boolean} */
|
||||
this.watchMode = false;
|
||||
|
||||
this._backCompat = this.options.experiments.backCompat !== false;
|
||||
|
||||
/** @type {Compilation} */
|
||||
this._lastCompilation = undefined;
|
||||
/** @type {NormalModuleFactory} */
|
||||
|
@ -963,7 +965,13 @@ ${other}`);
|
|||
outputOptions,
|
||||
plugins
|
||||
) {
|
||||
const childCompiler = new Compiler(this.context);
|
||||
const childCompiler = new Compiler(this.context, {
|
||||
...this.options,
|
||||
output: {
|
||||
...this.options.output,
|
||||
...outputOptions
|
||||
}
|
||||
});
|
||||
childCompiler.name = compilerName;
|
||||
childCompiler.outputPath = this.outputPath;
|
||||
childCompiler.inputFileSystem = this.inputFileSystem;
|
||||
|
@ -976,6 +984,7 @@ ${other}`);
|
|||
childCompiler.fsStartTime = this.fsStartTime;
|
||||
childCompiler.cache = this.cache;
|
||||
childCompiler.compilerPath = `${this.compilerPath}${compilerName}|${compilerIndex}|`;
|
||||
childCompiler._backCompat = this._backCompat;
|
||||
|
||||
const relativeCompilerName = makePathsRelative(
|
||||
this.context,
|
||||
|
@ -991,13 +1000,6 @@ ${other}`);
|
|||
this.records[relativeCompilerName].push((childCompiler.records = {}));
|
||||
}
|
||||
|
||||
childCompiler.options = {
|
||||
...this.options,
|
||||
output: {
|
||||
...this.options.output,
|
||||
...outputOptions
|
||||
}
|
||||
};
|
||||
childCompiler.parentCompilation = compilation;
|
||||
childCompiler.root = this.root;
|
||||
if (Array.isArray(plugins)) {
|
||||
|
|
|
@ -83,6 +83,7 @@ class HotModuleReplacementPlugin {
|
|||
* @returns {void}
|
||||
*/
|
||||
apply(compiler) {
|
||||
const { _backCompat: backCompat } = compiler;
|
||||
if (compiler.options.output.strictModuleErrorHandling === undefined)
|
||||
compiler.options.output.strictModuleErrorHandling = true;
|
||||
const runtimeRequirements = [RuntimeGlobals.module];
|
||||
|
@ -597,7 +598,8 @@ class HotModuleReplacementPlugin {
|
|||
(newRuntimeModules && newRuntimeModules.length > 0)
|
||||
) {
|
||||
const hotUpdateChunk = new HotUpdateChunk();
|
||||
ChunkGraph.setChunkGraphForChunk(hotUpdateChunk, chunkGraph);
|
||||
if (backCompat)
|
||||
ChunkGraph.setChunkGraphForChunk(hotUpdateChunk, chunkGraph);
|
||||
hotUpdateChunk.id = chunkId;
|
||||
hotUpdateChunk.runtime = newRuntime;
|
||||
if (currentChunk) {
|
||||
|
|
|
@ -265,15 +265,15 @@ const applyWebpackOptionsDefaults = options => {
|
|||
* @returns {void}
|
||||
*/
|
||||
const applyExperimentsDefaults = (experiments, { production, development }) => {
|
||||
D(experiments, "topLevelAwait", false);
|
||||
D(experiments, "futureDefaults", false);
|
||||
D(experiments, "backCompat", !experiments.futureDefaults);
|
||||
D(experiments, "topLevelAwait", experiments.futureDefaults);
|
||||
D(experiments, "syncWebAssembly", false);
|
||||
D(experiments, "asyncWebAssembly", false);
|
||||
D(experiments, "asyncWebAssembly", experiments.futureDefaults);
|
||||
D(experiments, "outputModule", false);
|
||||
D(experiments, "asset", false);
|
||||
D(experiments, "layers", false);
|
||||
D(experiments, "lazyCompilation", undefined);
|
||||
D(experiments, "buildHttp", undefined);
|
||||
D(experiments, "futureDefaults", false);
|
||||
D(experiments, "cacheUnaffected", experiments.futureDefaults);
|
||||
|
||||
if (typeof experiments.buildHttp === "object") {
|
||||
|
|
|
@ -56,6 +56,7 @@ class ModuleConcatenationPlugin {
|
|||
* @returns {void}
|
||||
*/
|
||||
apply(compiler) {
|
||||
const { _backCompat: backCompat } = compiler;
|
||||
compiler.hooks.compilation.tap("ModuleConcatenationPlugin", compilation => {
|
||||
const moduleGraph = compilation.moduleGraph;
|
||||
const bailoutReasonMap = new Map();
|
||||
|
@ -389,8 +390,10 @@ class ModuleConcatenationPlugin {
|
|||
};
|
||||
|
||||
const integrate = () => {
|
||||
ChunkGraph.setChunkGraphForModule(newModule, chunkGraph);
|
||||
ModuleGraph.setModuleGraphForModule(newModule, moduleGraph);
|
||||
if (backCompat) {
|
||||
ChunkGraph.setChunkGraphForModule(newModule, chunkGraph);
|
||||
ModuleGraph.setModuleGraphForModule(newModule, moduleGraph);
|
||||
}
|
||||
|
||||
for (const warning of concatConfiguration.getWarningsSorted()) {
|
||||
moduleGraph
|
||||
|
|
|
@ -165,8 +165,16 @@ exports.arrayToSetDeprecation = (set, name) => {
|
|||
};
|
||||
|
||||
exports.createArrayToSetDeprecationSet = name => {
|
||||
class SetDeprecatedArray extends Set {}
|
||||
exports.arrayToSetDeprecation(SetDeprecatedArray.prototype, name);
|
||||
let initialized = false;
|
||||
class SetDeprecatedArray extends Set {
|
||||
constructor(items) {
|
||||
super(items);
|
||||
if (!initialized) {
|
||||
initialized = true;
|
||||
exports.arrayToSetDeprecation(SetDeprecatedArray.prototype, name);
|
||||
}
|
||||
}
|
||||
}
|
||||
return SetDeprecatedArray;
|
||||
};
|
||||
|
||||
|
|
|
@ -61,8 +61,7 @@ const createMultiCompiler = (childOptions, options) => {
|
|||
const createCompiler = rawOptions => {
|
||||
const options = getNormalizedWebpackOptions(rawOptions);
|
||||
applyWebpackOptionsBaseDefaults(options);
|
||||
const compiler = new Compiler(options.context);
|
||||
compiler.options = options;
|
||||
const compiler = new Compiler(options.context, options);
|
||||
new NodeEnvironmentPlugin({
|
||||
infrastructureLogging: options.infrastructureLogging
|
||||
}).apply(compiler);
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -681,14 +681,14 @@
|
|||
"implements": ["#/definitions/ExperimentsCommon"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"asset": {
|
||||
"description": "Allow module type 'asset' to generate assets.",
|
||||
"type": "boolean"
|
||||
},
|
||||
"asyncWebAssembly": {
|
||||
"description": "Support WebAssembly as asynchronous EcmaScript Module.",
|
||||
"type": "boolean"
|
||||
},
|
||||
"backCompat": {
|
||||
"description": "Enable backward-compat layer with deprecation warnings for many webpack 4 APIs.",
|
||||
"type": "boolean"
|
||||
},
|
||||
"buildHttp": {
|
||||
"description": "Build http(s): urls using a lockfile and resource content cache.",
|
||||
"anyOf": [
|
||||
|
@ -709,7 +709,7 @@
|
|||
"type": "boolean"
|
||||
},
|
||||
"layers": {
|
||||
"description": "Enable module and chunk layers.",
|
||||
"description": "Enable module layers.",
|
||||
"type": "boolean"
|
||||
},
|
||||
"lazyCompilation": {
|
||||
|
@ -742,14 +742,14 @@
|
|||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"asset": {
|
||||
"description": "Allow module type 'asset' to generate assets.",
|
||||
"type": "boolean"
|
||||
},
|
||||
"asyncWebAssembly": {
|
||||
"description": "Support WebAssembly as asynchronous EcmaScript Module.",
|
||||
"type": "boolean"
|
||||
},
|
||||
"backCompat": {
|
||||
"description": "Enable backward-compat layer with deprecation warnings for many webpack 4 APIs.",
|
||||
"type": "boolean"
|
||||
},
|
||||
"cacheUnaffected": {
|
||||
"description": "Enable additional in memory caching of modules that are unchanged and reference only unchanged modules.",
|
||||
"type": "boolean"
|
||||
|
@ -759,7 +759,7 @@
|
|||
"type": "boolean"
|
||||
},
|
||||
"layers": {
|
||||
"description": "Enable module and chunk layers.",
|
||||
"description": "Enable module layers.",
|
||||
"type": "boolean"
|
||||
},
|
||||
"outputModule": {
|
||||
|
@ -782,14 +782,14 @@
|
|||
"implements": ["#/definitions/ExperimentsCommon"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"asset": {
|
||||
"description": "Allow module type 'asset' to generate assets.",
|
||||
"type": "boolean"
|
||||
},
|
||||
"asyncWebAssembly": {
|
||||
"description": "Support WebAssembly as asynchronous EcmaScript Module.",
|
||||
"type": "boolean"
|
||||
},
|
||||
"backCompat": {
|
||||
"description": "Enable backward-compat layer with deprecation warnings for many webpack 4 APIs.",
|
||||
"type": "boolean"
|
||||
},
|
||||
"buildHttp": {
|
||||
"description": "Build http(s): urls using a lockfile and resource content cache.",
|
||||
"oneOf": [
|
||||
|
@ -807,7 +807,7 @@
|
|||
"type": "boolean"
|
||||
},
|
||||
"layers": {
|
||||
"description": "Enable module and chunk layers.",
|
||||
"description": "Enable module layers.",
|
||||
"type": "boolean"
|
||||
},
|
||||
"lazyCompilation": {
|
||||
|
|
|
@ -185,6 +185,7 @@ const describeCases = config => {
|
|||
experiments: {
|
||||
asyncWebAssembly: true,
|
||||
topLevelAwait: true,
|
||||
backCompat: false,
|
||||
...(config.module ? { outputModule: true } : {})
|
||||
}
|
||||
};
|
||||
|
|
|
@ -691,7 +691,7 @@ declare interface CallbackWebpack<T> {
|
|||
}
|
||||
type Cell<T> = undefined | T;
|
||||
declare class Chunk {
|
||||
constructor(name?: string);
|
||||
constructor(name?: string, backCompat?: boolean);
|
||||
id: null | string | number;
|
||||
ids: null | (string | number)[];
|
||||
debugId: number;
|
||||
|
@ -1857,7 +1857,7 @@ declare interface CompilationParams {
|
|||
contextModuleFactory: ContextModuleFactory;
|
||||
}
|
||||
declare class Compiler {
|
||||
constructor(context: string);
|
||||
constructor(context: string, options?: WebpackOptionsNormalized);
|
||||
hooks: Readonly<{
|
||||
initialize: SyncHook<[]>;
|
||||
shouldEmit: SyncBailHook<[Compilation], boolean>;
|
||||
|
@ -3303,16 +3303,16 @@ type Experiments = ExperimentsCommon & ExperimentsExtra;
|
|||
* Enables/Disables experiments (experimental features with relax SemVer compatibility).
|
||||
*/
|
||||
declare interface ExperimentsCommon {
|
||||
/**
|
||||
* Allow module type 'asset' to generate assets.
|
||||
*/
|
||||
asset?: boolean;
|
||||
|
||||
/**
|
||||
* Support WebAssembly as asynchronous EcmaScript Module.
|
||||
*/
|
||||
asyncWebAssembly?: boolean;
|
||||
|
||||
/**
|
||||
* Enable backward-compat layer with deprecation warnings for many webpack 4 APIs.
|
||||
*/
|
||||
backCompat?: boolean;
|
||||
|
||||
/**
|
||||
* Enable additional in memory caching of modules that are unchanged and reference only unchanged modules.
|
||||
*/
|
||||
|
@ -3324,7 +3324,7 @@ declare interface ExperimentsCommon {
|
|||
futureDefaults?: boolean;
|
||||
|
||||
/**
|
||||
* Enable module and chunk layers.
|
||||
* Enable module layers.
|
||||
*/
|
||||
layers?: boolean;
|
||||
|
||||
|
|
Loading…
Reference in New Issue