Skip to content

Commit 1e73ca7

Browse files
authored
Merge pull request #15266 from webpack/bugfix/throwing-in-async-modules
fix handling of errors thrown in async modules
2 parents 4abe329 + 804f49c commit 1e73ca7

15 files changed

Lines changed: 120 additions & 33 deletions

File tree

lib/async-modules/AwaitDependenciesInitFragment.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ class AwaitDependenciesInitFragment extends InitFragment {
3030
}
3131

3232
merge(other) {
33-
const promises = new Set(this.promises);
34-
for (const p of other.promises) {
33+
const promises = new Set(other.promises);
34+
for (const p of this.promises) {
3535
promises.add(p);
3636
}
3737
return new AwaitDependenciesInitFragment(promises);
@@ -51,7 +51,7 @@ class AwaitDependenciesInitFragment extends InitFragment {
5151
for (const p of promises) {
5252
return Template.asString([
5353
`var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([${p}]);`,
54-
`${p} = (__webpack_async_dependencies__.then ? await __webpack_async_dependencies__ : __webpack_async_dependencies__)[0];`,
54+
`${p} = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__)[0];`,
5555
""
5656
]);
5757
}
@@ -60,7 +60,7 @@ class AwaitDependenciesInitFragment extends InitFragment {
6060
// TODO check if destructuring is supported
6161
return Template.asString([
6262
`var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([${sepPromises}]);`,
63-
`([${sepPromises}] = __webpack_async_dependencies__.then ? await __webpack_async_dependencies__ : __webpack_async_dependencies__);`,
63+
`([${sepPromises}] = __webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__);`,
6464
""
6565
]);
6666
}

lib/dependencies/HarmonyCompatibilityDependency.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,14 +74,14 @@ HarmonyCompatibilityDependency.Template = class HarmonyExportDependencyTemplate
7474
initFragments.push(
7575
new InitFragment(
7676
runtimeTemplate.supportsArrowFunction()
77-
? `${RuntimeGlobals.asyncModule}(${module.moduleArgument}, async (__webpack_handle_async_dependencies__) => {\n`
78-
: `${RuntimeGlobals.asyncModule}(${module.moduleArgument}, async function (__webpack_handle_async_dependencies__) {\n`,
77+
? `${RuntimeGlobals.asyncModule}(${module.moduleArgument}, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try {\n`
78+
: `${RuntimeGlobals.asyncModule}(${module.moduleArgument}, async function (__webpack_handle_async_dependencies__, __webpack_async_result__) { try {\n`,
7979
InitFragment.STAGE_ASYNC_BOUNDARY,
8080
0,
8181
undefined,
82-
module.buildMeta.async
83-
? `\n__webpack_handle_async_dependencies__();\n}, 1);`
84-
: "\n});"
82+
`\n__webpack_async_result__();\n} catch(e) { __webpack_async_result__(e); } }${
83+
module.buildMeta.async ? ", 1" : ""
84+
});`
8585
)
8686
);
8787
}

lib/runtime/AsyncModuleRuntimeModule.js

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ class AsyncModuleRuntimeModule extends HelperRuntimeModule {
2222
return Template.asString([
2323
'var webpackThen = typeof Symbol === "function" ? Symbol("webpack then") : "__webpack_then__";',
2424
'var webpackExports = typeof Symbol === "function" ? Symbol("webpack exports") : "__webpack_exports__";',
25+
'var webpackError = typeof Symbol === "function" ? Symbol("webpack error") : "__webpack_error__";',
2526
`var completeQueue = ${runtimeTemplate.basicFunction("queue", [
2627
"if(queue) {",
2728
Template.indent([
@@ -56,9 +57,13 @@ class AsyncModuleRuntimeModule extends HelperRuntimeModule {
5657
"obj[webpackExports] = r;",
5758
"completeQueue(queue);",
5859
"queue = 0;"
60+
])}, ${runtimeTemplate.basicFunction("e", [
61+
"obj[webpackError] = e;",
62+
"completeQueue(queue);",
63+
"queue = 0;"
5964
])});`,
60-
`var obj = {};
61-
obj[webpackThen] = ${runtimeTemplate.expressionFunction(
65+
"var obj = {};",
66+
`obj[webpackThen] = ${runtimeTemplate.expressionFunction(
6267
"queueFunction(queue, fn), dep['catch'](reject)",
6368
"fn, reject"
6469
)};`,
@@ -67,13 +72,13 @@ class AsyncModuleRuntimeModule extends HelperRuntimeModule {
6772
"}"
6873
]),
6974
"}",
70-
`var ret = {};
71-
ret[webpackThen] = ${runtimeTemplate.expressionFunction(
75+
"var ret = {};",
76+
`ret[webpackThen] = ${runtimeTemplate.expressionFunction(
7277
"completeFunction(fn)",
7378
"fn"
74-
)};
75-
ret[webpackExports] = dep;
76-
return ret;`
79+
)};`,
80+
"ret[webpackExports] = dep;",
81+
"return ret;"
7782
])})`,
7883
"deps"
7984
)};`,
@@ -119,24 +124,29 @@ class AsyncModuleRuntimeModule extends HelperRuntimeModule {
119124
)};`,
120125
"module.exports = promise;",
121126
`body(${runtimeTemplate.basicFunction("deps", [
122-
"if(!deps) return outerResolve();",
123127
"currentDeps = wrapDeps(deps);",
124-
"var fn, result;",
128+
"var fn;",
129+
`var getResult = ${runtimeTemplate.returningFunction(
130+
`currentDeps.map(${runtimeTemplate.basicFunction("d", [
131+
"if(d[webpackError]) throw d[webpackError];",
132+
"return d[webpackExports];"
133+
])})`
134+
)}`,
125135
`var promise = new Promise(${runtimeTemplate.basicFunction(
126136
"resolve, reject",
127137
[
128138
`fn = ${runtimeTemplate.expressionFunction(
129-
`resolve(result = currentDeps.map(${runtimeTemplate.returningFunction(
130-
"d[webpackExports]",
131-
"d"
132-
)}))`
139+
"resolve(getResult)"
133140
)};`,
134141
"fn.r = 0;",
135142
"whenAll(currentDeps, fn, reject);"
136143
]
137144
)});`,
138-
"return fn.r ? promise : result;"
139-
])}).then(outerResolve, reject);`,
145+
"return fn.r ? promise : getResult();"
146+
])}, ${runtimeTemplate.expressionFunction(
147+
"err && reject(promise[webpackError] = err), outerResolve()",
148+
"err"
149+
)});`,
140150
"isEvaluating = false;"
141151
])};`
142152
]);

lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -167,14 +167,20 @@ class AsyncWebAssemblyJavascriptGenerator extends Generator {
167167
)}`,
168168
`${RuntimeGlobals.asyncModule}(${
169169
module.moduleArgument
170-
}, ${runtimeTemplate.basicFunction(
171-
"__webpack_handle_async_dependencies__",
170+
}, async ${runtimeTemplate.basicFunction(
171+
"__webpack_handle_async_dependencies__, __webpack_async_result__",
172172
[
173+
"try {",
173174
importsCode,
174175
`var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([${promises.join(
175176
", "
176177
)}]);`,
177-
"return __webpack_async_dependencies__.then ? __webpack_async_dependencies__.then(__webpack_instantiate__) : __webpack_instantiate__(__webpack_async_dependencies__);"
178+
`var [${promises.join(
179+
", "
180+
)}] = __webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__;`,
181+
`${importsCompatCode}await ${instantiateCall};`,
182+
"__webpack_async_result__();",
183+
"} catch(e) { __webpack_async_result__(e); }"
178184
]
179185
)}, 1);`
180186
])

test/__snapshots__/StatsTestCases.basictest.js.snap

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4554,9 +4554,9 @@ webpack x.x.x compiled with 1 warning in X ms"
45544554
`;
45554555
45564556
exports[`StatsTestCases should print correct stats for wasm-explorer-examples-sync 1`] = `
4557-
"assets by path *.js 21.8 KiB
4558-
asset bundle.js 16.4 KiB [emitted] (name: main)
4559-
asset 325.bundle.js 3.79 KiB [emitted]
4557+
"assets by path *.js 22.2 KiB
4558+
asset bundle.js 16.7 KiB [emitted] (name: main)
4559+
asset 325.bundle.js 3.9 KiB [emitted]
45604560
asset 795.bundle.js 557 bytes [emitted]
45614561
asset 526.bundle.js 366 bytes [emitted] (id hint: vendors)
45624562
asset 189.bundle.js 243 bytes [emitted]
@@ -4571,8 +4571,8 @@ assets by path *.wasm 1.37 KiB
45714571
asset 0301cb3f9f4151b567f5.module.wasm 120 bytes [emitted] [immutable]
45724572
chunk (runtime: main) 20.bundle.js 50 bytes (javascript) 531 bytes (webassembly) [rendered]
45734573
./duff.wasm 50 bytes (javascript) 531 bytes (webassembly) [built] [code generated]
4574-
chunk (runtime: main) bundle.js (main) 586 bytes (javascript) 9.25 KiB (runtime) [entry] [rendered]
4575-
runtime modules 9.25 KiB 11 modules
4574+
chunk (runtime: main) bundle.js (main) 586 bytes (javascript) 9.49 KiB (runtime) [entry] [rendered]
4575+
runtime modules 9.49 KiB 11 modules
45764576
./index.js 586 bytes [built] [code generated]
45774577
chunk (runtime: main) 189.bundle.js 50 bytes (javascript) 156 bytes (webassembly) [rendered]
45784578
./Q_rsqrt.wasm 50 bytes (javascript) 156 bytes (webassembly) [built] [code generated]
@@ -4586,7 +4586,7 @@ chunk (runtime: main) 526.bundle.js (id hint: vendors) 34 bytes [rendered] split
45864586
chunk (runtime: main) 795.bundle.js 110 bytes (javascript) 444 bytes (webassembly) [rendered]
45874587
./fact.wasm 50 bytes (javascript) 154 bytes (webassembly) [built] [code generated]
45884588
./fast-math.wasm 60 bytes (javascript) 290 bytes (webassembly) [built] [code generated]
4589-
runtime modules 9.25 KiB 11 modules
4589+
runtime modules 9.49 KiB 11 modules
45904590
cacheable modules 2.31 KiB (javascript) 1.37 KiB (webassembly)
45914591
webassembly modules 310 bytes (javascript) 1.37 KiB (webassembly)
45924592
./Q_rsqrt.wasm 50 bytes (javascript) 156 bytes (webassembly) [built] [code generated]
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import x from "./shared";
2+
3+
export default x + " world";
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import x from "./shared";
2+
3+
export default x + " world";
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
it("should allow to import an async module twice", async () => {
2+
const result = await require("./main");
3+
expect(result.default).toBe("hello world, hello world");
4+
});
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import a from "./a";
2+
import b from "./b";
3+
4+
export default a + ", " + b;
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
await 1;
2+
await 1;
3+
export default "hello";

0 commit comments

Comments
 (0)