webpack 5.77.0 → 5.78.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of webpack might be problematic. Click here for more details.
- package/bin/webpack.js +0 -0
- package/lib/APIPlugin.js +25 -18
- package/lib/CompatibilityPlugin.js +53 -52
- package/lib/ConstPlugin.js +22 -15
- package/lib/ContextModule.js +3 -2
- package/lib/DefinePlugin.js +44 -36
- package/lib/DelegatedModule.js +2 -1
- package/lib/DllModule.js +2 -1
- package/lib/ErrorHelpers.js +61 -22
- package/lib/ExportsInfoApiPlugin.js +16 -9
- package/lib/ExternalModule.js +2 -1
- package/lib/FlagAllModulesAsUsedPlugin.js +22 -27
- package/lib/FlagDependencyExportsPlugin.js +336 -348
- package/lib/FlagDependencyUsagePlugin.js +6 -8
- package/lib/FlagEntryExportAsUsedPlugin.js +22 -23
- package/lib/HotModuleReplacementPlugin.js +50 -45
- package/lib/JavascriptMetaInfoPlugin.js +16 -9
- package/lib/ModuleTypeConstants.js +50 -0
- package/lib/NodeStuffPlugin.js +35 -31
- package/lib/NormalModule.js +2 -1
- package/lib/NormalModuleFactory.js +7 -1
- package/lib/ProvidePlugin.js +17 -10
- package/lib/RawModule.js +2 -1
- package/lib/RequireJsStuffPlugin.js +15 -15
- package/lib/UseStrictPlugin.js +15 -8
- package/lib/WebpackIsIncludedPlugin.js +16 -9
- package/lib/config/defaults.js +16 -8
- package/lib/config/normalization.js +4 -0
- package/lib/container/ContainerEntryModule.js +2 -1
- package/lib/css/CssParser.js +22 -2
- package/lib/debug/ProfilingPlugin.js +20 -12
- package/lib/dependencies/AMDPlugin.js +26 -20
- package/lib/dependencies/CommonJsImportsParserPlugin.js +5 -4
- package/lib/dependencies/CommonJsPlugin.js +29 -25
- package/lib/dependencies/HarmonyDetectionParserPlugin.js +3 -1
- package/lib/dependencies/HarmonyModulesPlugin.js +11 -5
- package/lib/dependencies/ImportMetaContextPlugin.js +11 -5
- package/lib/dependencies/ImportMetaPlugin.js +26 -20
- package/lib/dependencies/ImportPlugin.js +14 -7
- package/lib/dependencies/RequireContextPlugin.js +12 -6
- package/lib/dependencies/RequireEnsurePlugin.js +13 -7
- package/lib/dependencies/RequireIncludePlugin.js +11 -5
- package/lib/dependencies/SystemPlugin.js +21 -15
- package/lib/dependencies/URLPlugin.js +15 -9
- package/lib/dependencies/WorkerPlugin.js +14 -8
- package/lib/javascript/JavascriptModulesPlugin.js +157 -164
- package/lib/json/JsonModulesPlugin.js +13 -5
- package/lib/library/AmdLibraryPlugin.js +22 -6
- package/lib/node/ReadFileCompileAsyncWasmPlugin.js +2 -1
- package/lib/node/ReadFileCompileWasmPlugin.js +2 -1
- package/lib/optimize/ConcatenatedModule.js +2 -1
- package/lib/optimize/InnerGraphPlugin.js +47 -46
- package/lib/optimize/SideEffectsFlagPlugin.js +43 -43
- package/lib/sharing/ConsumeSharedPlugin.js +4 -0
- package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +9 -6
- package/lib/wasm-sync/WebAssemblyModulesPlugin.js +42 -43
- package/lib/web/FetchCompileAsyncWasmPlugin.js +2 -1
- package/lib/web/FetchCompileWasmPlugin.js +40 -40
- package/package.json +1 -1
- package/schemas/WebpackOptions.check.js +1 -1
- package/schemas/WebpackOptions.json +18 -0
- package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
- package/schemas/plugins/container/ContainerPlugin.json +8 -0
- package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
- package/schemas/plugins/container/ModuleFederationPlugin.json +8 -0
- package/types.d.ts +10 -0
@@ -16,6 +16,9 @@ const Queue = require("./util/Queue");
|
|
16
16
|
/** @typedef {import("./ExportsInfo")} ExportsInfo */
|
17
17
|
/** @typedef {import("./Module")} Module */
|
18
18
|
|
19
|
+
const PLUGIN_NAME = "FlagDependencyExportsPlugin";
|
20
|
+
const PLUGIN_LOGGER_NAME = `webpack.${PLUGIN_NAME}`;
|
21
|
+
|
19
22
|
class FlagDependencyExportsPlugin {
|
20
23
|
/**
|
21
24
|
* Apply the plugin
|
@@ -23,394 +26,379 @@ class FlagDependencyExportsPlugin {
|
|
23
26
|
* @returns {void}
|
24
27
|
*/
|
25
28
|
apply(compiler) {
|
26
|
-
compiler.hooks.compilation.tap(
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
(module
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
// It's a module without declared exports
|
58
|
-
statNoExports++;
|
59
|
-
exportsInfo.setHasProvideInfo();
|
60
|
-
exportsInfo.setUnknownExportsProvided();
|
61
|
-
return callback();
|
62
|
-
}
|
63
|
-
}
|
64
|
-
if (typeof module.buildInfo.hash !== "string") {
|
65
|
-
statFlaggedUncached++;
|
66
|
-
// Enqueue uncacheable module for determining the exports
|
67
|
-
queue.enqueue(module);
|
29
|
+
compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
|
30
|
+
const moduleGraph = compilation.moduleGraph;
|
31
|
+
const cache = compilation.getCache(PLUGIN_NAME);
|
32
|
+
compilation.hooks.finishModules.tapAsync(
|
33
|
+
PLUGIN_NAME,
|
34
|
+
(modules, callback) => {
|
35
|
+
const logger = compilation.getLogger(PLUGIN_LOGGER_NAME);
|
36
|
+
let statRestoredFromMemCache = 0;
|
37
|
+
let statRestoredFromCache = 0;
|
38
|
+
let statNoExports = 0;
|
39
|
+
let statFlaggedUncached = 0;
|
40
|
+
let statNotCached = 0;
|
41
|
+
let statQueueItemsProcessed = 0;
|
42
|
+
|
43
|
+
const { moduleMemCaches } = compilation;
|
44
|
+
|
45
|
+
/** @type {Queue<Module>} */
|
46
|
+
const queue = new Queue();
|
47
|
+
|
48
|
+
// Step 1: Try to restore cached provided export info from cache
|
49
|
+
logger.time("restore cached provided exports");
|
50
|
+
asyncLib.each(
|
51
|
+
modules,
|
52
|
+
(module, callback) => {
|
53
|
+
const exportsInfo = moduleGraph.getExportsInfo(module);
|
54
|
+
// If the module doesn't have an exportsType, it's a module
|
55
|
+
// without declared exports.
|
56
|
+
if (!module.buildMeta || !module.buildMeta.exportsType) {
|
57
|
+
if (exportsInfo.otherExportsInfo.provided !== null) {
|
58
|
+
// It's a module without declared exports
|
59
|
+
statNoExports++;
|
68
60
|
exportsInfo.setHasProvideInfo();
|
61
|
+
exportsInfo.setUnknownExportsProvided();
|
69
62
|
return callback();
|
70
63
|
}
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
64
|
+
}
|
65
|
+
// If the module has no hash, it's uncacheable
|
66
|
+
if (typeof module.buildInfo.hash !== "string") {
|
67
|
+
statFlaggedUncached++;
|
68
|
+
// Enqueue uncacheable module for determining the exports
|
69
|
+
queue.enqueue(module);
|
70
|
+
exportsInfo.setHasProvideInfo();
|
71
|
+
return callback();
|
72
|
+
}
|
73
|
+
const memCache = moduleMemCaches && moduleMemCaches.get(module);
|
74
|
+
const memCacheValue = memCache && memCache.get(this);
|
75
|
+
if (memCacheValue !== undefined) {
|
76
|
+
statRestoredFromMemCache++;
|
77
|
+
exportsInfo.restoreProvided(memCacheValue);
|
78
|
+
return callback();
|
79
|
+
}
|
80
|
+
cache.get(
|
81
|
+
module.identifier(),
|
82
|
+
module.buildInfo.hash,
|
83
|
+
(err, result) => {
|
84
|
+
if (err) return callback(err);
|
85
|
+
|
86
|
+
if (result !== undefined) {
|
87
|
+
statRestoredFromCache++;
|
88
|
+
exportsInfo.restoreProvided(result);
|
89
|
+
} else {
|
90
|
+
statNotCached++;
|
91
|
+
// Without cached info enqueue module for determining the exports
|
92
|
+
queue.enqueue(module);
|
93
|
+
exportsInfo.setHasProvideInfo();
|
94
94
|
}
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
95
|
+
callback();
|
96
|
+
}
|
97
|
+
);
|
98
|
+
},
|
99
|
+
err => {
|
100
|
+
logger.timeEnd("restore cached provided exports");
|
101
|
+
if (err) return callback(err);
|
100
102
|
|
101
|
-
|
102
|
-
|
103
|
+
/** @type {Set<Module>} */
|
104
|
+
const modulesToStore = new Set();
|
103
105
|
|
104
|
-
|
105
|
-
|
106
|
+
/** @type {Map<Module, Set<Module>>} */
|
107
|
+
const dependencies = new Map();
|
106
108
|
|
107
|
-
|
108
|
-
|
109
|
+
/** @type {Module} */
|
110
|
+
let module;
|
109
111
|
|
110
|
-
|
111
|
-
|
112
|
+
/** @type {ExportsInfo} */
|
113
|
+
let exportsInfo;
|
112
114
|
|
113
|
-
|
114
|
-
|
115
|
+
/** @type {Map<Dependency, ExportsSpec>} */
|
116
|
+
const exportsSpecsFromDependencies = new Map();
|
115
117
|
|
116
|
-
|
117
|
-
|
118
|
+
let cacheable = true;
|
119
|
+
let changed = false;
|
118
120
|
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
121
|
+
/**
|
122
|
+
* @param {DependenciesBlock} depBlock the dependencies block
|
123
|
+
* @returns {void}
|
124
|
+
*/
|
125
|
+
const processDependenciesBlock = depBlock => {
|
126
|
+
for (const dep of depBlock.dependencies) {
|
127
|
+
processDependency(dep);
|
128
|
+
}
|
129
|
+
for (const block of depBlock.blocks) {
|
130
|
+
processDependenciesBlock(block);
|
131
|
+
}
|
132
|
+
};
|
133
|
+
|
134
|
+
/**
|
135
|
+
* @param {Dependency} dep the dependency
|
136
|
+
* @returns {void}
|
137
|
+
*/
|
138
|
+
const processDependency = dep => {
|
139
|
+
const exportDesc = dep.getExports(moduleGraph);
|
140
|
+
if (!exportDesc) return;
|
141
|
+
exportsSpecsFromDependencies.set(dep, exportDesc);
|
142
|
+
};
|
143
|
+
|
144
|
+
/**
|
145
|
+
* @param {Dependency} dep dependency
|
146
|
+
* @param {ExportsSpec} exportDesc info
|
147
|
+
* @returns {void}
|
148
|
+
*/
|
149
|
+
const processExportsSpec = (dep, exportDesc) => {
|
150
|
+
const exports = exportDesc.exports;
|
151
|
+
const globalCanMangle = exportDesc.canMangle;
|
152
|
+
const globalFrom = exportDesc.from;
|
153
|
+
const globalPriority = exportDesc.priority;
|
154
|
+
const globalTerminalBinding =
|
155
|
+
exportDesc.terminalBinding || false;
|
156
|
+
const exportDeps = exportDesc.dependencies;
|
157
|
+
if (exportDesc.hideExports) {
|
158
|
+
for (const name of exportDesc.hideExports) {
|
159
|
+
const exportInfo = exportsInfo.getExportInfo(name);
|
160
|
+
exportInfo.unsetTarget(dep);
|
126
161
|
}
|
127
|
-
|
128
|
-
|
162
|
+
}
|
163
|
+
if (exports === true) {
|
164
|
+
// unknown exports
|
165
|
+
if (
|
166
|
+
exportsInfo.setUnknownExportsProvided(
|
167
|
+
globalCanMangle,
|
168
|
+
exportDesc.excludeExports,
|
169
|
+
globalFrom && dep,
|
170
|
+
globalFrom,
|
171
|
+
globalPriority
|
172
|
+
)
|
173
|
+
) {
|
174
|
+
changed = true;
|
129
175
|
}
|
130
|
-
}
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
176
|
+
} else if (Array.isArray(exports)) {
|
177
|
+
/**
|
178
|
+
* merge in new exports
|
179
|
+
* @param {ExportsInfo} exportsInfo own exports info
|
180
|
+
* @param {(ExportSpec | string)[]} exports list of exports
|
181
|
+
*/
|
182
|
+
const mergeExports = (exportsInfo, exports) => {
|
183
|
+
for (const exportNameOrSpec of exports) {
|
184
|
+
let name;
|
185
|
+
let canMangle = globalCanMangle;
|
186
|
+
let terminalBinding = globalTerminalBinding;
|
187
|
+
let exports = undefined;
|
188
|
+
let from = globalFrom;
|
189
|
+
let fromExport = undefined;
|
190
|
+
let priority = globalPriority;
|
191
|
+
let hidden = false;
|
192
|
+
if (typeof exportNameOrSpec === "string") {
|
193
|
+
name = exportNameOrSpec;
|
194
|
+
} else {
|
195
|
+
name = exportNameOrSpec.name;
|
196
|
+
if (exportNameOrSpec.canMangle !== undefined)
|
197
|
+
canMangle = exportNameOrSpec.canMangle;
|
198
|
+
if (exportNameOrSpec.export !== undefined)
|
199
|
+
fromExport = exportNameOrSpec.export;
|
200
|
+
if (exportNameOrSpec.exports !== undefined)
|
201
|
+
exports = exportNameOrSpec.exports;
|
202
|
+
if (exportNameOrSpec.from !== undefined)
|
203
|
+
from = exportNameOrSpec.from;
|
204
|
+
if (exportNameOrSpec.priority !== undefined)
|
205
|
+
priority = exportNameOrSpec.priority;
|
206
|
+
if (exportNameOrSpec.terminalBinding !== undefined)
|
207
|
+
terminalBinding = exportNameOrSpec.terminalBinding;
|
208
|
+
if (exportNameOrSpec.hidden !== undefined)
|
209
|
+
hidden = exportNameOrSpec.hidden;
|
210
|
+
}
|
157
211
|
const exportInfo = exportsInfo.getExportInfo(name);
|
158
|
-
exportInfo.unsetTarget(dep);
|
159
|
-
}
|
160
|
-
}
|
161
|
-
if (exports === true) {
|
162
|
-
// unknown exports
|
163
|
-
if (
|
164
|
-
exportsInfo.setUnknownExportsProvided(
|
165
|
-
globalCanMangle,
|
166
|
-
exportDesc.excludeExports,
|
167
|
-
globalFrom && dep,
|
168
|
-
globalFrom,
|
169
|
-
globalPriority
|
170
|
-
)
|
171
|
-
) {
|
172
|
-
changed = true;
|
173
|
-
}
|
174
|
-
} else if (Array.isArray(exports)) {
|
175
|
-
/**
|
176
|
-
* merge in new exports
|
177
|
-
* @param {ExportsInfo} exportsInfo own exports info
|
178
|
-
* @param {(ExportSpec | string)[]} exports list of exports
|
179
|
-
*/
|
180
|
-
const mergeExports = (exportsInfo, exports) => {
|
181
|
-
for (const exportNameOrSpec of exports) {
|
182
|
-
let name;
|
183
|
-
let canMangle = globalCanMangle;
|
184
|
-
let terminalBinding = globalTerminalBinding;
|
185
|
-
let exports = undefined;
|
186
|
-
let from = globalFrom;
|
187
|
-
let fromExport = undefined;
|
188
|
-
let priority = globalPriority;
|
189
|
-
let hidden = false;
|
190
|
-
if (typeof exportNameOrSpec === "string") {
|
191
|
-
name = exportNameOrSpec;
|
192
|
-
} else {
|
193
|
-
name = exportNameOrSpec.name;
|
194
|
-
if (exportNameOrSpec.canMangle !== undefined)
|
195
|
-
canMangle = exportNameOrSpec.canMangle;
|
196
|
-
if (exportNameOrSpec.export !== undefined)
|
197
|
-
fromExport = exportNameOrSpec.export;
|
198
|
-
if (exportNameOrSpec.exports !== undefined)
|
199
|
-
exports = exportNameOrSpec.exports;
|
200
|
-
if (exportNameOrSpec.from !== undefined)
|
201
|
-
from = exportNameOrSpec.from;
|
202
|
-
if (exportNameOrSpec.priority !== undefined)
|
203
|
-
priority = exportNameOrSpec.priority;
|
204
|
-
if (exportNameOrSpec.terminalBinding !== undefined)
|
205
|
-
terminalBinding = exportNameOrSpec.terminalBinding;
|
206
|
-
if (exportNameOrSpec.hidden !== undefined)
|
207
|
-
hidden = exportNameOrSpec.hidden;
|
208
|
-
}
|
209
|
-
const exportInfo = exportsInfo.getExportInfo(name);
|
210
212
|
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
213
|
+
if (
|
214
|
+
exportInfo.provided === false ||
|
215
|
+
exportInfo.provided === null
|
216
|
+
) {
|
217
|
+
exportInfo.provided = true;
|
218
|
+
changed = true;
|
219
|
+
}
|
218
220
|
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
221
|
+
if (
|
222
|
+
exportInfo.canMangleProvide !== false &&
|
223
|
+
canMangle === false
|
224
|
+
) {
|
225
|
+
exportInfo.canMangleProvide = false;
|
226
|
+
changed = true;
|
227
|
+
}
|
226
228
|
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
229
|
+
if (terminalBinding && !exportInfo.terminalBinding) {
|
230
|
+
exportInfo.terminalBinding = true;
|
231
|
+
changed = true;
|
232
|
+
}
|
231
233
|
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
234
|
+
if (exports) {
|
235
|
+
const nestedExportsInfo =
|
236
|
+
exportInfo.createNestedExportsInfo();
|
237
|
+
mergeExports(nestedExportsInfo, exports);
|
238
|
+
}
|
237
239
|
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
240
|
+
if (
|
241
|
+
from &&
|
242
|
+
(hidden
|
243
|
+
? exportInfo.unsetTarget(dep)
|
244
|
+
: exportInfo.setTarget(
|
245
|
+
dep,
|
246
|
+
from,
|
247
|
+
fromExport === undefined ? [name] : fromExport,
|
248
|
+
priority
|
249
|
+
))
|
250
|
+
) {
|
251
|
+
changed = true;
|
252
|
+
}
|
251
253
|
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
}
|
254
|
+
// Recalculate target exportsInfo
|
255
|
+
const target = exportInfo.getTarget(moduleGraph);
|
256
|
+
let targetExportsInfo = undefined;
|
257
|
+
if (target) {
|
258
|
+
const targetModuleExportsInfo =
|
259
|
+
moduleGraph.getExportsInfo(target.module);
|
260
|
+
targetExportsInfo =
|
261
|
+
targetModuleExportsInfo.getNestedExportsInfo(
|
262
|
+
target.export
|
263
|
+
);
|
264
|
+
// add dependency for this module
|
265
|
+
const set = dependencies.get(target.module);
|
266
|
+
if (set === undefined) {
|
267
|
+
dependencies.set(target.module, new Set([module]));
|
268
|
+
} else {
|
269
|
+
set.add(module);
|
269
270
|
}
|
271
|
+
}
|
270
272
|
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
) {
|
277
|
-
changed = true;
|
278
|
-
}
|
279
|
-
} else if (
|
280
|
-
exportInfo.exportsInfo !== targetExportsInfo
|
273
|
+
if (exportInfo.exportsInfoOwned) {
|
274
|
+
if (
|
275
|
+
exportInfo.exportsInfo.setRedirectNamedTo(
|
276
|
+
targetExportsInfo
|
277
|
+
)
|
281
278
|
) {
|
282
|
-
exportInfo.exportsInfo = targetExportsInfo;
|
283
279
|
changed = true;
|
284
280
|
}
|
285
|
-
}
|
286
|
-
|
287
|
-
|
288
|
-
}
|
289
|
-
// store dependencies
|
290
|
-
if (exportDeps) {
|
291
|
-
cacheable = false;
|
292
|
-
for (const exportDependency of exportDeps) {
|
293
|
-
// add dependency for this module
|
294
|
-
const set = dependencies.get(exportDependency);
|
295
|
-
if (set === undefined) {
|
296
|
-
dependencies.set(exportDependency, new Set([module]));
|
297
|
-
} else {
|
298
|
-
set.add(module);
|
281
|
+
} else if (exportInfo.exportsInfo !== targetExportsInfo) {
|
282
|
+
exportInfo.exportsInfo = targetExportsInfo;
|
283
|
+
changed = true;
|
299
284
|
}
|
300
285
|
}
|
286
|
+
};
|
287
|
+
mergeExports(exportsInfo, exports);
|
288
|
+
}
|
289
|
+
// store dependencies
|
290
|
+
if (exportDeps) {
|
291
|
+
cacheable = false;
|
292
|
+
for (const exportDependency of exportDeps) {
|
293
|
+
// add dependency for this module
|
294
|
+
const set = dependencies.get(exportDependency);
|
295
|
+
if (set === undefined) {
|
296
|
+
dependencies.set(exportDependency, new Set([module]));
|
297
|
+
} else {
|
298
|
+
set.add(module);
|
299
|
+
}
|
301
300
|
}
|
302
|
-
}
|
301
|
+
}
|
302
|
+
};
|
303
303
|
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
}
|
304
|
+
const notifyDependencies = () => {
|
305
|
+
const deps = dependencies.get(module);
|
306
|
+
if (deps !== undefined) {
|
307
|
+
for (const dep of deps) {
|
308
|
+
queue.enqueue(dep);
|
310
309
|
}
|
311
|
-
}
|
310
|
+
}
|
311
|
+
};
|
312
312
|
|
313
|
-
|
314
|
-
|
315
|
-
|
313
|
+
logger.time("figure out provided exports");
|
314
|
+
while (queue.length > 0) {
|
315
|
+
module = queue.dequeue();
|
316
316
|
|
317
|
-
|
317
|
+
statQueueItemsProcessed++;
|
318
318
|
|
319
|
-
|
319
|
+
exportsInfo = moduleGraph.getExportsInfo(module);
|
320
320
|
|
321
|
-
|
322
|
-
|
321
|
+
cacheable = true;
|
322
|
+
changed = false;
|
323
323
|
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
] of exportsSpecsFromDependencies) {
|
332
|
-
processExportsSpec(dep, exportsSpec);
|
333
|
-
}
|
324
|
+
exportsSpecsFromDependencies.clear();
|
325
|
+
moduleGraph.freeze();
|
326
|
+
processDependenciesBlock(module);
|
327
|
+
moduleGraph.unfreeze();
|
328
|
+
for (const [dep, exportsSpec] of exportsSpecsFromDependencies) {
|
329
|
+
processExportsSpec(dep, exportsSpec);
|
330
|
+
}
|
334
331
|
|
335
|
-
|
336
|
-
|
337
|
-
|
332
|
+
if (cacheable) {
|
333
|
+
modulesToStore.add(module);
|
334
|
+
}
|
338
335
|
|
339
|
-
|
340
|
-
|
341
|
-
}
|
336
|
+
if (changed) {
|
337
|
+
notifyDependencies();
|
342
338
|
}
|
343
|
-
logger.timeEnd("figure out provided exports");
|
344
|
-
|
345
|
-
logger.log(
|
346
|
-
`${Math.round(
|
347
|
-
(100 * (statFlaggedUncached + statNotCached)) /
|
348
|
-
(statRestoredFromMemCache +
|
349
|
-
statRestoredFromCache +
|
350
|
-
statNotCached +
|
351
|
-
statFlaggedUncached +
|
352
|
-
statNoExports)
|
353
|
-
)}% of exports of modules have been determined (${statNoExports} no declared exports, ${statNotCached} not cached, ${statFlaggedUncached} flagged uncacheable, ${statRestoredFromCache} from cache, ${statRestoredFromMemCache} from mem cache, ${
|
354
|
-
statQueueItemsProcessed -
|
355
|
-
statNotCached -
|
356
|
-
statFlaggedUncached
|
357
|
-
} additional calculations due to dependencies)`
|
358
|
-
);
|
359
|
-
|
360
|
-
logger.time("store provided exports into cache");
|
361
|
-
asyncLib.each(
|
362
|
-
modulesToStore,
|
363
|
-
(module, callback) => {
|
364
|
-
if (typeof module.buildInfo.hash !== "string") {
|
365
|
-
// not cacheable
|
366
|
-
return callback();
|
367
|
-
}
|
368
|
-
const cachedData = moduleGraph
|
369
|
-
.getExportsInfo(module)
|
370
|
-
.getRestoreProvidedData();
|
371
|
-
const memCache =
|
372
|
-
moduleMemCaches && moduleMemCaches.get(module);
|
373
|
-
if (memCache) {
|
374
|
-
memCache.set(this, cachedData);
|
375
|
-
}
|
376
|
-
cache.store(
|
377
|
-
module.identifier(),
|
378
|
-
module.buildInfo.hash,
|
379
|
-
cachedData,
|
380
|
-
callback
|
381
|
-
);
|
382
|
-
},
|
383
|
-
err => {
|
384
|
-
logger.timeEnd("store provided exports into cache");
|
385
|
-
callback(err);
|
386
|
-
}
|
387
|
-
);
|
388
339
|
}
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
340
|
+
logger.timeEnd("figure out provided exports");
|
341
|
+
|
342
|
+
logger.log(
|
343
|
+
`${Math.round(
|
344
|
+
(100 * (statFlaggedUncached + statNotCached)) /
|
345
|
+
(statRestoredFromMemCache +
|
346
|
+
statRestoredFromCache +
|
347
|
+
statNotCached +
|
348
|
+
statFlaggedUncached +
|
349
|
+
statNoExports)
|
350
|
+
)}% of exports of modules have been determined (${statNoExports} no declared exports, ${statNotCached} not cached, ${statFlaggedUncached} flagged uncacheable, ${statRestoredFromCache} from cache, ${statRestoredFromMemCache} from mem cache, ${
|
351
|
+
statQueueItemsProcessed - statNotCached - statFlaggedUncached
|
352
|
+
} additional calculations due to dependencies)`
|
353
|
+
);
|
354
|
+
|
355
|
+
logger.time("store provided exports into cache");
|
356
|
+
asyncLib.each(
|
357
|
+
modulesToStore,
|
358
|
+
(module, callback) => {
|
359
|
+
if (typeof module.buildInfo.hash !== "string") {
|
360
|
+
// not cacheable
|
361
|
+
return callback();
|
362
|
+
}
|
363
|
+
const cachedData = moduleGraph
|
364
|
+
.getExportsInfo(module)
|
365
|
+
.getRestoreProvidedData();
|
366
|
+
const memCache =
|
367
|
+
moduleMemCaches && moduleMemCaches.get(module);
|
368
|
+
if (memCache) {
|
369
|
+
memCache.set(this, cachedData);
|
370
|
+
}
|
371
|
+
cache.store(
|
372
|
+
module.identifier(),
|
373
|
+
module.buildInfo.hash,
|
374
|
+
cachedData,
|
375
|
+
callback
|
376
|
+
);
|
377
|
+
},
|
378
|
+
err => {
|
379
|
+
logger.timeEnd("store provided exports into cache");
|
380
|
+
callback(err);
|
381
|
+
}
|
382
|
+
);
|
383
|
+
}
|
384
|
+
);
|
385
|
+
}
|
386
|
+
);
|
387
|
+
|
388
|
+
/** @type {WeakMap<Module, any>} */
|
389
|
+
const providedExportsCache = new WeakMap();
|
390
|
+
compilation.hooks.rebuildModule.tap(PLUGIN_NAME, module => {
|
391
|
+
providedExportsCache.set(
|
392
|
+
module,
|
393
|
+
moduleGraph.getExportsInfo(module).getRestoreProvidedData()
|
411
394
|
);
|
412
|
-
}
|
413
|
-
|
395
|
+
});
|
396
|
+
compilation.hooks.finishRebuildingModule.tap(PLUGIN_NAME, module => {
|
397
|
+
moduleGraph
|
398
|
+
.getExportsInfo(module)
|
399
|
+
.restoreProvided(providedExportsCache.get(module));
|
400
|
+
});
|
401
|
+
});
|
414
402
|
}
|
415
403
|
}
|
416
404
|
|