improve handling of exported Promises

This commit is contained in:
Tobias Koppers 2020-11-16 20:24:54 +01:00
parent 590aacc2ae
commit ac15f06f2a
6 changed files with 79 additions and 64 deletions

View File

@ -553,18 +553,26 @@ class ContextModule extends Module {
: "";
}
getReturn(type) {
getReturn(type, asyncModule) {
if (type === 9) {
return "__webpack_require__(id)";
}
return `${RuntimeGlobals.createFakeNamespaceObject}(id, ${type})`;
return `${RuntimeGlobals.createFakeNamespaceObject}(id, ${type}${
asyncModule ? " | 16" : ""
})`;
}
getReturnModuleObjectSource(fakeMap, fakeMapDataExpression = "fakeMap[id]") {
getReturnModuleObjectSource(
fakeMap,
asyncModule,
fakeMapDataExpression = "fakeMap[id]"
) {
if (typeof fakeMap === "number") {
return `return ${this.getReturn(fakeMap)};`;
}
return `return ${RuntimeGlobals.createFakeNamespaceObject}(id, ${fakeMapDataExpression})`;
return `return ${
RuntimeGlobals.createFakeNamespaceObject
}(id, ${fakeMapDataExpression}${asyncModule ? " | 16" : ""})`;
}
/**
@ -652,7 +660,7 @@ module.exports = webpackContext;`;
const arrow = runtimeTemplate.supportsArrowFunction();
const map = this.getUserRequestMap(dependencies, chunkGraph);
const fakeMap = this.getFakeMap(dependencies, chunkGraph);
const returnModuleObject = this.getReturnModuleObjectSource(fakeMap);
const returnModuleObject = this.getReturnModuleObjectSource(fakeMap, true);
return `var map = ${JSON.stringify(map, null, "\t")};
${this.getFakeMapInitStatement(fakeMap)}
@ -755,7 +763,7 @@ module.exports = webpackAsyncContext;`;
const thenFunction =
fakeMap !== 9
? `${arrow ? "id =>" : "function(id)"} {
${this.getReturnModuleObjectSource(fakeMap)};
${this.getReturnModuleObjectSource(fakeMap, true)};
}`
: "__webpack_require__";
@ -853,12 +861,13 @@ module.exports = webpackAsyncContext;`;
: `${RuntimeGlobals.ensureChunk}(ids[${chunksStartPosition}])`;
const returnModuleObject = this.getReturnModuleObjectSource(
fakeMap,
true,
shortMode ? "invalid" : "ids[1]"
);
const webpackAsyncContext =
requestPrefix === "Promise.resolve()"
? `${shortMode ? "" : ""}
? `
function webpackAsyncContext(req) {
return Promise.resolve().then(${arrow ? "() =>" : "function()"} {
if(!${RuntimeGlobals.hasOwnProperty}(map, req)) {

View File

@ -497,7 +497,7 @@ class RuntimeTemplate {
weak
});
const exportsType = module.getExportsType(chunkGraph.moduleGraph, strict);
let fakeType = 0;
let fakeType = 16;
switch (exportsType) {
case "namespace":
if (header) {

View File

@ -32,17 +32,23 @@ class CreateFakeNamespaceObjectRuntimeModule extends HelperRuntimeModule {
"// mode & 1: value is a module id, require it",
"// mode & 2: merge all properties of value into the ns",
"// mode & 4: return value when already ns object",
"// mode & 16: return value when it's Promise-like",
"// mode & 8|1: behave like require",
// Note: must be a function (not arrow), because this is used in body!
`${fn} = function(value, mode) {`,
Template.indent([
`if(mode & 1) value = this(value);`,
`if(mode & 8) return value;`,
"if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;",
"if(typeof value === 'object' && value) {",
Template.indent([
"if((mode & 4) && value.__esModule) return value;",
"if((mode & 16) && typeof value.then === 'function') return value;"
]),
"}",
"var ns = Object.create(null);",
`${RuntimeGlobals.makeNamespaceObject}(ns);`,
"var def = {};",
'leafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto), typeof Promise === "function" && Promise.prototype];',
"leafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];",
"for(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {",
Template.indent([
modern

View File

@ -173,10 +173,10 @@ describe("Stats", () => {
"assets": Array [
Object {
"name": "entryB.js",
"size": 2908,
"size": 2910,
},
],
"assetsSize": 2908,
"assetsSize": 2910,
"auxiliaryAssets": undefined,
"auxiliaryAssetsSize": 0,
"childAssets": undefined,
@ -221,10 +221,10 @@ describe("Stats", () => {
"info": Object {
"javascriptModule": false,
"minimized": true,
"size": 2908,
"size": 2910,
},
"name": "entryB.js",
"size": 2908,
"size": 2910,
"type": "asset",
},
Object {

View File

@ -3,14 +3,14 @@
exports[`StatsTestCases should print correct stats for aggressive-splitting-entry 1`] = `
"fitting:
PublicPath: auto
asset fitting-b45b5aa3029e0ed81551.js 15.8 KiB [emitted] [immutable]
asset fitting-9492cad25a13fbc8e7a7.js 16 KiB [emitted] [immutable]
asset fitting-34542f2d6e4f073117f4.js 1.9 KiB [emitted] [immutable]
asset fitting-db0927f4ef7838186003.js 1.9 KiB [emitted] [immutable]
asset fitting-648f8b05ea1214c52404.js 1.08 KiB [emitted] [immutable]
Entrypoint main 19.6 KiB = fitting-db0927f4ef7838186003.js 1.9 KiB fitting-34542f2d6e4f073117f4.js 1.9 KiB fitting-b45b5aa3029e0ed81551.js 15.8 KiB
chunk (runtime: main) fitting-b45b5aa3029e0ed81551.js 1.87 KiB (javascript) 8.69 KiB (runtime) [entry] [rendered]
Entrypoint main 19.8 KiB = fitting-db0927f4ef7838186003.js 1.9 KiB fitting-34542f2d6e4f073117f4.js 1.9 KiB fitting-9492cad25a13fbc8e7a7.js 16 KiB
chunk (runtime: main) fitting-9492cad25a13fbc8e7a7.js 1.87 KiB (javascript) 8.76 KiB (runtime) [entry] [rendered]
> ./index main
runtime modules 8.69 KiB 10 modules
runtime modules 8.76 KiB 10 modules
cacheable modules 1.87 KiB
./e.js 899 bytes [dependent] [built] [code generated]
./f.js 900 bytes [dependent] [built] [code generated]
@ -30,14 +30,14 @@ exports[`StatsTestCases should print correct stats for aggressive-splitting-entr
content-change:
PublicPath: auto
asset content-change-963229bb49ade52aa6f9.js 15.8 KiB [emitted] [immutable]
asset content-change-2ceac52d6bb8a7443486.js 16 KiB [emitted] [immutable]
asset content-change-34542f2d6e4f073117f4.js 1.9 KiB [emitted] [immutable]
asset content-change-db0927f4ef7838186003.js 1.9 KiB [emitted] [immutable]
asset content-change-648f8b05ea1214c52404.js 1.08 KiB [emitted] [immutable]
Entrypoint main 19.6 KiB = content-change-db0927f4ef7838186003.js 1.9 KiB content-change-34542f2d6e4f073117f4.js 1.9 KiB content-change-963229bb49ade52aa6f9.js 15.8 KiB
chunk (runtime: main) content-change-963229bb49ade52aa6f9.js 1.87 KiB (javascript) 8.7 KiB (runtime) [entry] [rendered]
Entrypoint main 19.8 KiB = content-change-db0927f4ef7838186003.js 1.9 KiB content-change-34542f2d6e4f073117f4.js 1.9 KiB content-change-2ceac52d6bb8a7443486.js 16 KiB
chunk (runtime: main) content-change-2ceac52d6bb8a7443486.js 1.87 KiB (javascript) 8.77 KiB (runtime) [entry] [rendered]
> ./index main
runtime modules 8.7 KiB 10 modules
runtime modules 8.77 KiB 10 modules
cacheable modules 1.87 KiB
./e.js 899 bytes [dependent] [built] [code generated]
./f.js 900 bytes [dependent] [built] [code generated]
@ -585,8 +585,8 @@ webpack x.x.x compiled successfully in X ms"
exports[`StatsTestCases should print correct stats for circular-correctness 1`] = `
"chunk (runtime: main) 128.bundle.js (b) 49 bytes <{179}> <{459}> >{459}< [rendered]
./module-b.js 49 bytes [built] [code generated]
chunk (runtime: main) bundle.js (main) 98 bytes (javascript) 7.48 KiB (runtime) >{128}< >{786}< [entry] [rendered]
runtime modules 7.48 KiB 10 modules
chunk (runtime: main) bundle.js (main) 98 bytes (javascript) 7.55 KiB (runtime) >{128}< >{786}< [entry] [rendered]
runtime modules 7.55 KiB 10 modules
./index.js 98 bytes [built] [code generated]
chunk (runtime: main) 459.bundle.js (c) 98 bytes <{128}> <{786}> >{128}< >{786}< [rendered]
./module-c.js 98 bytes [built] [code generated]
@ -818,16 +818,16 @@ exports[`StatsTestCases should print correct stats for graph-correctness-entries
"chunk (runtime: e1, e2) b.js (b) 49 bytes <{786}> >{459}< [rendered]
./module-b.js 49 bytes [built] [code generated]
import() ./module-b ./module-a.js 1:0-47
chunk (runtime: e1) e1.js (e1) 49 bytes (javascript) 7.5 KiB (runtime) >{786}< [entry] [rendered]
runtime modules 7.5 KiB 10 modules
chunk (runtime: e1) e1.js (e1) 49 bytes (javascript) 7.58 KiB (runtime) >{786}< [entry] [rendered]
runtime modules 7.58 KiB 10 modules
./e1.js 49 bytes [built] [code generated]
entry ./e1 e1
chunk (runtime: e1, e2) c.js (c) 49 bytes <{128}> <{621}> >{786}< [rendered]
./module-c.js 49 bytes [built] [code generated]
import() ./module-c ./e2.js 1:0-47
import() ./module-c ./module-b.js 1:0-47
chunk (runtime: e2) e2.js (e2) 49 bytes (javascript) 7.5 KiB (runtime) >{459}< [entry] [rendered]
runtime modules 7.5 KiB 10 modules
chunk (runtime: e2) e2.js (e2) 49 bytes (javascript) 7.58 KiB (runtime) >{459}< [entry] [rendered]
runtime modules 7.58 KiB 10 modules
./e2.js 49 bytes [built] [code generated]
entry ./e2 e2
chunk (runtime: e1, e2) a.js (a) 49 bytes <{257}> <{459}> >{128}< [rendered]
@ -841,8 +841,8 @@ exports[`StatsTestCases should print correct stats for graph-correctness-modules
"chunk (runtime: e1, e2) b.js (b) 179 bytes <{786}> >{459}< [rendered]
./module-b.js 179 bytes [built] [code generated]
import() ./module-b ./module-a.js 1:0-47
chunk (runtime: e1) e1.js (e1) 119 bytes (javascript) 7.77 KiB (runtime) >{786}< >{892}< [entry] [rendered]
runtime modules 7.77 KiB 11 modules
chunk (runtime: e1) e1.js (e1) 119 bytes (javascript) 7.84 KiB (runtime) >{786}< >{892}< [entry] [rendered]
runtime modules 7.84 KiB 11 modules
cacheable modules 119 bytes
./e1.js 70 bytes [built] [code generated]
entry ./e1 e1
@ -854,8 +854,8 @@ chunk (runtime: e1, e2) c.js (c) 49 bytes <{128}> <{621}> >{786}< [rendered]
./module-c.js 49 bytes [built] [code generated]
import() ./module-c ./e2.js 2:0-47
import() ./module-c ./module-b.js 1:0-47
chunk (runtime: e2) e2.js (e2) 119 bytes (javascript) 7.77 KiB (runtime) >{459}< >{892}< [entry] [rendered]
runtime modules 7.77 KiB 11 modules
chunk (runtime: e2) e2.js (e2) 119 bytes (javascript) 7.84 KiB (runtime) >{459}< >{892}< [entry] [rendered]
runtime modules 7.84 KiB 11 modules
cacheable modules 119 bytes
./e2.js 70 bytes [built] [code generated]
entry ./e2 e2
@ -924,7 +924,7 @@ webpack x.x.x compiled with 2 warnings in X ms"
`;
exports[`StatsTestCases should print correct stats for immutable 1`] = `
"asset 98c2a287d707b3235193.js 12.9 KiB [emitted] [immutable] (name: main)
"asset deb902e1c6c6d6c31fc1.js 13 KiB [emitted] [immutable] (name: main)
asset cd9e349e4fe2a6d0d4d0.js 884 bytes [emitted] [immutable]"
`;
@ -945,9 +945,9 @@ webpack x.x.x compiled successfully in X ms"
`;
exports[`StatsTestCases should print correct stats for import-weak 1`] = `
"asset entry.js 12.7 KiB [emitted] (name: entry)
"asset entry.js 12.8 KiB [emitted] (name: entry)
asset 836.js 138 bytes [emitted]
runtime modules 7.47 KiB 10 modules
runtime modules 7.54 KiB 10 modules
orphan modules 37 bytes [orphan] 1 module
cacheable modules 142 bytes
./entry.js 120 bytes [built] [code generated]
@ -956,7 +956,7 @@ webpack x.x.x compiled successfully in X ms"
`;
exports[`StatsTestCases should print correct stats for import-with-invalid-options-comments 1`] = `
"runtime modules 8.45 KiB 12 modules
"runtime modules 8.52 KiB 12 modules
cacheable modules 559 bytes
./index.js 50 bytes [built] [code generated]
./chunk.js 401 bytes [built] [code generated] [3 warnings]
@ -1017,9 +1017,9 @@ webpack x.x.x compiled successfully in X ms"
exports[`StatsTestCases should print correct stats for limit-chunk-count-plugin 1`] = `
"1 chunks:
asset bundle1.js 4.54 KiB [emitted] (name: main)
chunk (runtime: main) bundle1.js (main) 219 bytes (javascript) 1.68 KiB (runtime) <{179}> >{179}< [entry] [rendered]
runtime modules 1.68 KiB 4 modules
asset bundle1.js 4.65 KiB [emitted] (name: main)
chunk (runtime: main) bundle1.js (main) 219 bytes (javascript) 1.75 KiB (runtime) <{179}> >{179}< [entry] [rendered]
runtime modules 1.75 KiB 4 modules
cacheable modules 219 bytes
./a.js 22 bytes [dependent] [built] [code generated]
./b.js 22 bytes [dependent] [built] [code generated]
@ -1030,10 +1030,10 @@ exports[`StatsTestCases should print correct stats for limit-chunk-count-plugin
1 chunks (webpack x.x.x) compiled successfully in X ms
2 chunks:
asset bundle2.js 12.3 KiB [emitted] (name: main)
asset 459.bundle2.js 662 bytes [emitted] (name: c)
chunk (runtime: main) bundle2.js (main) 101 bytes (javascript) 7.48 KiB (runtime) >{459}< [entry] [rendered]
runtime modules 7.48 KiB 10 modules
asset bundle2.js 12.4 KiB [emitted] (name: main)
asset 459.bundle2.js 664 bytes [emitted] (name: c)
chunk (runtime: main) bundle2.js (main) 101 bytes (javascript) 7.55 KiB (runtime) >{459}< [entry] [rendered]
runtime modules 7.55 KiB 10 modules
./index.js 101 bytes [built] [code generated]
chunk (runtime: main) 459.bundle2.js (c) 118 bytes <{179}> <{459}> >{459}< [rendered]
dependent modules 44 bytes [dependent]
@ -1045,11 +1045,11 @@ exports[`StatsTestCases should print correct stats for limit-chunk-count-plugin
2 chunks (webpack x.x.x) compiled successfully in X ms
3 chunks:
asset bundle3.js 12.3 KiB [emitted] (name: main)
asset 459.bundle3.js 526 bytes [emitted] (name: c)
asset bundle3.js 12.4 KiB [emitted] (name: main)
asset 459.bundle3.js 528 bytes [emitted] (name: c)
asset 524.bundle3.js 206 bytes [emitted]
chunk (runtime: main) bundle3.js (main) 101 bytes (javascript) 7.48 KiB (runtime) >{459}< [entry] [rendered]
runtime modules 7.48 KiB 10 modules
chunk (runtime: main) bundle3.js (main) 101 bytes (javascript) 7.55 KiB (runtime) >{459}< [entry] [rendered]
runtime modules 7.55 KiB 10 modules
./index.js 101 bytes [built] [code generated]
chunk (runtime: main) 459.bundle3.js (c) 74 bytes <{179}> >{524}< [rendered]
./a.js 22 bytes [built] [code generated]
@ -1061,12 +1061,12 @@ exports[`StatsTestCases should print correct stats for limit-chunk-count-plugin
3 chunks (webpack x.x.x) compiled successfully in X ms
4 chunks:
asset bundle4.js 12.3 KiB [emitted] (name: main)
asset 459.bundle4.js 390 bytes [emitted] (name: c)
asset bundle4.js 12.4 KiB [emitted] (name: main)
asset 459.bundle4.js 392 bytes [emitted] (name: c)
asset 394.bundle4.js 206 bytes [emitted]
asset 524.bundle4.js 206 bytes [emitted]
chunk (runtime: main) bundle4.js (main) 101 bytes (javascript) 7.48 KiB (runtime) >{394}< >{459}< [entry] [rendered]
runtime modules 7.48 KiB 10 modules
chunk (runtime: main) bundle4.js (main) 101 bytes (javascript) 7.55 KiB (runtime) >{394}< >{459}< [entry] [rendered]
runtime modules 7.55 KiB 10 modules
./index.js 101 bytes [built] [code generated]
chunk (runtime: main) 394.bundle4.js 44 bytes <{179}> [rendered]
./a.js 22 bytes [built] [code generated]
@ -1427,10 +1427,10 @@ webpack x.x.x compiled successfully in X ms"
`;
exports[`StatsTestCases should print correct stats for named-chunks-plugin-async 1`] = `
"asset entry.js 12.1 KiB [emitted] (name: entry)
asset modules_a_js.js 312 bytes [emitted]
"asset entry.js 12.3 KiB [emitted] (name: entry)
asset modules_a_js.js 313 bytes [emitted]
asset modules_b_js.js 149 bytes [emitted]
runtime modules 7.47 KiB 10 modules
runtime modules 7.55 KiB 10 modules
cacheable modules 106 bytes
./entry.js 47 bytes [built] [code generated]
./modules/a.js 37 bytes [built] [code generated]
@ -1726,17 +1726,17 @@ webpack x.x.x compiled with <CLR=31,BOLD>3 errors</CLR> in X ms"
`;
exports[`StatsTestCases should print correct stats for prefetch 1`] = `
"asset main.js 15.6 KiB {179} [emitted] (name: main)
asset prefetched.js 553 bytes {505} [emitted] (name: prefetched)
"asset main.js 15.7 KiB {179} [emitted] (name: main)
asset prefetched.js 556 bytes {505} [emitted] (name: prefetched)
asset inner2.js 150 bytes {641} [emitted] (name: inner2)
asset inner.js 110 bytes {746} [emitted] (name: inner)
asset prefetched2.js 110 bytes {379} [emitted] (name: prefetched2)
asset prefetched3.js 110 bytes {220} [emitted] (name: prefetched3)
asset normal.js 109 bytes {30} [emitted] (name: normal)
Entrypoint main 15.6 KiB = main.js
Entrypoint main 15.7 KiB = main.js
prefetch: prefetched2.js {379} (name: prefetched2), prefetched.js {505} (name: prefetched), prefetched3.js {220} (name: prefetched3)
chunk {30} (runtime: main) normal.js (normal) 1 bytes <{179}> [rendered]
chunk {179} (runtime: main) main.js (main) 436 bytes (javascript) 8.89 KiB (runtime) >{30}< >{220}< >{379}< >{505}< (prefetch: {379} {505} {220}) [entry] [rendered]
chunk {179} (runtime: main) main.js (main) 436 bytes (javascript) 8.97 KiB (runtime) >{30}< >{220}< >{379}< >{505}< (prefetch: {379} {505} {220}) [entry] [rendered]
chunk {220} (runtime: main) prefetched3.js (prefetched3) 1 bytes <{179}> [rendered]
chunk {379} (runtime: main) prefetched2.js (prefetched2) 1 bytes <{179}> [rendered]
chunk {505} (runtime: main) prefetched.js (prefetched) 228 bytes <{179}> >{641}< >{746}< (prefetch: {641} {746}) [rendered]
@ -1751,7 +1751,7 @@ chunk (runtime: main) c1.js (c1) 1 bytes <{459}> [rendered]
chunk (runtime: main) b.js (b) 203 bytes <{179}> >{132}< >{751}< >{978}< (prefetch: {751} {132}) (preload: {978}) [rendered]
chunk (runtime: main) b3.js (b3) 1 bytes <{128}> [rendered]
chunk (runtime: main) a2.js (a2) 1 bytes <{786}> [rendered]
chunk (runtime: main) main.js (main) 195 bytes (javascript) 9.57 KiB (runtime) >{128}< >{459}< >{786}< (prefetch: {786} {128} {459}) [entry] [rendered]
chunk (runtime: main) main.js (main) 195 bytes (javascript) 9.64 KiB (runtime) >{128}< >{459}< >{786}< (prefetch: {786} {128} {459}) [entry] [rendered]
chunk (runtime: main) c.js (c) 134 bytes <{179}> >{3}< >{76}< (preload: {76} {3}) [rendered]
chunk (runtime: main) b1.js (b1) 1 bytes <{128}> [rendered]
chunk (runtime: main) a.js (a) 136 bytes <{179}> >{74}< >{178}< (prefetch: {74} {178}) [rendered]
@ -1759,17 +1759,17 @@ chunk (runtime: main) b2.js (b2) 1 bytes <{128}> [rendered]"
`;
exports[`StatsTestCases should print correct stats for preload 1`] = `
"asset main.js 14.9 KiB [emitted] (name: main)
asset preloaded.js 553 bytes [emitted] (name: preloaded)
"asset main.js 15 KiB [emitted] (name: main)
asset preloaded.js 556 bytes [emitted] (name: preloaded)
asset inner2.js 150 bytes [emitted] (name: inner2)
asset inner.js 110 bytes [emitted] (name: inner)
asset normal.js 109 bytes [emitted] (name: normal)
asset preloaded2.js 109 bytes [emitted] (name: preloaded2)
asset preloaded3.js 108 bytes [emitted] (name: preloaded3)
Entrypoint main 14.9 KiB = main.js
Entrypoint main 15 KiB = main.js
preload: preloaded2.js (name: preloaded2), preloaded.js (name: preloaded), preloaded3.js (name: preloaded3)
chunk (runtime: main) normal.js (normal) 1 bytes [rendered]
chunk (runtime: main) main.js (main) 424 bytes (javascript) 8.71 KiB (runtime) (preload: {363} {851} {355}) [entry] [rendered]
chunk (runtime: main) main.js (main) 424 bytes (javascript) 8.78 KiB (runtime) (preload: {363} {851} {355}) [entry] [rendered]
chunk (runtime: main) preloaded3.js (preloaded3) 1 bytes [rendered]
chunk (runtime: main) preloaded2.js (preloaded2) 1 bytes [rendered]
chunk (runtime: main) inner2.js (inner2) 2 bytes [rendered]

View File

@ -1,7 +1,7 @@
it("should correctly include indirect children in common chunk", function(done) {
Promise.all([
import('./pageA'),
import('./pageB').then(m => m.default)
import('./pageB')
]).then((imports) => {
expect(imports[0].default).toBe("reuse");
expect(imports[1].default).toBe("reuse");