webpack 5.40.0 → 5.42.1
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/README.md +3 -3
- package/bin/webpack.js +0 -0
- package/lib/Compiler.js +14 -1
- package/lib/ConditionalInitFragment.js +15 -12
- package/lib/DependencyTemplate.js +3 -2
- package/lib/ExternalModule.js +213 -33
- package/lib/ExternalModuleFactoryPlugin.js +2 -1
- package/lib/InitFragment.js +10 -7
- package/lib/MainTemplate.js +1 -1
- package/lib/ModuleTemplate.js +0 -9
- package/lib/NormalModuleFactory.js +13 -2
- package/lib/RuntimeTemplate.js +8 -0
- package/lib/Template.js +3 -2
- package/lib/TemplatedPathPlugin.js +24 -26
- package/lib/Watching.js +2 -1
- package/lib/WebpackOptionsApply.js +12 -8
- package/lib/asset/AssetGenerator.js +2 -2
- package/lib/async-modules/AwaitDependenciesInitFragment.js +4 -1
- package/lib/cache/IdleFileCachePlugin.js +60 -13
- package/lib/cache/PackFileCacheStrategy.js +26 -15
- package/lib/config/defaults.js +54 -12
- package/lib/config/normalization.js +2 -0
- package/lib/dependencies/HarmonyExportInitFragment.js +4 -1
- package/lib/dependencies/WorkerPlugin.js +25 -10
- package/lib/electron/ElectronTargetPlugin.js +3 -3
- package/lib/esm/ModuleChunkFormatPlugin.js +97 -0
- package/lib/esm/ModuleChunkLoadingPlugin.js +63 -0
- package/lib/esm/ModuleChunkLoadingRuntimeModule.js +208 -0
- package/lib/hmr/lazyCompilationBackend.js +17 -1
- package/lib/javascript/EnableChunkLoadingPlugin.js +5 -3
- package/lib/javascript/JavascriptModulesPlugin.js +80 -17
- package/lib/javascript/JavascriptParser.js +2 -1
- package/lib/json/JsonGenerator.js +2 -2
- package/lib/node/NodeTargetPlugin.js +1 -1
- package/lib/node/ReadFileCompileAsyncWasmPlugin.js +44 -22
- package/lib/optimize/ModuleConcatenationPlugin.js +1 -1
- package/lib/runtime/AsyncModuleRuntimeModule.js +8 -4
- package/lib/serialization/BinaryMiddleware.js +50 -35
- package/lib/serialization/FileMiddleware.js +112 -12
- package/lib/wasm/EnableWasmLoadingPlugin.js +10 -1
- package/lib/wasm-sync/WebAssemblyModulesPlugin.js +1 -1
- package/package.json +15 -15
- package/schemas/WebpackOptions.check.js +1 -1
- package/schemas/WebpackOptions.json +22 -8
- package/schemas/plugins/container/ContainerReferencePlugin.check.js +1 -1
- package/schemas/plugins/container/ContainerReferencePlugin.json +2 -1
- package/schemas/plugins/container/ExternalsType.check.js +1 -1
- package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
- package/schemas/plugins/container/ModuleFederationPlugin.json +2 -1
- package/types.d.ts +105 -151
package/README.md
CHANGED
@@ -287,7 +287,7 @@ Contributions go far beyond pull requests and commits. Although we love giving y
|
|
287
287
|
- [Blogging, speaking about, or creating tutorials](https://github.com/webpack-contrib/awesome-webpack) about one of webpack's many features.
|
288
288
|
- Helping others in our webpack [gitter channel](https://gitter.im/webpack/webpack).
|
289
289
|
|
290
|
-
To get started have a look at our [documentation on contributing](https://github.com/webpack/webpack/blob/
|
290
|
+
To get started have a look at our [documentation on contributing](https://github.com/webpack/webpack/blob/main/CONTRIBUTING.md).
|
291
291
|
|
292
292
|
If you are worried or don't know where to start, you can **always** reach out to [Sean Larkin (@TheLarkInn) on Twitter](https://twitter.com/thelarkinn) or simply submit an issue and a maintainer can help give you guidance!
|
293
293
|
|
@@ -715,11 +715,11 @@ src="https://static.monei.net/monei-logo.svg" height="30" alt="MONEI"></a>
|
|
715
715
|
[node-url]: https://nodejs.org
|
716
716
|
[deps]: https://img.shields.io/david/webpack/webpack.svg
|
717
717
|
[deps-url]: https://david-dm.org/webpack/webpack
|
718
|
-
[tests]: https://img.shields.io/travis/webpack/webpack/
|
718
|
+
[tests]: https://img.shields.io/travis/webpack/webpack/main.svg
|
719
719
|
[tests-url]: https://travis-ci.org/webpack/webpack
|
720
720
|
[prs]: https://img.shields.io/badge/PRs-welcome-brightgreen.svg
|
721
721
|
[prs-url]: https://webpack.js.org/contribute/
|
722
|
-
[builds-url]: https://ci.appveyor.com/project/sokra/webpack/branch/
|
722
|
+
[builds-url]: https://ci.appveyor.com/project/sokra/webpack/branch/main
|
723
723
|
[builds]: https://ci.appveyor.com/api/projects/status/github/webpack/webpack?svg=true
|
724
724
|
[builds2]: https://dev.azure.com/webpack/webpack/_apis/build/status/webpack.webpack
|
725
725
|
[builds2-url]: https://dev.azure.com/webpack/webpack/_build/latest?definitionId=3
|
package/bin/webpack.js
CHANGED
File without changes
|
package/lib/Compiler.js
CHANGED
@@ -260,6 +260,8 @@ class Compiler {
|
|
260
260
|
|
261
261
|
/** @type {Compilation} */
|
262
262
|
this._lastCompilation = undefined;
|
263
|
+
/** @type {NormalModuleFactory} */
|
264
|
+
this._lastNormalModuleFactory = undefined;
|
263
265
|
|
264
266
|
/** @private @type {WeakMap<Source, { sizeOnlySource: SizeOnlySource, writtenTo: Map<string, number> }>} */
|
265
267
|
this._assetEmittingSourceCache = new WeakMap();
|
@@ -375,6 +377,14 @@ class Compiler {
|
|
375
377
|
}
|
376
378
|
}
|
377
379
|
|
380
|
+
// TODO webpack 6: solve this in a better way
|
381
|
+
_cleanupLastNormalModuleFactory() {
|
382
|
+
if (this._lastNormalModuleFactory !== undefined) {
|
383
|
+
this._lastNormalModuleFactory.cleanupForCache();
|
384
|
+
this._lastNormalModuleFactory = undefined;
|
385
|
+
}
|
386
|
+
}
|
387
|
+
|
378
388
|
/**
|
379
389
|
* @param {WatchOptions} watchOptions the watcher's options
|
380
390
|
* @param {Callback<Stats>} handler signals when the call finishes
|
@@ -1036,6 +1046,7 @@ ${other}`);
|
|
1036
1046
|
}
|
1037
1047
|
|
1038
1048
|
createNormalModuleFactory() {
|
1049
|
+
this._cleanupLastNormalModuleFactory();
|
1039
1050
|
const normalModuleFactory = new NormalModuleFactory({
|
1040
1051
|
context: this.options.context,
|
1041
1052
|
fs: this.inputFileSystem,
|
@@ -1044,6 +1055,7 @@ ${other}`);
|
|
1044
1055
|
associatedObjectForCache: this.root,
|
1045
1056
|
layers: this.options.experiments.layers
|
1046
1057
|
});
|
1058
|
+
this._lastNormalModuleFactory = normalModuleFactory;
|
1047
1059
|
this.hooks.normalModuleFactory.call(normalModuleFactory);
|
1048
1060
|
return normalModuleFactory;
|
1049
1061
|
}
|
@@ -1122,8 +1134,9 @@ ${other}`);
|
|
1122
1134
|
if (err) return callback(err);
|
1123
1135
|
// Get rid of reference to last compilation to avoid leaking memory
|
1124
1136
|
// We can't run this._cleanupLastCompilation() as the Stats to this compilation
|
1125
|
-
// might be still in use. We try to get rid
|
1137
|
+
// might be still in use. We try to get rid of the reference to the cache instead.
|
1126
1138
|
this._lastCompilation = undefined;
|
1139
|
+
this._lastNormalModuleFactory = undefined;
|
1127
1140
|
this.cache.shutdown(callback);
|
1128
1141
|
});
|
1129
1142
|
}
|
@@ -31,6 +31,9 @@ const wrapInCondition = (condition, source) => {
|
|
31
31
|
}
|
32
32
|
};
|
33
33
|
|
34
|
+
/**
|
35
|
+
* @typedef {GenerateContext} Context
|
36
|
+
*/
|
34
37
|
class ConditionalInitFragment extends InitFragment {
|
35
38
|
/**
|
36
39
|
* @param {string|Source} content the source code that will be included as initialization code
|
@@ -53,16 +56,16 @@ class ConditionalInitFragment extends InitFragment {
|
|
53
56
|
}
|
54
57
|
|
55
58
|
/**
|
56
|
-
* @param {
|
59
|
+
* @param {Context} context context
|
57
60
|
* @returns {string|Source} the source code that will be included as initialization code
|
58
61
|
*/
|
59
|
-
getContent(
|
62
|
+
getContent(context) {
|
60
63
|
if (this.runtimeCondition === false || !this.content) return "";
|
61
64
|
if (this.runtimeCondition === true) return this.content;
|
62
|
-
const expr =
|
63
|
-
chunkGraph:
|
64
|
-
runtimeRequirements:
|
65
|
-
runtime:
|
65
|
+
const expr = context.runtimeTemplate.runtimeConditionExpression({
|
66
|
+
chunkGraph: context.chunkGraph,
|
67
|
+
runtimeRequirements: context.runtimeRequirements,
|
68
|
+
runtime: context.runtime,
|
66
69
|
runtimeCondition: this.runtimeCondition
|
67
70
|
});
|
68
71
|
if (expr === "true") return this.content;
|
@@ -70,16 +73,16 @@ class ConditionalInitFragment extends InitFragment {
|
|
70
73
|
}
|
71
74
|
|
72
75
|
/**
|
73
|
-
* @param {
|
76
|
+
* @param {Context} context context
|
74
77
|
* @returns {string|Source=} the source code that will be included at the end of the module
|
75
78
|
*/
|
76
|
-
getEndContent(
|
79
|
+
getEndContent(context) {
|
77
80
|
if (this.runtimeCondition === false || !this.endContent) return "";
|
78
81
|
if (this.runtimeCondition === true) return this.endContent;
|
79
|
-
const expr =
|
80
|
-
chunkGraph:
|
81
|
-
runtimeRequirements:
|
82
|
-
runtime:
|
82
|
+
const expr = context.runtimeTemplate.runtimeConditionExpression({
|
83
|
+
chunkGraph: context.chunkGraph,
|
84
|
+
runtimeRequirements: context.runtimeRequirements,
|
85
|
+
runtime: context.runtime,
|
83
86
|
runtimeCondition: this.runtimeCondition
|
84
87
|
});
|
85
88
|
if (expr === "true") return this.endContent;
|
@@ -11,7 +11,8 @@
|
|
11
11
|
/** @typedef {import("./Dependency")} Dependency */
|
12
12
|
/** @typedef {import("./Dependency").RuntimeSpec} RuntimeSpec */
|
13
13
|
/** @typedef {import("./DependencyTemplates")} DependencyTemplates */
|
14
|
-
/** @typedef {import("./
|
14
|
+
/** @typedef {import("./Generator").GenerateContext} GenerateContext */
|
15
|
+
/** @template T @typedef {import("./InitFragment")<T>} InitFragment */
|
15
16
|
/** @typedef {import("./Module")} Module */
|
16
17
|
/** @typedef {import("./ModuleGraph")} ModuleGraph */
|
17
18
|
/** @typedef {import("./RuntimeTemplate")} RuntimeTemplate */
|
@@ -25,7 +26,7 @@
|
|
25
26
|
* @property {Set<string>} runtimeRequirements the requirements for runtime
|
26
27
|
* @property {Module} module current module
|
27
28
|
* @property {RuntimeSpec} runtime current runtimes, for which code is generated
|
28
|
-
* @property {InitFragment[]} initFragments mutable array of init fragments for the current module
|
29
|
+
* @property {InitFragment<GenerateContext>[]} initFragments mutable array of init fragments for the current module
|
29
30
|
* @property {ConcatenationScope=} concatenationScope when in a concatenated module, information about other concatenated modules
|
30
31
|
*/
|
31
32
|
|
package/lib/ExternalModule.js
CHANGED
@@ -7,6 +7,8 @@
|
|
7
7
|
|
8
8
|
const { OriginalSource, RawSource } = require("webpack-sources");
|
9
9
|
const ConcatenationScope = require("./ConcatenationScope");
|
10
|
+
const { UsageState } = require("./ExportsInfo");
|
11
|
+
const InitFragment = require("./InitFragment");
|
10
12
|
const Module = require("./Module");
|
11
13
|
const RuntimeGlobals = require("./RuntimeGlobals");
|
12
14
|
const Template = require("./Template");
|
@@ -22,6 +24,7 @@ const propertyAccess = require("./util/propertyAccess");
|
|
22
24
|
/** @typedef {import("./Compilation")} Compilation */
|
23
25
|
/** @typedef {import("./Dependency").UpdateHashContext} UpdateHashContext */
|
24
26
|
/** @typedef {import("./DependencyTemplates")} DependencyTemplates */
|
27
|
+
/** @typedef {import("./ExportsInfo")} ExportsInfo */
|
25
28
|
/** @typedef {import("./Module").CodeGenerationContext} CodeGenerationContext */
|
26
29
|
/** @typedef {import("./Module").CodeGenerationResult} CodeGenerationResult */
|
27
30
|
/** @typedef {import("./Module").ConcatenationBailoutReasonContext} ConcatenationBailoutReasonContext */
|
@@ -31,16 +34,28 @@ const propertyAccess = require("./util/propertyAccess");
|
|
31
34
|
/** @typedef {import("./ResolverFactory").ResolverWithOptions} ResolverWithOptions */
|
32
35
|
/** @typedef {import("./RuntimeTemplate")} RuntimeTemplate */
|
33
36
|
/** @typedef {import("./WebpackError")} WebpackError */
|
37
|
+
/** @typedef {import("./javascript/JavascriptModulesPlugin").ChunkRenderContext} ChunkRenderContext */
|
34
38
|
/** @typedef {import("./util/Hash")} Hash */
|
35
39
|
/** @typedef {import("./util/fs").InputFileSystem} InputFileSystem */
|
40
|
+
/** @typedef {import("./util/runtime").RuntimeSpec} RuntimeSpec */
|
36
41
|
|
37
42
|
/**
|
38
43
|
* @typedef {Object} SourceData
|
39
44
|
* @property {boolean=} iife
|
40
45
|
* @property {string=} init
|
41
46
|
* @property {string} expression
|
47
|
+
* @property {InitFragment<ChunkRenderContext>[]=} chunkInitFragments
|
48
|
+
* @property {ReadonlySet<string>=} runtimeRequirements
|
42
49
|
*/
|
43
50
|
|
51
|
+
const TYPES = new Set(["javascript"]);
|
52
|
+
const RUNTIME_REQUIREMENTS = new Set([RuntimeGlobals.module]);
|
53
|
+
const RUNTIME_REQUIREMENTS_FOR_SCRIPT = new Set([RuntimeGlobals.loadScript]);
|
54
|
+
const RUNTIME_REQUIREMENTS_FOR_MODULE = new Set([
|
55
|
+
RuntimeGlobals.definePropertyGetters
|
56
|
+
]);
|
57
|
+
const EMPTY_RUNTIME_REQUIREMENTS = new Set([]);
|
58
|
+
|
44
59
|
/**
|
45
60
|
* @param {string|string[]} variableName the variable name or path
|
46
61
|
* @param {string} type the module system
|
@@ -67,7 +82,7 @@ const getSourceForGlobalVariableExternal = (variableName, type) => {
|
|
67
82
|
const getSourceForCommonJsExternal = moduleAndSpecifiers => {
|
68
83
|
if (!Array.isArray(moduleAndSpecifiers)) {
|
69
84
|
return {
|
70
|
-
expression: `require(${JSON.stringify(moduleAndSpecifiers)})
|
85
|
+
expression: `require(${JSON.stringify(moduleAndSpecifiers)})`
|
71
86
|
};
|
72
87
|
}
|
73
88
|
const moduleName = moduleAndSpecifiers[0];
|
@@ -75,7 +90,37 @@ const getSourceForCommonJsExternal = moduleAndSpecifiers => {
|
|
75
90
|
expression: `require(${JSON.stringify(moduleName)})${propertyAccess(
|
76
91
|
moduleAndSpecifiers,
|
77
92
|
1
|
78
|
-
)}
|
93
|
+
)}`
|
94
|
+
};
|
95
|
+
};
|
96
|
+
|
97
|
+
/**
|
98
|
+
* @param {string|string[]} moduleAndSpecifiers the module request
|
99
|
+
* @returns {SourceData} the generated source
|
100
|
+
*/
|
101
|
+
const getSourceForCommonJsExternalInNodeModule = moduleAndSpecifiers => {
|
102
|
+
const chunkInitFragments = [
|
103
|
+
new InitFragment(
|
104
|
+
'import { createRequire as __WEBPACK_EXTERNAL_createRequire } from "module";\n',
|
105
|
+
InitFragment.STAGE_HARMONY_IMPORTS,
|
106
|
+
0,
|
107
|
+
"external module node-commonjs"
|
108
|
+
)
|
109
|
+
];
|
110
|
+
if (!Array.isArray(moduleAndSpecifiers)) {
|
111
|
+
return {
|
112
|
+
expression: `__WEBPACK_EXTERNAL_createRequire(import.meta.url)(${JSON.stringify(
|
113
|
+
moduleAndSpecifiers
|
114
|
+
)})`,
|
115
|
+
chunkInitFragments
|
116
|
+
};
|
117
|
+
}
|
118
|
+
const moduleName = moduleAndSpecifiers[0];
|
119
|
+
return {
|
120
|
+
expression: `__WEBPACK_EXTERNAL_createRequire(import.meta.url)(${JSON.stringify(
|
121
|
+
moduleName
|
122
|
+
)})${propertyAccess(moduleAndSpecifiers, 1)}`,
|
123
|
+
chunkInitFragments
|
79
124
|
};
|
80
125
|
};
|
81
126
|
|
@@ -112,6 +157,91 @@ const getSourceForImportExternal = (moduleAndSpecifiers, runtimeTemplate) => {
|
|
112
157
|
};
|
113
158
|
};
|
114
159
|
|
160
|
+
class ModuleExternalInitFragment extends InitFragment {
|
161
|
+
constructor(id, request) {
|
162
|
+
const identifier = `__WEBPACK_EXTERNAL_MODULE_${Template.toIdentifier(
|
163
|
+
`${id}`
|
164
|
+
)}__`;
|
165
|
+
super(
|
166
|
+
`import * as ${identifier} from ${JSON.stringify(request)};\n`,
|
167
|
+
InitFragment.STAGE_HARMONY_IMPORTS,
|
168
|
+
0,
|
169
|
+
`external module import ${id}`
|
170
|
+
);
|
171
|
+
this._identifier = identifier;
|
172
|
+
}
|
173
|
+
|
174
|
+
getNamespaceIdentifier() {
|
175
|
+
return this._identifier;
|
176
|
+
}
|
177
|
+
}
|
178
|
+
|
179
|
+
const generateModuleRemapping = (input, exportsInfo, runtime) => {
|
180
|
+
if (exportsInfo.otherExportsInfo.getUsed(runtime) === UsageState.Unused) {
|
181
|
+
const properties = [];
|
182
|
+
for (const exportInfo of exportsInfo.orderedExports) {
|
183
|
+
const used = exportInfo.getUsedName(exportInfo.name, runtime);
|
184
|
+
if (!used) continue;
|
185
|
+
const nestedInfo = exportInfo.getNestedExportsInfo();
|
186
|
+
if (nestedInfo) {
|
187
|
+
const nestedExpr = generateModuleRemapping(
|
188
|
+
`${input}${propertyAccess([exportInfo.name])}`,
|
189
|
+
nestedInfo
|
190
|
+
);
|
191
|
+
if (nestedExpr) {
|
192
|
+
properties.push(`[${JSON.stringify(used)}]: y(${nestedExpr})`);
|
193
|
+
continue;
|
194
|
+
}
|
195
|
+
}
|
196
|
+
properties.push(
|
197
|
+
`[${JSON.stringify(used)}]: () => ${input}${propertyAccess([
|
198
|
+
exportInfo.name
|
199
|
+
])}`
|
200
|
+
);
|
201
|
+
}
|
202
|
+
return `x({ ${properties.join(", ")} })`;
|
203
|
+
}
|
204
|
+
};
|
205
|
+
|
206
|
+
/**
|
207
|
+
* @param {string|number} id the module id
|
208
|
+
* @param {string|string[]} moduleAndSpecifiers the module request
|
209
|
+
* @param {ExportsInfo} exportsInfo exports info of this module
|
210
|
+
* @param {RuntimeSpec} runtime the runtime
|
211
|
+
* @returns {SourceData} the generated source
|
212
|
+
*/
|
213
|
+
const getSourceForModuleExternal = (
|
214
|
+
id,
|
215
|
+
moduleAndSpecifiers,
|
216
|
+
exportsInfo,
|
217
|
+
runtime
|
218
|
+
) => {
|
219
|
+
if (!Array.isArray(moduleAndSpecifiers))
|
220
|
+
moduleAndSpecifiers = [moduleAndSpecifiers];
|
221
|
+
const initFragment = new ModuleExternalInitFragment(
|
222
|
+
id,
|
223
|
+
moduleAndSpecifiers[0]
|
224
|
+
);
|
225
|
+
const baseAccess = `${initFragment.getNamespaceIdentifier()}${propertyAccess(
|
226
|
+
moduleAndSpecifiers,
|
227
|
+
1
|
228
|
+
)}`;
|
229
|
+
const moduleRemapping = generateModuleRemapping(
|
230
|
+
baseAccess,
|
231
|
+
exportsInfo,
|
232
|
+
runtime
|
233
|
+
);
|
234
|
+
let expression = moduleRemapping || baseAccess;
|
235
|
+
return {
|
236
|
+
expression,
|
237
|
+
init: `var x = y => { var x = {}; ${RuntimeGlobals.definePropertyGetters}(x, y); return x; }\nvar y = x => () => x`,
|
238
|
+
runtimeRequirements: moduleRemapping
|
239
|
+
? RUNTIME_REQUIREMENTS_FOR_MODULE
|
240
|
+
: undefined,
|
241
|
+
chunkInitFragments: [initFragment]
|
242
|
+
};
|
243
|
+
};
|
244
|
+
|
115
245
|
/**
|
116
246
|
* @param {string|string[]} urlAndGlobal the script request
|
117
247
|
* @param {RuntimeTemplate} runtimeTemplate the runtime template
|
@@ -144,7 +274,8 @@ const getSourceForScriptExternal = (urlAndGlobal, runtimeTemplate) => {
|
|
144
274
|
]
|
145
275
|
)}).then(${runtimeTemplate.returningFunction(
|
146
276
|
`${globalName}${propertyAccess(urlAndGlobal, 2)}`
|
147
|
-
)})
|
277
|
+
)})`,
|
278
|
+
runtimeRequirements: RUNTIME_REQUIREMENTS_FOR_SCRIPT
|
148
279
|
};
|
149
280
|
};
|
150
281
|
|
@@ -210,14 +341,6 @@ const getSourceForDefaultCase = (optional, request, runtimeTemplate) => {
|
|
210
341
|
};
|
211
342
|
};
|
212
343
|
|
213
|
-
const TYPES = new Set(["javascript"]);
|
214
|
-
const RUNTIME_REQUIREMENTS = new Set([RuntimeGlobals.module]);
|
215
|
-
const RUNTIME_REQUIREMENTS_FOR_SCRIPT = new Set([
|
216
|
-
RuntimeGlobals.module,
|
217
|
-
RuntimeGlobals.loadScript
|
218
|
-
]);
|
219
|
-
const RUNTIME_REQUIREMENTS_CONCATENATED = new Set([]);
|
220
|
-
|
221
344
|
class ExternalModule extends Module {
|
222
345
|
constructor(request, type, userRequest) {
|
223
346
|
super("javascript/dynamic", null);
|
@@ -293,32 +416,49 @@ class ExternalModule extends Module {
|
|
293
416
|
exportsType: undefined
|
294
417
|
};
|
295
418
|
this.buildInfo = {
|
296
|
-
strict:
|
297
|
-
topLevelDeclarations: new Set()
|
419
|
+
strict: true,
|
420
|
+
topLevelDeclarations: new Set(),
|
421
|
+
module: compilation.outputOptions.module
|
298
422
|
};
|
423
|
+
const { request, externalType } = this._getRequestAndExternalType();
|
299
424
|
this.buildMeta.exportsType = "dynamic";
|
300
425
|
let canMangle = false;
|
301
426
|
this.clearDependenciesAndBlocks();
|
302
|
-
switch (
|
427
|
+
switch (externalType) {
|
428
|
+
case "this":
|
429
|
+
this.buildInfo.strict = false;
|
430
|
+
break;
|
303
431
|
case "system":
|
304
|
-
if (!Array.isArray(
|
432
|
+
if (!Array.isArray(request) || request.length === 1) {
|
305
433
|
this.buildMeta.exportsType = "namespace";
|
306
434
|
canMangle = true;
|
307
435
|
}
|
308
436
|
break;
|
437
|
+
case "module":
|
438
|
+
if (this.buildInfo.module) {
|
439
|
+
if (!Array.isArray(request) || request.length === 1) {
|
440
|
+
this.buildMeta.exportsType = "namespace";
|
441
|
+
canMangle = true;
|
442
|
+
}
|
443
|
+
} else {
|
444
|
+
this.buildMeta.async = true;
|
445
|
+
if (!Array.isArray(request) || request.length === 1) {
|
446
|
+
this.buildMeta.exportsType = "namespace";
|
447
|
+
canMangle = false;
|
448
|
+
}
|
449
|
+
}
|
450
|
+
break;
|
451
|
+
case "script":
|
309
452
|
case "promise":
|
310
453
|
this.buildMeta.async = true;
|
311
454
|
break;
|
312
455
|
case "import":
|
313
456
|
this.buildMeta.async = true;
|
314
|
-
if (!Array.isArray(
|
457
|
+
if (!Array.isArray(request) || request.length === 1) {
|
315
458
|
this.buildMeta.exportsType = "namespace";
|
316
459
|
canMangle = false;
|
317
460
|
}
|
318
461
|
break;
|
319
|
-
case "script":
|
320
|
-
this.buildMeta.async = true;
|
321
|
-
break;
|
322
462
|
}
|
323
463
|
this.addDependency(new StaticExportsDependency(true, canMangle));
|
324
464
|
callback();
|
@@ -341,12 +481,16 @@ class ExternalModule extends Module {
|
|
341
481
|
return undefined;
|
342
482
|
}
|
343
483
|
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
484
|
+
_getRequestAndExternalType() {
|
485
|
+
let { request, externalType } = this;
|
486
|
+
if (typeof request === "object" && !Array.isArray(request))
|
487
|
+
request = request[externalType];
|
488
|
+
return { request, externalType };
|
489
|
+
}
|
490
|
+
|
491
|
+
_getSourceData(runtimeTemplate, moduleGraph, chunkGraph, runtime) {
|
492
|
+
const { request, externalType } = this._getRequestAndExternalType();
|
493
|
+
switch (externalType) {
|
350
494
|
case "this":
|
351
495
|
case "window":
|
352
496
|
case "self":
|
@@ -360,6 +504,10 @@ class ExternalModule extends Module {
|
|
360
504
|
case "commonjs2":
|
361
505
|
case "commonjs-module":
|
362
506
|
return getSourceForCommonJsExternal(request);
|
507
|
+
case "node-commonjs":
|
508
|
+
return this.buildInfo.module
|
509
|
+
? getSourceForCommonJsExternalInNodeModule(request)
|
510
|
+
: getSourceForCommonJsExternal(request);
|
363
511
|
case "amd":
|
364
512
|
case "amd-require":
|
365
513
|
case "umd":
|
@@ -377,12 +525,28 @@ class ExternalModule extends Module {
|
|
377
525
|
case "script":
|
378
526
|
return getSourceForScriptExternal(request, runtimeTemplate);
|
379
527
|
case "module":
|
528
|
+
if (!this.buildInfo.module) {
|
529
|
+
if (!runtimeTemplate.supportsDynamicImport()) {
|
530
|
+
throw new Error(
|
531
|
+
"The target environment doesn't support dynamic import() syntax so it's not possible to use external type 'module' within a script" +
|
532
|
+
(runtimeTemplate.supportsEcmaScriptModuleSyntax()
|
533
|
+
? "\nDid you mean to build a EcmaScript Module ('output.module: true')?"
|
534
|
+
: "")
|
535
|
+
);
|
536
|
+
}
|
537
|
+
return getSourceForImportExternal(request, runtimeTemplate);
|
538
|
+
}
|
380
539
|
if (!runtimeTemplate.supportsEcmaScriptModuleSyntax()) {
|
381
540
|
throw new Error(
|
382
541
|
"The target environment doesn't support EcmaScriptModule syntax so it's not possible to use external type 'module'"
|
383
542
|
);
|
384
543
|
}
|
385
|
-
|
544
|
+
return getSourceForModuleExternal(
|
545
|
+
chunkGraph.getModuleId(this),
|
546
|
+
request,
|
547
|
+
moduleGraph.getExportsInfo(this),
|
548
|
+
runtime
|
549
|
+
);
|
386
550
|
case "var":
|
387
551
|
case "promise":
|
388
552
|
case "const":
|
@@ -405,12 +569,14 @@ class ExternalModule extends Module {
|
|
405
569
|
runtimeTemplate,
|
406
570
|
moduleGraph,
|
407
571
|
chunkGraph,
|
572
|
+
runtime,
|
408
573
|
concatenationScope
|
409
574
|
}) {
|
410
|
-
const sourceData = this.
|
575
|
+
const sourceData = this._getSourceData(
|
411
576
|
runtimeTemplate,
|
412
577
|
moduleGraph,
|
413
|
-
chunkGraph
|
578
|
+
chunkGraph,
|
579
|
+
runtime
|
414
580
|
);
|
415
581
|
|
416
582
|
let sourceString = sourceData.expression;
|
@@ -428,6 +594,12 @@ class ExternalModule extends Module {
|
|
428
594
|
}
|
429
595
|
if (sourceData.init) sourceString = `${sourceData.init}\n${sourceString}`;
|
430
596
|
|
597
|
+
let data = undefined;
|
598
|
+
if (sourceData.chunkInitFragments) {
|
599
|
+
data = new Map();
|
600
|
+
data.set("chunkInitFragments", sourceData.chunkInitFragments);
|
601
|
+
}
|
602
|
+
|
431
603
|
const sources = new Map();
|
432
604
|
if (this.useSourceMap || this.useSimpleSourceMap) {
|
433
605
|
sources.set(
|
@@ -438,13 +610,21 @@ class ExternalModule extends Module {
|
|
438
610
|
sources.set("javascript", new RawSource(sourceString));
|
439
611
|
}
|
440
612
|
|
613
|
+
let runtimeRequirements = sourceData.runtimeRequirements;
|
614
|
+
if (!concatenationScope) {
|
615
|
+
if (!runtimeRequirements) {
|
616
|
+
runtimeRequirements = RUNTIME_REQUIREMENTS;
|
617
|
+
} else {
|
618
|
+
const set = new Set(runtimeRequirements);
|
619
|
+
set.add(RuntimeGlobals.module);
|
620
|
+
runtimeRequirements = set;
|
621
|
+
}
|
622
|
+
}
|
623
|
+
|
441
624
|
return {
|
442
625
|
sources,
|
443
|
-
runtimeRequirements:
|
444
|
-
|
445
|
-
: this.externalType === "script"
|
446
|
-
? RUNTIME_REQUIREMENTS_FOR_SCRIPT
|
447
|
-
: RUNTIME_REQUIREMENTS
|
626
|
+
runtimeRequirements: runtimeRequirements || EMPTY_RUNTIME_REQUIREMENTS,
|
627
|
+
data
|
448
628
|
};
|
449
629
|
}
|
450
630
|
|
@@ -172,13 +172,14 @@ class ExternalModuleFactoryPlugin {
|
|
172
172
|
cb
|
173
173
|
);
|
174
174
|
} else {
|
175
|
+
const dependencyType = dependency.category || "";
|
175
176
|
const promise = externals(
|
176
177
|
{
|
177
178
|
context,
|
178
179
|
request: dependency.request,
|
180
|
+
dependencyType,
|
179
181
|
contextInfo,
|
180
182
|
getResolve: options => (context, request, callback) => {
|
181
|
-
const dependencyType = dependency.category || "";
|
182
183
|
const resolveContext = {
|
183
184
|
fileDependencies: data.fileDependencies,
|
184
185
|
missingDependencies: data.missingDependencies,
|
package/lib/InitFragment.js
CHANGED
@@ -30,6 +30,9 @@ const sortFragmentWithIndex = ([a, i], [b, j]) => {
|
|
30
30
|
return i - j;
|
31
31
|
};
|
32
32
|
|
33
|
+
/**
|
34
|
+
* @template Context
|
35
|
+
*/
|
33
36
|
class InitFragment {
|
34
37
|
/**
|
35
38
|
* @param {string|Source} content the source code that will be included as initialization code
|
@@ -47,22 +50,22 @@ class InitFragment {
|
|
47
50
|
}
|
48
51
|
|
49
52
|
/**
|
50
|
-
* @param {
|
53
|
+
* @param {Context} context context
|
51
54
|
* @returns {string|Source} the source code that will be included as initialization code
|
52
55
|
*/
|
53
|
-
getContent(
|
56
|
+
getContent(context) {
|
54
57
|
return this.content;
|
55
58
|
}
|
56
59
|
|
57
60
|
/**
|
58
|
-
* @param {
|
61
|
+
* @param {Context} context context
|
59
62
|
* @returns {string|Source=} the source code that will be included at the end of the module
|
60
63
|
*/
|
61
|
-
getEndContent(
|
64
|
+
getEndContent(context) {
|
62
65
|
return this.endContent;
|
63
66
|
}
|
64
67
|
|
65
|
-
static addToSource(source, initFragments,
|
68
|
+
static addToSource(source, initFragments, context) {
|
66
69
|
if (initFragments.length > 0) {
|
67
70
|
// Sort fragments by position. If 2 fragments have the same position,
|
68
71
|
// use their index.
|
@@ -104,8 +107,8 @@ class InitFragment {
|
|
104
107
|
if (Array.isArray(fragment)) {
|
105
108
|
fragment = fragment[0].mergeAll(fragment);
|
106
109
|
}
|
107
|
-
concatSource.add(fragment.getContent(
|
108
|
-
const endContent = fragment.getEndContent(
|
110
|
+
concatSource.add(fragment.getContent(context));
|
111
|
+
const endContent = fragment.getEndContent(context);
|
109
112
|
if (endContent) {
|
110
113
|
endContents.push(endContent);
|
111
114
|
}
|
package/lib/MainTemplate.js
CHANGED
@@ -20,7 +20,7 @@ const memoize = require("./util/memoize");
|
|
20
20
|
/** @typedef {import("./Module")} Module} */
|
21
21
|
/** @typedef {import("./util/Hash")} Hash} */
|
22
22
|
/** @typedef {import("./DependencyTemplates")} DependencyTemplates} */
|
23
|
-
/** @typedef {import("./
|
23
|
+
/** @typedef {import("./javascript/JavascriptModulesPlugin").RenderContext} RenderContext} */
|
24
24
|
/** @typedef {import("./RuntimeTemplate")} RuntimeTemplate} */
|
25
25
|
/** @typedef {import("./ModuleGraph")} ModuleGraph} */
|
26
26
|
/** @typedef {import("./ChunkGraph")} ChunkGraph} */
|
package/lib/ModuleTemplate.js
CHANGED
@@ -22,15 +22,6 @@ const getJavascriptModulesPlugin = memoize(() =>
|
|
22
22
|
require("./javascript/JavascriptModulesPlugin")
|
23
23
|
);
|
24
24
|
|
25
|
-
/**
|
26
|
-
* @typedef {Object} RenderContext
|
27
|
-
* @property {Chunk} chunk the chunk
|
28
|
-
* @property {DependencyTemplates} dependencyTemplates the dependency templates
|
29
|
-
* @property {RuntimeTemplate} runtimeTemplate the runtime template
|
30
|
-
* @property {ModuleGraph} moduleGraph the module graph
|
31
|
-
* @property {ChunkGraph} chunkGraph the chunk graph
|
32
|
-
*/
|
33
|
-
|
34
25
|
// TODO webpack 6: remove this class
|
35
26
|
class ModuleTemplate {
|
36
27
|
/**
|
@@ -13,8 +13,10 @@ const {
|
|
13
13
|
SyncHook,
|
14
14
|
HookMap
|
15
15
|
} = require("tapable");
|
16
|
+
const ChunkGraph = require("./ChunkGraph");
|
16
17
|
const Module = require("./Module");
|
17
18
|
const ModuleFactory = require("./ModuleFactory");
|
19
|
+
const ModuleGraph = require("./ModuleGraph");
|
18
20
|
const NormalModule = require("./NormalModule");
|
19
21
|
const BasicEffectRulePlugin = require("./rules/BasicEffectRulePlugin");
|
20
22
|
const BasicMatcherRulePlugin = require("./rules/BasicMatcherRulePlugin");
|
@@ -257,8 +259,8 @@ class NormalModuleFactory extends ModuleFactory {
|
|
257
259
|
this.parserCache = new Map();
|
258
260
|
/** @type {Map<string, WeakMap<Object, Generator>>} */
|
259
261
|
this.generatorCache = new Map();
|
260
|
-
/** @type {
|
261
|
-
this._restoredUnsafeCacheEntries = new
|
262
|
+
/** @type {Set<Module>} */
|
263
|
+
this._restoredUnsafeCacheEntries = new Set();
|
262
264
|
|
263
265
|
const cacheParseResource = parseResource.bindCache(
|
264
266
|
associatedObjectForCache
|
@@ -661,6 +663,14 @@ class NormalModuleFactory extends ModuleFactory {
|
|
661
663
|
);
|
662
664
|
}
|
663
665
|
|
666
|
+
cleanupForCache() {
|
667
|
+
for (const module of this._restoredUnsafeCacheEntries) {
|
668
|
+
ChunkGraph.clearChunkGraphForModule(module);
|
669
|
+
ModuleGraph.clearModuleGraphForModule(module);
|
670
|
+
module.cleanupForCache();
|
671
|
+
}
|
672
|
+
}
|
673
|
+
|
664
674
|
/**
|
665
675
|
* @param {ModuleFactoryCreateData} data data object
|
666
676
|
* @param {function(Error=, ModuleFactoryResult=): void} callback callback
|
@@ -756,6 +766,7 @@ class NormalModuleFactory extends ModuleFactory {
|
|
756
766
|
if (!unsafeCacheData.has(module)) {
|
757
767
|
unsafeCacheData.set(module, module.getUnsafeCacheData());
|
758
768
|
}
|
769
|
+
this._restoredUnsafeCacheEntries.add(module);
|
759
770
|
}
|
760
771
|
|
761
772
|
callback(null, factoryResult);
|