@@ -20,12 +20,13 @@ class AsyncModuleRuntimeModule extends HelperRuntimeModule {
2020 const { runtimeTemplate } = this . compilation ;
2121 const fn = RuntimeGlobals . asyncModule ;
2222 return Template . asString ( [
23- 'var webpackThen = typeof Symbol === "function" ? Symbol("webpack then ") : "__webpack_then__ ";' ,
23+ 'var webpackQueues = typeof Symbol === "function" ? Symbol("webpack queues ") : "__webpack_queues__ ";' ,
2424 'var webpackExports = typeof Symbol === "function" ? Symbol("webpack exports") : "__webpack_exports__";' ,
2525 'var webpackError = typeof Symbol === "function" ? Symbol("webpack error") : "__webpack_error__";' ,
26- `var completeQueue = ${ runtimeTemplate . basicFunction ( "queue" , [
27- "if(queue) {" ,
26+ `var resolveQueue = ${ runtimeTemplate . basicFunction ( "queue" , [
27+ "if(queue && !queue.d ) {" ,
2828 Template . indent ( [
29+ "queue.d = 1;" ,
2930 `queue.forEach(${ runtimeTemplate . expressionFunction (
3031 "fn.r--" ,
3132 "fn"
@@ -37,91 +38,58 @@ class AsyncModuleRuntimeModule extends HelperRuntimeModule {
3738 ] ) ,
3839 "}"
3940 ] ) } `,
40- `var completeFunction = ${ runtimeTemplate . expressionFunction (
41- "!--fn.r && fn()" ,
42- "fn"
43- ) } ;`,
44- `var queueFunction = ${ runtimeTemplate . expressionFunction (
45- "queue ? queue.push(fn) : completeFunction(fn)" ,
46- "queue, fn"
47- ) } ;`,
4841 `var wrapDeps = ${ runtimeTemplate . returningFunction (
4942 `deps.map(${ runtimeTemplate . basicFunction ( "dep" , [
5043 'if(dep !== null && typeof dep === "object") {' ,
5144 Template . indent ( [
52- "if(dep[webpackThen ]) return dep;" ,
45+ "if(dep[webpackQueues ]) return dep;" ,
5346 "if(dep.then) {" ,
5447 Template . indent ( [
5548 "var queue = [];" ,
49+ "queue.d = 0;" ,
5650 `dep.then(${ runtimeTemplate . basicFunction ( "r" , [
5751 "obj[webpackExports] = r;" ,
58- "completeQueue(queue);" ,
59- "queue = 0;"
52+ "resolveQueue(queue);"
6053 ] ) } , ${ runtimeTemplate . basicFunction ( "e" , [
6154 "obj[webpackError] = e;" ,
62- "completeQueue(queue);" ,
63- "queue = 0;"
55+ "resolveQueue(queue);"
6456 ] ) } );`,
6557 "var obj = {};" ,
66- `obj[webpackThen ] = ${ runtimeTemplate . expressionFunction (
67- "queueFunction (queue, fn), dep['catch'](reject)" ,
68- "fn, reject "
58+ `obj[webpackQueues ] = ${ runtimeTemplate . expressionFunction (
59+ `fn (queue)` ,
60+ "fn"
6961 ) } ;`,
7062 "return obj;"
7163 ] ) ,
7264 "}"
7365 ] ) ,
7466 "}" ,
7567 "var ret = {};" ,
76- `ret[webpackThen] = ${ runtimeTemplate . expressionFunction (
77- "completeFunction(fn)" ,
78- "fn"
79- ) } ;`,
68+ `ret[webpackQueues] = ${ runtimeTemplate . emptyFunction ( ) } ;` ,
8069 "ret[webpackExports] = dep;" ,
8170 "return ret;"
8271 ] ) } )`,
8372 "deps"
8473 ) } ;`,
8574 `${ fn } = ${ runtimeTemplate . basicFunction ( "module, body, hasAwait" , [
86- "var queue = hasAwait && [];" ,
75+ "var queue;" ,
76+ "hasAwait && ((queue = []).d = 1);" ,
77+ "if(queue) queue.moduleId = module.id;" ,
78+ "var depQueues = new Set();" ,
8779 "var exports = module.exports;" ,
8880 "var currentDeps;" ,
8981 "var outerResolve;" ,
9082 "var reject;" ,
91- "var isEvaluating = true;" ,
92- "var nested = false;" ,
93- `var whenAll = ${ runtimeTemplate . basicFunction (
94- "deps, onResolve, onReject" ,
95- [
96- "if (nested) return;" ,
97- "nested = true;" ,
98- "onResolve.r += deps.length;" ,
99- `deps.map(${ runtimeTemplate . expressionFunction (
100- "dep[webpackThen](onResolve, onReject)" ,
101- "dep, i"
102- ) } );`,
103- "nested = false;"
104- ]
105- ) } ;`,
10683 `var promise = new Promise(${ runtimeTemplate . basicFunction (
10784 "resolve, rej" ,
108- [
109- "reject = rej;" ,
110- `outerResolve = ${ runtimeTemplate . expressionFunction (
111- "resolve(exports), completeQueue(queue), queue = 0"
112- ) } ;`
113- ]
85+ [ "reject = rej;" , "outerResolve = resolve;" ]
11486 ) } );`,
11587 "promise[webpackExports] = exports;" ,
116- `promise[webpackThen] = ${ runtimeTemplate . basicFunction (
117- "fn, rejectFn" ,
118- [
119- "if (isEvaluating) { return completeFunction(fn); }" ,
120- "if (currentDeps) whenAll(currentDeps, fn, rejectFn);" ,
121- "queueFunction(queue, fn);" ,
122- "promise['catch'](rejectFn);"
123- ]
88+ `promise[webpackQueues] = ${ runtimeTemplate . expressionFunction (
89+ `queue && fn(queue), depQueues.forEach(fn), promise["catch"](${ runtimeTemplate . emptyFunction ( ) } )` ,
90+ "fn"
12491 ) } ;`,
92+ "promise.moduleId = module.id;" ,
12593 "module.exports = promise;" ,
12694 `body(${ runtimeTemplate . basicFunction ( "deps" , [
12795 "currentDeps = wrapDeps(deps);" ,
@@ -133,21 +101,29 @@ class AsyncModuleRuntimeModule extends HelperRuntimeModule {
133101 ] ) } )`
134102 ) } `,
135103 `var promise = new Promise(${ runtimeTemplate . basicFunction (
136- "resolve, reject " ,
104+ "resolve" ,
137105 [
138106 `fn = ${ runtimeTemplate . expressionFunction (
139- "resolve(getResult)"
107+ "resolve(getResult)" ,
108+ ""
140109 ) } ;`,
141110 "fn.r = 0;" ,
142- "whenAll(currentDeps, fn, reject);"
111+ `var fnQueue = ${ runtimeTemplate . expressionFunction (
112+ "q !== queue && !depQueues.has(q) && (depQueues.add(q), q && !q.d && (fn.r++, q.push(fn)))" ,
113+ "q"
114+ ) } ;`,
115+ `currentDeps.map(${ runtimeTemplate . expressionFunction (
116+ "dep[webpackQueues](fnQueue)" ,
117+ "dep"
118+ ) } );`
143119 ]
144120 ) } );`,
145121 "return fn.r ? promise : getResult();"
146122 ] ) } , ${ runtimeTemplate . expressionFunction (
147- "err && reject(promise[webpackError] = err), outerResolve()" ,
123+ "( err ? reject(promise[webpackError] = err) : outerResolve(exports)), resolveQueue(queue )" ,
148124 "err"
149125 ) } );`,
150- "isEvaluating = false ;"
126+ "queue && (queue.d = 0) ;"
151127 ] ) } ;`
152128 ] ) ;
153129 }
0 commit comments