@@ -24,7 +24,6 @@ import {
24
24
runOptimizeDeps
25
25
} from '.'
26
26
import type {
27
- DepOptimizationMetadata ,
28
27
DepOptimizationProcessing ,
29
28
DepsOptimizer ,
30
29
OptimizedDepInfo
@@ -39,18 +38,36 @@ const isDebugEnabled = _debug('vite:deps').enabled
39
38
const debounceMs = 100
40
39
41
40
const depsOptimizerMap = new WeakMap < ResolvedConfig , DepsOptimizer > ( )
41
+ const devSsrDepsOptimizerMap = new WeakMap < ResolvedConfig , DepsOptimizer > ( )
42
42
43
43
export function getDepsOptimizer (
44
- config : ResolvedConfig
44
+ config : ResolvedConfig ,
45
+ type : { ssr ?: boolean }
45
46
) : DepsOptimizer | undefined {
46
47
// Workers compilation shares the DepsOptimizer from the main build
47
- return depsOptimizerMap . get ( config . mainConfig || config )
48
+ const isDevSsr = type . ssr && config . command !== 'build'
49
+ return ( isDevSsr ? devSsrDepsOptimizerMap : depsOptimizerMap ) . get (
50
+ config . mainConfig || config
51
+ )
48
52
}
49
53
50
54
export async function initDepsOptimizer (
51
55
config : ResolvedConfig ,
52
56
server ?: ViteDevServer
53
- ) : Promise < DepsOptimizer > {
57
+ ) : Promise < void > {
58
+ await createDepsOptimizer ( config , server )
59
+ }
60
+
61
+ export async function initDevSsrDepsOptimizer (
62
+ config : ResolvedConfig
63
+ ) : Promise < void > {
64
+ await createDevSsrDepsOptimizer ( config )
65
+ }
66
+
67
+ async function createDepsOptimizer (
68
+ config : ResolvedConfig ,
69
+ server ?: ViteDevServer
70
+ ) : Promise < void > {
54
71
const { logger } = config
55
72
const isBuild = config . command === 'build'
56
73
@@ -62,18 +79,11 @@ export async function initDepsOptimizer(
62
79
63
80
let handle : NodeJS . Timeout | undefined
64
81
65
- let ssrServerDepsMetadata : DepOptimizationMetadata
66
- let _metadata =
82
+ let metadata =
67
83
cachedMetadata || initDepsOptimizerMetadata ( config , sessionTimestamp )
68
84
69
85
const depsOptimizer : DepsOptimizer = {
70
- metadata : ( options : { ssr : boolean } ) => {
71
- if ( isBuild || ! options . ssr ) {
72
- return _metadata
73
- } else {
74
- return ssrServerDepsMetadata
75
- }
76
- } ,
86
+ metadata,
77
87
registerMissingImport,
78
88
run : ( ) => debouncedProcessing ( 0 ) ,
79
89
isOptimizedDepFile : ( id : string ) => isOptimizedDepFile ( id , config ) ,
@@ -89,10 +99,6 @@ export async function initDepsOptimizer(
89
99
90
100
depsOptimizerMap . set ( config , depsOptimizer )
91
101
92
- if ( ! isBuild && config . ssr ) {
93
- ssrServerDepsMetadata = await optimizeServerSsrDeps ( config )
94
- }
95
-
96
102
let newDepsDiscovered = false
97
103
98
104
let newDepsToLog : string [ ] = [ ]
@@ -137,7 +143,6 @@ export async function initDepsOptimizer(
137
143
config ,
138
144
sessionTimestamp
139
145
)
140
- const metadata = _metadata
141
146
for ( const depInfo of Object . values ( discovered ) ) {
142
147
addOptimizedDepInfo ( metadata , 'discovered' , {
143
148
...depInfo ,
@@ -155,8 +160,6 @@ export async function initDepsOptimizer(
155
160
try {
156
161
debug ( colors . green ( `scanning for dependencies...` ) )
157
162
158
- const metadata = _metadata
159
-
160
163
const discovered = await discoverProjectDependencies (
161
164
config ,
162
165
sessionTimestamp
@@ -201,7 +204,7 @@ export async function initDepsOptimizer(
201
204
// Ensure that a rerun will not be issued for current discovered deps
202
205
if ( handle ) clearTimeout ( handle )
203
206
204
- if ( Object . keys ( _metadata . discovered ) . length === 0 ) {
207
+ if ( Object . keys ( metadata . discovered ) . length === 0 ) {
205
208
currentlyProcessing = false
206
209
return
207
210
}
@@ -217,8 +220,6 @@ export async function initDepsOptimizer(
217
220
// if the rerun fails, _metadata remains untouched, current discovered
218
221
// deps are cleaned, and a fullReload is issued
219
222
220
- let metadata = _metadata
221
-
222
223
// All deps, previous known and newly discovered are rebundled,
223
224
// respect insertion order to keep the metadata file stable
224
225
@@ -324,7 +325,7 @@ export async function initDepsOptimizer(
324
325
)
325
326
}
326
327
327
- metadata = _metadata = newData
328
+ metadata = depsOptimizer . metadata = newData
328
329
resolveEnqueuedProcessingPromises ( )
329
330
}
330
331
@@ -418,7 +419,7 @@ export async function initDepsOptimizer(
418
419
// debounce time to wait for new missing deps finished, issue a new
419
420
// optimization of deps (both old and newly found) once the previous
420
421
// optimizeDeps processing is finished
421
- const deps = Object . keys ( _metadata . discovered )
422
+ const deps = Object . keys ( metadata . discovered )
422
423
const depsString = depsLogString ( deps )
423
424
debug ( colors . green ( `new dependencies found: ${ depsString } ` ) )
424
425
runOptimizer ( )
@@ -449,7 +450,6 @@ export async function initDepsOptimizer(
449
450
`Error: ${ id } is a missing dependency in SSR dev server, it needs to be added to optimizeDeps.include`
450
451
)
451
452
}
452
- const metadata = _metadata
453
453
const optimized = metadata . optimized [ id ]
454
454
if ( optimized ) {
455
455
return optimized
@@ -539,7 +539,7 @@ export async function initDepsOptimizer(
539
539
if ( ! firstRunEnsured && ! firstRunCalled && registeredIds . length === 0 ) {
540
540
setTimeout ( ( ) => {
541
541
if ( ! firstRunCalled && registeredIds . length === 0 ) {
542
- getDepsOptimizer ( config ) ?. run ( )
542
+ debouncedProcessing ( 0 ) // queue the optimizer run
543
543
}
544
544
} , runOptimizerIfIdleAfterMs )
545
545
}
@@ -580,7 +580,7 @@ export async function initDepsOptimizer(
580
580
if ( registeredIds . length > 0 ) {
581
581
runOptimizerWhenIdle ( )
582
582
} else {
583
- getDepsOptimizer ( config ) ?. run ( )
583
+ debouncedProcessing ( 0 ) // queue the optimizer run
584
584
}
585
585
}
586
586
}
@@ -596,8 +596,34 @@ export async function initDepsOptimizer(
596
596
}
597
597
}
598
598
}
599
+ }
599
600
600
- return depsOptimizer
601
+ async function createDevSsrDepsOptimizer (
602
+ config : ResolvedConfig
603
+ ) : Promise < void > {
604
+ const metadata = await optimizeServerSsrDeps ( config )
605
+ const depsOptimizer = {
606
+ metadata,
607
+ isOptimizedDepFile : ( id : string ) => isOptimizedDepFile ( id , config ) ,
608
+ isOptimizedDepUrl : createIsOptimizedDepUrl ( config ) ,
609
+ getOptimizedDepId : ( depInfo : OptimizedDepInfo ) =>
610
+ `${ depInfo . file } ?v=${ depInfo . browserHash } ` ,
611
+
612
+ registerMissingImport : ( ) => {
613
+ throw new Error (
614
+ 'Vite Internal Error: registerMissingImport is not supported in dev SSR'
615
+ )
616
+ } ,
617
+ // noop, there is no scanning during dev SSR
618
+ // the optimizer blocks the server start
619
+ run : ( ) => { } ,
620
+ registerWorkersSource : ( id : string ) => { } ,
621
+ delayDepsOptimizerUntil : ( id : string , done : ( ) => Promise < any > ) => { } ,
622
+ resetRegisteredIds : ( ) => { } ,
623
+ ensureFirstRun : ( ) => { } ,
624
+ options : config . optimizeDeps
625
+ }
626
+ devSsrDepsOptimizerMap . set ( config , depsOptimizer )
601
627
}
602
628
603
629
export async function preTransformOptimizeDepsEntries (
0 commit comments