@@ -64,11 +64,17 @@ export class ModuleGraph {
64
64
/**
65
65
* @internal
66
66
*/
67
- _unresolvedUrlToModuleMap = new Map < string , ModuleNode > ( )
67
+ _unresolvedUrlToModuleMap = new Map <
68
+ string ,
69
+ Promise < ModuleNode > | ModuleNode
70
+ > ( )
68
71
/**
69
72
* @internal
70
73
*/
71
- _ssrUnresolvedUrlToModuleMap = new Map < string , ModuleNode > ( )
74
+ _ssrUnresolvedUrlToModuleMap = new Map <
75
+ string ,
76
+ Promise < ModuleNode > | ModuleNode
77
+ > ( )
72
78
73
79
constructor (
74
80
private resolveId : (
@@ -255,37 +261,40 @@ export class ModuleGraph {
255
261
if ( mod ) {
256
262
return mod
257
263
}
258
- const [ url , resolvedId , meta ] = await this . _resolveUrl (
259
- rawUrl ,
260
- ssr ,
261
- resolved ,
262
- )
263
- mod = this . idToModuleMap . get ( resolvedId )
264
- if ( ! mod ) {
265
- mod = new ModuleNode ( url , setIsSelfAccepting )
266
- if ( meta ) mod . meta = meta
267
- this . urlToModuleMap . set ( url , mod )
268
- mod . id = resolvedId
269
- this . idToModuleMap . set ( resolvedId , mod )
270
- const file = ( mod . file = cleanUrl ( resolvedId ) )
271
- let fileMappedModules = this . fileToModulesMap . get ( file )
272
- if ( ! fileMappedModules ) {
273
- fileMappedModules = new Set ( )
274
- this . fileToModulesMap . set ( file , fileMappedModules )
264
+ const modPromise = ( async ( ) => {
265
+ const [ url , resolvedId , meta ] = await this . _resolveUrl (
266
+ rawUrl ,
267
+ ssr ,
268
+ resolved ,
269
+ )
270
+ mod = this . idToModuleMap . get ( resolvedId )
271
+ if ( ! mod ) {
272
+ mod = new ModuleNode ( url , setIsSelfAccepting )
273
+ if ( meta ) mod . meta = meta
274
+ this . urlToModuleMap . set ( url , mod )
275
+ mod . id = resolvedId
276
+ this . idToModuleMap . set ( resolvedId , mod )
277
+ const file = ( mod . file = cleanUrl ( resolvedId ) )
278
+ let fileMappedModules = this . fileToModulesMap . get ( file )
279
+ if ( ! fileMappedModules ) {
280
+ fileMappedModules = new Set ( )
281
+ this . fileToModulesMap . set ( file , fileMappedModules )
282
+ }
283
+ fileMappedModules . add ( mod )
275
284
}
276
- fileMappedModules . add ( mod )
277
- }
278
- // multiple urls can map to the same module and id, make sure we register
279
- // the url to the existing module in that case
280
- else if ( ! this . urlToModuleMap . has ( url ) ) {
281
- this . urlToModuleMap . set ( url , mod )
282
- }
285
+ // multiple urls can map to the same module and id, make sure we register
286
+ // the url to the existing module in that case
287
+ else if ( ! this . urlToModuleMap . has ( url ) ) {
288
+ this . urlToModuleMap . set ( url , mod )
289
+ }
290
+ this . _setUnresolvedUrlToModule ( rawUrl , mod , ssr )
291
+ return mod
292
+ } ) ( )
283
293
284
294
// Also register the clean url to the module, so that we can short-circuit
285
295
// resolving the same url twice
286
- this . _setUnresolvedUrlToModule ( rawUrl , mod , ssr )
287
-
288
- return mod
296
+ this . _setUnresolvedUrlToModule ( rawUrl , modPromise , ssr )
297
+ return modPromise
289
298
}
290
299
291
300
// some deps, like a css file referenced via @import, don't have its own
@@ -319,7 +328,7 @@ export class ModuleGraph {
319
328
// the same module
320
329
async resolveUrl ( url : string , ssr ?: boolean ) : Promise < ResolvedUrl > {
321
330
url = removeImportQuery ( removeTimestampQuery ( url ) )
322
- const mod = this . _getUnresolvedUrlToModule ( url , ssr )
331
+ const mod = await this . _getUnresolvedUrlToModule ( url , ssr )
323
332
if ( mod ?. id ) {
324
333
return [ mod . url , mod . id , mod . meta ]
325
334
}
@@ -332,15 +341,19 @@ export class ModuleGraph {
332
341
_getUnresolvedUrlToModule (
333
342
url : string ,
334
343
ssr ?: boolean ,
335
- ) : ModuleNode | undefined {
344
+ ) : Promise < ModuleNode > | ModuleNode | undefined {
336
345
return (
337
346
ssr ? this . _ssrUnresolvedUrlToModuleMap : this . _unresolvedUrlToModuleMap
338
347
) . get ( url )
339
348
}
340
349
/**
341
350
* @internal
342
351
*/
343
- _setUnresolvedUrlToModule ( url : string , mod : ModuleNode , ssr ?: boolean ) : void {
352
+ _setUnresolvedUrlToModule (
353
+ url : string ,
354
+ mod : Promise < ModuleNode > | ModuleNode ,
355
+ ssr ?: boolean ,
356
+ ) : void {
344
357
; ( ssr
345
358
? this . _ssrUnresolvedUrlToModuleMap
346
359
: this . _unresolvedUrlToModuleMap
0 commit comments