Skip to content

Commit 9caaa66

Browse files
committed
Refactor webpack main
1 parent 0d2faa0 commit 9caaa66

27 files changed

+266
-193
lines changed

lib/MultiCompiler.js

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

14+
/** @typedef {import("./Compiler")} Compiler */
15+
16+
const STATUS_PENDING = 0;
17+
const STATUS_DONE = 1;
18+
const STATUS_NEW = 2;
19+
1420
module.exports = class MultiCompiler {
21+
/**
22+
* @param {Compiler[]} compilers child compilers
23+
*/
1524
constructor(compilers) {
1625
this.hooks = Object.freeze({
1726
done: new SyncHook(["stats"]),
@@ -27,6 +36,8 @@ module.exports = class MultiCompiler {
2736
});
2837
}
2938
this.compilers = compilers;
39+
/** @type {WeakMap<Compiler, string[]>} */
40+
this.dependencies = new WeakMap();
3041
let doneCompilers = 0;
3142
let compilerStats = [];
3243
let index = 0;
@@ -90,6 +101,15 @@ module.exports = class MultiCompiler {
90101
}
91102
}
92103

104+
/**
105+
* @param {Compiler} compiler the child compiler
106+
* @param {string[]} dependencies its dependencies
107+
* @returns {void}
108+
*/
109+
setDependencies(compiler, dependencies) {
110+
this.dependencies.set(compiler, dependencies);
111+
}
112+
93113
validateDependencies(callback) {
94114
const edges = new Set();
95115
const missing = [];
@@ -108,8 +128,9 @@ module.exports = class MultiCompiler {
108128
);
109129
};
110130
for (const source of this.compilers) {
111-
if (source.dependencies) {
112-
for (const dep of source.dependencies) {
131+
const dependencies = this.dependencies.get(source);
132+
if (dependencies) {
133+
for (const dep of dependencies) {
113134
const target = this.compilers.find(c => c.name === dep);
114135
if (!target) {
115136
missing.push(dep);
@@ -160,8 +181,9 @@ module.exports = class MultiCompiler {
160181
let list = remainingCompilers;
161182
remainingCompilers = [];
162183
for (const c of list) {
184+
const dependencies = this.dependencies.get(c);
163185
const ready =
164-
!c.dependencies || c.dependencies.every(isDependencyFulfilled);
186+
!dependencies || dependencies.every(isDependencyFulfilled);
165187
if (ready) {
166188
readyCompilers.push(c);
167189
} else {
@@ -188,11 +210,14 @@ module.exports = class MultiCompiler {
188210
}
189211

190212
watch(watchOptions, handler) {
191-
if (this.running) return handler(new ConcurrentCompilationError());
213+
if (this.running) {
214+
return handler(new ConcurrentCompilationError());
215+
}
216+
217+
const watchings = [];
218+
const allStats = this.compilers.map(() => null);
219+
const compilerStatus = this.compilers.map(() => STATUS_PENDING);
192220

193-
let watchings = [];
194-
let allStats = this.compilers.map(() => null);
195-
let compilerStatus = this.compilers.map(() => false);
196221
if (this.validateDependencies(handler)) {
197222
this.running = true;
198223
this.runWithDependencies(
@@ -208,12 +233,12 @@ module.exports = class MultiCompiler {
208233
if (err) handler(err);
209234
if (stats) {
210235
allStats[compilerIdx] = stats;
211-
compilerStatus[compilerIdx] = "new";
212-
if (compilerStatus.every(Boolean)) {
236+
compilerStatus[compilerIdx] = STATUS_NEW;
237+
if (compilerStatus.every(status => status !== STATUS_PENDING)) {
213238
const freshStats = allStats.filter((s, idx) => {
214-
return compilerStatus[idx] === "new";
239+
return compilerStatus[idx] === STATUS_NEW;
215240
});
216-
compilerStatus.fill(true);
241+
compilerStatus.fill(STATUS_DONE);
217242
const multiStats = new MultiStats(freshStats);
218243
handler(null, multiStats);
219244
}

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

0 commit comments

Comments
 (0)