@@ -60,30 +60,55 @@ function processFile(
60
60
return processHtmlFile ( store , file . code , file . filename , processed , seen )
61
61
}
62
62
63
- let [ js , importedFiles ] = processModule (
63
+ let {
64
+ code : js ,
65
+ importedFiles,
66
+ hasDynamicImport
67
+ } = processModule (
64
68
store ,
65
69
isSSR ? file . compiled . ssr : file . compiled . js ,
66
70
file . filename
67
71
)
72
+ processChildFiles (
73
+ store ,
74
+ importedFiles ,
75
+ hasDynamicImport ,
76
+ processed ,
77
+ seen ,
78
+ isSSR
79
+ )
68
80
// append css
69
81
if ( ! isSSR && file . compiled . css ) {
70
82
js += `\nwindow.__css__ += ${ JSON . stringify ( file . compiled . css ) } `
71
83
}
72
- // crawl child imports
73
- if ( importedFiles . size ) {
84
+
85
+ // push self
86
+ processed . push ( js )
87
+ }
88
+
89
+ function processChildFiles (
90
+ store : Store ,
91
+ importedFiles : Set < string > ,
92
+ hasDynamicImport : boolean ,
93
+ processed : string [ ] ,
94
+ seen : Set < File > ,
95
+ isSSR : boolean
96
+ ) {
97
+ if ( hasDynamicImport ) {
98
+ // process all files
99
+ for ( const file of Object . values ( store . state . files ) ) {
100
+ if ( seen . has ( file ) ) continue
101
+ processFile ( store , file , processed , seen , isSSR )
102
+ }
103
+ } else if ( importedFiles . size > 0 ) {
104
+ // crawl child imports
74
105
for ( const imported of importedFiles ) {
75
106
processFile ( store , store . state . files [ imported ] , processed , seen , isSSR )
76
107
}
77
108
}
78
- // push self
79
- processed . push ( js )
80
109
}
81
110
82
- function processModule (
83
- store : Store ,
84
- src : string ,
85
- filename : string
86
- ) : [ string , Set < string > ] {
111
+ function processModule ( store : Store , src : string , filename : string ) {
87
112
const s = new MagicString ( src )
88
113
89
114
const ast = babelParse ( src , {
@@ -255,11 +280,13 @@ function processModule(
255
280
}
256
281
257
282
// 4. convert dynamic imports
258
- ; ( walk as any ) ( ast , {
283
+ let hasDynamicImport = false
284
+ walk ( ast , {
259
285
enter ( node : Node , parent : Node ) {
260
286
if ( node . type === 'Import' && parent . type === 'CallExpression' ) {
261
287
const arg = parent . arguments [ 0 ]
262
288
if ( arg . type === 'StringLiteral' && arg . value . startsWith ( './' ) ) {
289
+ hasDynamicImport = true
263
290
s . overwrite ( node . start ! , node . start ! + 6 , dynamicImportKey )
264
291
s . overwrite (
265
292
arg . start ! ,
@@ -271,7 +298,11 @@ function processModule(
271
298
}
272
299
} )
273
300
274
- return [ s . toString ( ) , importedFiles ]
301
+ return {
302
+ code : s . toString ( ) ,
303
+ importedFiles,
304
+ hasDynamicImport
305
+ }
275
306
}
276
307
277
308
const scriptRE = / < s c r i p t \b (?: \s [ ^ > ] * > | > ) ( [ ^ ] * ?) < \/ s c r i p t > / gi
@@ -289,12 +320,19 @@ function processHtmlFile(
289
320
let jsCode = ''
290
321
const html = src
291
322
. replace ( scriptModuleRE , ( _ , content ) => {
292
- const [ code , importedFiles ] = processModule ( store , content , filename )
293
- if ( importedFiles . size ) {
294
- for ( const imported of importedFiles ) {
295
- processFile ( store , store . state . files [ imported ] , deps , seen , false )
296
- }
297
- }
323
+ const { code, importedFiles, hasDynamicImport } = processModule (
324
+ store ,
325
+ content ,
326
+ filename
327
+ )
328
+ processChildFiles (
329
+ store ,
330
+ importedFiles ,
331
+ hasDynamicImport ,
332
+ deps ,
333
+ seen ,
334
+ false
335
+ )
298
336
jsCode += '\n' + code
299
337
return ''
300
338
} )
0 commit comments