Skip to content

Commit c01cb97

Browse files
committed
Merge commit 'ba703401d580ad623af17fe96ed98b4d801e0313'
# Conflicts: # test/__snapshots__/StatsTestCases.test.js.snap
2 parents 1e09650 + ba70340 commit c01cb97

File tree

38 files changed

+403
-260
lines changed

38 files changed

+403
-260
lines changed

lib/ContextModule.js

Lines changed: 25 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ class ContextModule extends Module {
253253
}
254254

255255
getFakeMap(dependencies) {
256-
if (!this.options.namespaceObject) return 1;
256+
if (!this.options.namespaceObject) return 9;
257257
// if we filter first we get a new array
258258
// therefor we dont need to create a clone of dependencies explicitly
259259
// therefore the order of this is !important!
@@ -268,20 +268,24 @@ class ContextModule extends Module {
268268
.reduce((map, dep) => {
269269
const exportsType =
270270
dep.module.buildMeta && dep.module.buildMeta.exportsType;
271-
if (!exportsType) hasNonHarmony = true;
272-
if (exportsType === "namespace") hasNamespace = true;
273-
if (exportsType === "named") hasNamed = true;
274-
map[dep.module.id] =
275-
{
276-
namespace: 1,
277-
named: 2
278-
}[exportsType] || 0;
271+
const id = dep.module.id;
272+
if (!exportsType) {
273+
map[id] = this.options.namespaceObject === "strict" ? 1 : 7;
274+
hasNonHarmony = true;
275+
} else if (exportsType === "namespace") {
276+
map[id] = 9;
277+
hasNamespace = true;
278+
} else if (exportsType === "named") {
279+
map[id] = 3;
280+
hasNamed = true;
281+
}
279282
return map;
280283
}, Object.create(null));
281-
if (!hasNamespace && hasNonHarmony && !hasNamed) return 0;
282-
if (hasNamespace && !hasNonHarmony && !hasNamed) return 1;
283-
if (!hasNamespace && !hasNonHarmony && hasNamed) return 2;
284-
if (!hasNamespace && !hasNonHarmony && !hasNamed) return 1;
284+
if (!hasNamespace && hasNonHarmony && !hasNamed)
285+
return this.options.namespaceObject === "strict" ? 1 : 7;
286+
if (hasNamespace && !hasNonHarmony && !hasNamed) return 9;
287+
if (!hasNamespace && !hasNonHarmony && hasNamed) return 3;
288+
if (!hasNamespace && !hasNonHarmony && !hasNamed) return 9;
285289
return fakeMap;
286290
}
287291

@@ -292,26 +296,14 @@ class ContextModule extends Module {
292296
}
293297

294298
getReturn(type) {
295-
if (type === 1) return "module";
296-
if (type === 2)
297-
return 'Object.assign({/* fake namespace object */}, typeof module === "object" && module, { "default": module })';
298-
if (type === 0) {
299-
if (this.options.namespaceObject === "strict") {
300-
return '/* fake namespace object */ { "default": module }';
301-
} else {
302-
return '(typeof module === "object" && module && module.__esModule ? module : Object.assign({/* fake namespace object */}, typeof module === "object" && module, { "default": module }))';
303-
}
304-
}
299+
if (type === 9) return "__webpack_require__(id)";
300+
return `__webpack_require__.t(id, ${type})`;
305301
}
306302

307303
getReturnModuleObjectSource(fakeMap, fakeMapDataExpression = "fakeMap[id]") {
308304
if (typeof fakeMap === "number")
309305
return `return ${this.getReturn(fakeMap)};`;
310-
return `return ${fakeMapDataExpression} === 1 ? ${this.getReturn(
311-
1
312-
)} : ${fakeMapDataExpression} ? ${this.getReturn(2)} : ${this.getReturn(
313-
0
314-
)};`;
306+
return `return __webpack_require__.t(id, ${fakeMapDataExpression})`;
315307
}
316308

317309
getSyncSource(dependencies, id) {
@@ -324,7 +316,6 @@ ${this.getFakeMapInitStatement(fakeMap)}
324316
325317
function webpackContext(req) {
326318
var id = webpackContextResolve(req);
327-
var module = __webpack_require__(id);
328319
${returnModuleObject}
329320
}
330321
function webpackContextResolve(req) {
@@ -359,7 +350,6 @@ function webpackContext(req) {
359350
e.code = 'MODULE_NOT_FOUND';
360351
throw e;
361352
}
362-
var module = __webpack_require__(id);
363353
${returnModuleObject}
364354
}
365355
function webpackContextResolve(req) {
@@ -394,7 +384,6 @@ function webpackAsyncContext(req) {
394384
e.code = 'MODULE_NOT_FOUND';
395385
throw e;
396386
}
397-
var module = __webpack_require__(id);
398387
${returnModuleObject}
399388
});
400389
}
@@ -423,11 +412,10 @@ module.exports = webpackAsyncContext;`;
423412
const map = this.getUserRequestMap(dependencies);
424413
const fakeMap = this.getFakeMap(dependencies);
425414
const thenFunction =
426-
fakeMap !== 1
415+
fakeMap !== 9
427416
? `function(id) {
428-
var module = __webpack_require__(id);
429-
${this.getReturnModuleObjectSource(fakeMap)}
430-
}`
417+
${this.getReturnModuleObjectSource(fakeMap)}
418+
}`
431419
: "__webpack_require__";
432420
return `var map = ${JSON.stringify(map, null, "\t")};
433421
${this.getFakeMapInitStatement(fakeMap)}
@@ -464,9 +452,8 @@ module.exports = webpackAsyncContext;`;
464452
const map = this.getUserRequestMap(dependencies);
465453
const fakeMap = this.getFakeMap(dependencies);
466454
const thenFunction =
467-
fakeMap !== 1
455+
fakeMap !== 9
468456
? `function(id) {
469-
var module = __webpack_require__(id);
470457
${this.getReturnModuleObjectSource(fakeMap)};
471458
}`
472459
: "__webpack_require__";
@@ -546,7 +533,7 @@ function webpackAsyncContext(req) {
546533
});
547534
}
548535
return ${requestPrefix}.then(function() {
549-
var module = __webpack_require__(ids[0]);
536+
var id = ids[0];
550537
${returnModuleObject}
551538
});
552539
}

