Skip to content

Commit 6913e3b

Browse files
authored
Merge pull request webpack#8482 from webpack/refactor/webpack_main
Refactor webpack main
2 parents 0d2faa0 + 3d72d61 commit 6913e3b

27 files changed

+269
-193
lines changed

lib/MultiCompiler.js

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,18 @@ const ConcurrentCompilationError = require("./ConcurrentCompilationError");
1111
const MultiStats = require("./MultiStats");
1212
const MultiWatching = require("./MultiWatching");
1313

14+
/** @typedef {import("./Compiler")} Compiler */
15+
16+
/** @typedef {number} CompilerStatus */
17+
18+
const STATUS_PENDING = 0;
19+
const STATUS_DONE = 1;
20+
const STATUS_NEW = 2;
21+
1422
module.exports = class MultiCompiler {
23+
/**
24+
* @param {Compiler[]} compilers child compilers
25+
*/
1526
constructor(compilers) {
1627
this.hooks = Object.freeze({
1728
done: new SyncHook(["stats"]),
@@ -27,6 +38,8 @@ module.exports = class MultiCompiler {
2738
});
2839
}
2940
this.compilers = compilers;
41+
/** @type {WeakMap<Compiler, string[]>} */
42+
this.dependencies = new WeakMap();
3043
let doneCompilers = 0;
3144
let compilerStats = [];
3245
let index = 0;
@@ -90,6 +103,15 @@ module.exports = class MultiCompiler {
90103
}
91104
}
92105

106+
/**
107+
* @param {Compiler} compiler the child compiler
108+
* @param {string[]} dependencies its dependencies
109+
* @returns {void}
110+
*/
111+
setDependencies(compiler, dependencies) {
112+
this.dependencies.set(compiler, dependencies);
113+
}
114+
93115
validateDependencies(callback) {
94116
const edges = new Set();
95117
const missing = [];
@@ -108,8 +130,9 @@ module.exports = class MultiCompiler {
108130
);
109131
};
110132
for (const source of this.compilers) {
111-
if (source.dependencies) {
112-
for (const dep of source.dependencies) {
133+
const dependencies = this.dependencies.get(source);
134+
if (dependencies) {
135+
for (const dep of dependencies) {
113136
const target = this.compilers.find(c => c.name === dep);
114137
if (!target) {
115138
missing.push(dep);
@@ -160,8 +183,9 @@ module.exports = class MultiCompiler {
160183
let list = remainingCompilers;
161184
remainingCompilers = [];
162185
for (const c of list) {
186+
const dependencies = this.dependencies.get(c);
163187
const ready =
164-
!c.dependencies || c.dependencies.every(isDependencyFulfilled);
188+
!dependencies || dependencies.every(isDependencyFulfilled);
165189
if (ready) {
166190
readyCompilers.push(c);
167191
} else {
@@ -188,11 +212,16 @@ module.exports = class MultiCompiler {
188212
}
189213

190214
watch(watchOptions, handler) {
191-
if (this.running) return handler(new ConcurrentCompilationError());
215+
if (this.running) {
216+
return handler(new ConcurrentCompilationError());
217+
}
218+
219+
const watchings = [];
220+
const allStats = this.compilers.map(() => null);
221+
222+
/** @type {CompilerStatus[]} */
223+
const compilerStatus = this.compilers.map(() => STATUS_PENDING);
192224

193-
let watchings = [];
194-
let allStats = this.compilers.map(() => null);
195-
let compilerStatus = this.compilers.map(() => false);
196225
if (this.validateDependencies(handler)) {
197226
this.running = true;
198227
this.runWithDependencies(
@@ -208,12 +237,12 @@ module.exports = class MultiCompiler {
208237
if (err) handler(err);
209238
if (stats) {
210239
allStats[compilerIdx] = stats;
211-
compilerStatus[compilerIdx] = "new";
212-
if (compilerStatus.every(Boolean)) {
240+
compilerStatus[compilerIdx] = STATUS_NEW;
241+
if (compilerStatus.every(status => status !== STATUS_PENDING)) {
213242
const freshStats = allStats.filter((s, idx) => {
214-
return compilerStatus[idx] === "new";
243+
return compilerStatus[idx] === STATUS_NEW;
215244
});
216-
compilerStatus.fill(true);
245+
compilerStatus.fill(STATUS_DONE);
217246
const multiStats = new MultiStats(freshStats);
218247
handler(null, multiStats);
219248
}

lib/WebpackOptionsApply.js

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,6 @@ class WebpackOptionsApply extends OptionsApply {
9393
compiler.recordsOutputPath =
9494
options.recordsOutputPath || options.recordsPath;
9595
compiler.name = options.name;
96-
// TODO webpack 5 refactor this to MultiCompiler.setDependencies() with a WeakMap
97-
// @ts-ignore TODO
98-
compiler.dependencies = options.dependencies;
9996
if (typeof options.target === "string") {
10097
let JsonpTemplatePlugin;
10198
let FetchCompileWasmPlugin;

lib/index.js

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
/*
2+
MIT License http://www.opensource.org/licenses/mit-license.php
3+
Author Tobias Koppers @sokra
4+
*/
5+
6+
"use strict";
7+
8+
const util = require("util");
9+
const { version } = require("../package.json");
10+
const webpackOptionsSchema = require("../schemas/WebpackOptions.json");
11+
const Compiler = require("./Compiler");
12+
const MultiCompiler = require("./MultiCompiler");
13+
const WebpackOptionsApply = require("./WebpackOptionsApply");
14+
const WebpackOptionsDefaulter = require("./WebpackOptionsDefaulter");
15+
const WebpackOptionsValidationError = require("./WebpackOptionsValidationError");
16+
const validateSchema = require("./validateSchema");
17+
const webpack = require("./webpack");
18+
19+
exports = module.exports = webpack;
20+
exports.WebpackOptionsApply = WebpackOptionsApply;
21+
exports.WebpackOptionsDefaulter = WebpackOptionsDefaulter;
22+
exports.WebpackOptionsValidationError = WebpackOptionsValidationError;
23+
exports.Compiler = Compiler;
24+
exports.MultiCompiler = MultiCompiler;
25+
exports.validate = validateSchema.bind(null, webpackOptionsSchema);
26+
exports.validateSchema = validateSchema;
27+
exports.version = version;
28+
29+
const exportPlugins = (obj, mappings) => {
30+
for (const name of Object.keys(mappings)) {
31+
Object.defineProperty(obj, name, {
32+
configurable: false,
33+
enumerable: true,
34+
get: mappings[name]
35+
});
36+
}
37+
};
38+
39+
exportPlugins(exports, {
40+
AutomaticPrefetchPlugin: () => require("./AutomaticPrefetchPlugin"),
41+
BannerPlugin: () => require("./BannerPlugin"),
42+
ContextExclusionPlugin: () => require("./ContextExclusionPlugin"),
43+
ContextReplacementPlugin: () => require("./ContextReplacementPlugin"),
44+
DefinePlugin: () => require("./DefinePlugin"),
45+
Dependency: () => require("./Dependency"),
46+
DllPlugin: () => require("./DllPlugin"),
47+
DllReferencePlugin: () => require("./DllReferencePlugin"),
48+
EntryPlugin: () => require("./EntryPlugin"),
49+
EnvironmentPlugin: () => require("./EnvironmentPlugin"),
50+
EvalDevToolModulePlugin: () => require("./EvalDevToolModulePlugin"),
51+
EvalSourceMapDevToolPlugin: () => require("./EvalSourceMapDevToolPlugin"),
52+
ExternalsPlugin: () => require("./ExternalsPlugin"),
53+
HotModuleReplacementPlugin: () => require("./HotModuleReplacementPlugin"),
54+
IgnorePlugin: () => require("./IgnorePlugin"),
55+
LibraryTemplatePlugin: () => require("./LibraryTemplatePlugin"),
56+
LoaderOptionsPlugin: () => require("./LoaderOptionsPlugin"),
57+
LoaderTargetPlugin: () => require("./LoaderTargetPlugin"),
58+
MemoryOutputFileSystem: () => require("./MemoryOutputFileSystem"),
59+
Module: () => require("./Module"),
60+
ModuleFilenameHelpers: () => require("./ModuleFilenameHelpers"),
61+
NoEmitOnErrorsPlugin: () => require("./NoEmitOnErrorsPlugin"),
62+
NormalModuleReplacementPlugin: () =>
63+
require("./NormalModuleReplacementPlugin"),
64+
PrefetchPlugin: () => require("./PrefetchPlugin"),
65+
ProgressPlugin: () => require("./ProgressPlugin"),
66+
ProvidePlugin: () => require("./ProvidePlugin"),
67+
SingleEntryPlugin: util.deprecate(
68+
() => require("./EntryPlugin"),
69+
"SingleEntryPlugin was renamed to EntryPlugin"
70+
),
71+
SetVarMainTemplatePlugin: () => require("./SetVarMainTemplatePlugin"),
72+
SourceMapDevToolPlugin: () => require("./SourceMapDevToolPlugin"),
73+
Stats: () => require("./Stats"),
74+
Template: () => require("./Template"),
75+
UmdMainTemplatePlugin: () => require("./UmdMainTemplatePlugin"),
76+
WatchIgnorePlugin: () => require("./WatchIgnorePlugin")
77+
});
78+
79+
exportPlugins((exports.cache = {}), {
80+
MemoryCachePlugin: () => require("./cache/MemoryCachePlugin")
81+
});
82+
83+
exportPlugins((exports.dependencies = {}), {
84+
DependencyReference: () => require("./dependencies/DependencyReference")
85+
});
86+
87+
exportPlugins((exports.ids = {}), {
88+
ChunkModuleIdRangePlugin: () => require("./ids/ChunkModuleIdRangePlugin"),
89+
NaturalModuleIdsPlugin: () => require("./ids/NaturalModuleIdsPlugin"),
90+
OccurrenceModuleIdsPlugin: () => require("./ids/OccurrenceModuleIdsPlugin"),
91+
NamedModuleIdsPlugin: () => require("./ids/NamedModuleIdsPlugin"),
92+
DeterministicModuleIdsPlugin: () =>
93+
require("./ids/DeterministicModuleIdsPlugin"),
94+
NamedChunkIdsPlugin: () => require("./ids/NamedChunkIdsPlugin"),
95+
OccurrenceChunkIdsPlugin: () => require("./ids/OccurrenceChunkIdsPlugin"),
96+
HashedModuleIdsPlugin: () => require("./ids/HashedModuleIdsPlugin")
97+
});
98+
99+
exportPlugins((exports.optimize = {}), {
100+
AggressiveMergingPlugin: () => require("./optimize/AggressiveMergingPlugin"),
101+
AggressiveSplittingPlugin: util.deprecate(
102+
() => require("./optimize/AggressiveSplittingPlugin"),
103+
"AggressiveSplittingPlugin is deprecated in favor of SplitChunksPlugin"
104+
),
105+
LimitChunkCountPlugin: () => require("./optimize/LimitChunkCountPlugin"),
106+
MinChunkSizePlugin: () => require("./optimize/MinChunkSizePlugin"),
107+
ModuleConcatenationPlugin: () =>
108+
require("./optimize/ModuleConcatenationPlugin"),
109+
RuntimeChunkPlugin: () => require("./optimize/RuntimeChunkPlugin"),
110+
SideEffectsFlagPlugin: () => require("./optimize/SideEffectsFlagPlugin"),
111+
SplitChunksPlugin: () => require("./optimize/SplitChunksPlugin")
112+
});
113+
114+
exportPlugins((exports.web = {}), {
115+
FetchCompileWasmPlugin: () => require("./web/FetchCompileWasmPlugin"),
116+
JsonpTemplatePlugin: () => require("./web/JsonpTemplatePlugin")
117+
});
118+
119+
exportPlugins((exports.webworker = {}), {
120+
WebWorkerTemplatePlugin: () => require("./webworker/WebWorkerTemplatePlugin")
121+
});
122+
123+
exportPlugins((exports.node = {}), {
124+
NodeEnvironmentPlugin: () => require("./node/NodeEnvironmentPlugin"),
125+
NodeTemplatePlugin: () => require("./node/NodeTemplatePlugin"),
126+
ReadFileCompileWasmPlugin: () => require("./node/ReadFileCompileWasmPlugin")
127+
});
128+
129+
exportPlugins((exports.debug = {}), {
130+
ProfilingPlugin: () => require("./debug/ProfilingPlugin")
131+
});
132+
133+
exportPlugins((exports.util = {}), {
134+
createHash: () => require("./util/createHash"),
135+
comparators: () => require("./util/comparators")
136+
});

0 commit comments

Comments
 (0)