lib/MainTemplate.js

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ const Template = require("./Template");
4444
// __webpack_require__.d = the exported property define getter function
4545
// __webpack_require__.o = Object.prototype.hasOwnProperty.call
4646
// __webpack_require__.r = define compatibility on export
47+
// __webpack_require__.t = create a fake namespace object
4748
// __webpack_require__.n = compatibility get default export
4849
// __webpack_require__.h = the webpack hash
4950
// __webpack_require__.w = an object containing all installed WebAssembly.Instance export objects keyed by module id
@@ -258,13 +259,7 @@ module.exports = class MainTemplate extends Tapable {
258259
Template.indent([
259260
`if(!${this.requireFn}.o(exports, name)) {`,
260261
Template.indent([
261-
"Object.defineProperty(exports, name, {",
262-
Template.indent([
263-
"configurable: false,",
264-
"enumerable: true,",
265-
"get: getter"
266-
]),
267-
"});"
262+
"Object.defineProperty(exports, name, { enumerable: true, get: getter });"
268263
]),
269264
"}"
270265
])
@@ -276,11 +271,40 @@ module.exports = class MainTemplate extends Tapable {
276271
buf.push(`${this.requireFn}.r = function(exports) {`);
277272
buf.push(
278273
Template.indent([
274+
"if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {",
275+
Template.indent([
276+
"Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });"
277+
]),
278+
"}",
279279
"Object.defineProperty(exports, '__esModule', { value: true });"
280280
])
281281
);
282282
buf.push("};");
283283

284+
buf.push("");
285+
buf.push("// create a fake namespace object");
286+
buf.push("// mode & 1: value is a module id, require it");
287+
buf.push("// mode & 2: merge all properties of value into the ns");
288+
buf.push("// mode & 4: return value when already ns object");
289+
buf.push("// mode & 8|1: behave like require");
290+
buf.push(`${this.requireFn}.t = function(value, mode) {`);
291+
buf.push(
292+
Template.indent([
293+
`if(mode & 1) value = ${this.requireFn}(value);`,
294+
`if(mode & 8) return value;`,
295+
"if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;",
296+
"var ns = Object.create(null);",
297+
`${this.requireFn}.r(ns);`,
298+
"Object.defineProperty(ns, 'default', { enumerable: true, value: value });",
299+
"if(mode & 2 && typeof value != 'string') for(var key in value) " +
300+
`${this.requireFn}.d(ns, key, function(key) { ` +
301+
"return value[key]; " +
302+
"}.bind(null, key));",
303+
"return ns;"
304+
])
305+
);
306+
buf.push("};");
307+
284308
buf.push("");
285309
buf.push(
286310
"// getDefaultExport function for compatibility with non-harmony modules"

lib/RuntimeTemplate.js

Lines changed: 38 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -94,19 +94,27 @@ module.exports = class RuntimeTemplate {
9494
}
9595

9696
moduleNamespace({ module, request, strict }) {
97-
const rawModule = this.moduleRaw({
97+
if (!module)
98+
return this.missingModule({
99+
request
100+
});
101+
const moduleId = this.moduleId({
98102
module,
99103
request
100104
});
101105
const exportsType = module.buildMeta && module.buildMeta.exportsType;
102106
if (exportsType === "namespace") {
107+
const rawModule = this.moduleRaw({
108+
module,
109+
request
110+
});
103111
return rawModule;
104112
} else if (exportsType === "named") {
105-
return `Object.assign({/* fake namespace object */}, ${rawModule}, { "default": ${rawModule} })`;
113+
return `__webpack_require__.t(${moduleId}, 3)`;
106114
} else if (strict) {
107-
return `Object({ /* fake namespace object */ "default": ${rawModule} })`;
115+
return `__webpack_require__.t(${moduleId}, 1)`;
108116
} else {
109-
return `Object(function() { var module = ${rawModule}; return typeof module === "object" && module && module.__esModule ? module : Object.assign({/* fake namespace object */}, typeof module === "object" && module, { "default": module }); }())`;
117+
return `__webpack_require__.t(${moduleId}, 7)`;
110118
}
111119
}
112120

@@ -140,23 +148,39 @@ module.exports = class RuntimeTemplate {
140148
}
141149
header += `if(!__webpack_require__.m[${idExpr}]) { var e = new Error("Module '" + ${idExpr} + "' is not available (weak dependency)"); e.code = 'MODULE_NOT_FOUND'; throw e; } `;
142150
}
143-
const rawModule = this.moduleRaw({
151+
const moduleId = this.moduleId({
144152
module,
145153
request
146154
});
147155
const exportsType = module.buildMeta && module.buildMeta.exportsType;
148156
if (exportsType === "namespace") {
149157
if (header) {
158+
const rawModule = this.moduleRaw({
159+
module,
160+
request
161+
});
150162
getModuleFunction = `function() { ${header}return ${rawModule}; }`;
151163
} else {
152164
getModuleFunction = `__webpack_require__.bind(null, ${comment}${idExpr})`;
153165
}
154166
} else if (exportsType === "named") {
155-
getModuleFunction = `function() { ${header}var module = ${rawModule}; return Object.assign({/* fake namespace object */}, module, { "default": module }); }`;
167+
if (header) {
168+
getModuleFunction = `function() { ${header}return __webpack_require__.t(${moduleId}, 3); }`;
169+
} else {
170+
getModuleFunction = `__webpack_require__.t.bind(null, ${comment}${idExpr}, 3)`;
171+
}
156172
} else if (strict) {
157-
getModuleFunction = `function() { ${header}return { /* fake namespace object */ "default": ${rawModule} }; }`;
173+
if (header) {
174+
getModuleFunction = `function() { ${header}return __webpack_require__.t(${moduleId}, 1); }`;
175+
} else {
176+
getModuleFunction = `__webpack_require__.t.bind(null, ${comment}${idExpr}, 1)`;
177+
}
158178
} else {
159-
getModuleFunction = `function() { ${header}var module = ${rawModule}; return typeof module === "object" && module && module.__esModule ? module : Object.assign({/* fake namespace object */}, typeof module === "object" && module, { "default": module }); }`;
179+
if (header) {
180+
getModuleFunction = `function() { ${header}return __webpack_require__.t(${moduleId}, 7); }`;
181+
} else {
182+
getModuleFunction = `__webpack_require__.t.bind(null, ${comment}${idExpr}, 7)`;
183+
}
160184
}
161185

162186
return `${promise || "Promise.resolve()"}.then(${getModuleFunction})`;
@@ -168,29 +192,23 @@ module.exports = class RuntimeTemplate {
168192
request
169193
});
170194
}
171-
if (module.id === null) {
172-
throw new Error(
173-
`RuntimeTemplate.importStatement(): Module ${module.identifier()} has no id. This should not happen.`
174-
);
175-
}
176-
const comment = this.comment({
195+
const moduleId = this.moduleId({
196+
module,
177197
request
178198
});
179199
const optDeclaration = update ? "" : "var ";
180200

181201
const exportsType = module.buildMeta && module.buildMeta.exportsType;
182-
let content = `/* harmony import */ ${optDeclaration}${importVar} = __webpack_require__(${comment}${JSON.stringify(
183-
module.id
184-
)});\n`;
202+
let content = `/* harmony import */ ${optDeclaration}${importVar} = __webpack_require__(${moduleId});\n`;
185203

186204
if (!exportsType && !originModule.buildMeta.strictHarmonyModule) {
187205
content += `/* harmony import */ ${optDeclaration}${importVar}_default = /*#__PURE__*/__webpack_require__.n(${importVar});\n`;
188206
}
189207
if (exportsType === "named") {
190208
if (Array.isArray(module.buildMeta.providedExports))
191-
content += `${optDeclaration}${importVar}_namespace = /*#__PURE__*/Object.assign({}, ${importVar}, {"default": ${importVar}});\n`;
209+
content += `${optDeclaration}${importVar}_namespace = /*#__PURE__*/__webpack_require__.t(${moduleId}, 1);\n`;
192210
else
193-
content += `${optDeclaration}${importVar}_namespace = /*#__PURE__*/{ /* fake namespace object */ "default": ${importVar} };\n`;
211+
content += `${optDeclaration}${importVar}_namespace = /*#__PURE__*/__webpack_require__.t(${moduleId});\n`;
194212
}
195213
return content;
196214
}
@@ -224,11 +242,7 @@ module.exports = class RuntimeTemplate {
224242
if (exportName) {
225243
return "/* non-default import from non-esm module */undefined";
226244
} else {
227-
if (asiSafe) {
228-
return `/*#__PURE__*/{ /* fake namespace object */ "default": ${importVar} }`;
229-
} else {
230-
return `/*#__PURE__*/Object({ /* fake namespace object */ "default": ${importVar} })`;
231-
}
245+
return `/*#__PURE__*/__webpack_require__.t(${importVar})`;
232246
}
233247
}
234248
}

lib/dependencies/HarmonyExportImportedSpecifierDependency.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -593,7 +593,7 @@ HarmonyExportImportedSpecifierDependency.Template = class HarmonyExportImportedS
593593
const exportsName = module.exportsArgument;
594594
return `__webpack_require__.d(${exportsName}, ${JSON.stringify(
595595
key
596-
)}, function() { return { "default": ${name} }; });\n`;
596+
)}, function() { return __webpack_require__.t(${name}); });\n`;
597597
}
598598

599599
getConditionalReexportStatement(module, key, name, valueKey) {

lib/optimize/ConcatenatedModule.js

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ const ensureNsObjSource = (
2727
if (!info.hasNamespaceObject) {
2828
info.hasNamespaceObject = true;
2929
const name = info.exportMap.get(true);
30-
const nsObj = [`var ${name} = {};`];
30+
const nsObj = [`var ${name} = {};`, `__webpack_require__.r(${name});`];
3131
for (const exportName of info.module.buildMeta.providedExports) {
3232
const finalName = getFinalName(
3333
info,
@@ -1059,17 +1059,13 @@ class ConcatenatedModule extends Module {
10591059
result.add(
10601060
`var ${
10611061
info.interopNamespaceObjectName
1062-
} = /*#__PURE__*/Object.assign({ /* fake namespace object */ }, ${
1063-
info.name
1064-
}, { "default": ${info.name} });\n`
1062+
} = /*#__PURE__*/__webpack_require__.t(${info.name}, 2);\n`
10651063
);
10661064
} else if (!info.module.buildMeta.exportsType) {
10671065
result.add(
10681066
`var ${
10691067
info.interopNamespaceObjectName
1070-
} = /*#__PURE__*/{ /* fake namespace object */ "default": ${
1071-
info.name
1072-
} };\n`
1068+
} = /*#__PURE__*/__webpack_require__.t(${info.name});\n`
10731069
);
10741070
}
10751071
}

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "webpack",
3-
"version": "4.9.2",
3+
"version": "4.10.0",
44
"author": "Tobias Koppers @sokra",
55
"description": "Packs CommonJs/AMD modules for the browser. Allows to split your codebase into multiple bundles, which can be loaded on demand. Support loaders to preprocess files, i.e. json, jsx, es7, css, less, ... and your custom stuff.",
66
"license": "MIT",

0 commit comments

Comments
 (0)