1
- import type { Manifest , ManifestChunk } from 'vite'
2
1
import { withLeadingSlash } from 'ufo'
3
- import { renderLinkToString , renderLinkToHeader , renderScriptToString , parseResource } from './utils '
4
- import type { LinkAttributes , ParsedResource } from './utils'
2
+ import type { Manifest , ResourceMeta } from './manifest '
3
+ import { LinkAttributes , renderLinkToHeader , renderLinkToString , renderScriptToString } from './runtime /utils'
5
4
6
5
export interface ModuleDependencies {
7
- scripts : Record < string , ParsedResource >
8
- styles : Record < string , ParsedResource >
9
- preload : Record < string , ParsedResource >
10
- prefetch : Record < string , ParsedResource >
6
+ scripts : Record < string , ResourceMeta >
7
+ styles : Record < string , ResourceMeta >
8
+ preload : Record < string , ResourceMeta >
9
+ prefetch : Record < string , ResourceMeta >
11
10
}
12
11
13
12
export interface SSRContext {
@@ -24,22 +23,21 @@ export interface SSRContext {
24
23
}
25
24
26
25
export interface RenderOptions {
27
- shouldPrefetch ?: ( resource : ParsedResource ) => boolean
28
- shouldPreload ?: ( resource : ParsedResource ) => boolean
26
+ shouldPrefetch ?: ( resource : ResourceMeta ) => boolean
27
+ shouldPreload ?: ( resource : ResourceMeta ) => boolean
29
28
buildAssetsURL ?: ( id : string ) => string
30
29
manifest : Manifest
31
30
}
32
31
33
32
export interface RendererContext extends Required < RenderOptions > {
34
33
_dependencies : Record < string , ModuleDependencies >
35
34
_dependencySets : Record < string , ModuleDependencies >
36
- _parsedResources : Record < string , ParsedResource >
37
35
_entrypoints : string [ ]
38
36
updateManifest : ( manifest : Manifest ) => void
39
37
}
40
38
41
39
const defaultShouldPrefetch = ( ) => true
42
- const defaultShouldPreload = ( resource : ParsedResource ) => [ 'module' , 'script' , 'style' ] . includes ( resource . asType || '' )
40
+ const defaultShouldPreload = ( resource : ResourceMeta ) => [ 'module' , 'script' , 'style' ] . includes ( resource . resourceType || '' )
43
41
44
42
export function createRendererContext ( { manifest, buildAssetsURL, shouldPrefetch, shouldPreload } : RenderOptions ) : RendererContext {
45
43
const ctx : RendererContext = {
@@ -53,16 +51,14 @@ export function createRendererContext ({ manifest, buildAssetsURL, shouldPrefetc
53
51
// Internal cache
54
52
_dependencies : undefined ! ,
55
53
_dependencySets : undefined ! ,
56
- _parsedResources : undefined ! ,
57
54
_entrypoints : undefined !
58
55
}
59
56
60
57
function updateManifest ( manifest : Manifest ) {
61
- const manifestEntries = Object . entries ( manifest ) as [ string , ManifestChunk ] [ ]
58
+ const manifestEntries = Object . entries ( manifest ) as [ string , ResourceMeta ] [ ]
62
59
ctx . manifest = manifest
63
60
ctx . _dependencies = { }
64
61
ctx . _dependencySets = { }
65
- ctx . _parsedResources = { }
66
62
ctx . _entrypoints = manifestEntries . filter ( e => e [ 1 ] . isEntry ) . map ( ( [ module ] ) => module )
67
63
}
68
64
@@ -92,16 +88,16 @@ export function getModuleDependencies (id: string, rendererContext: RendererCont
92
88
93
89
// Add to scripts + preload
94
90
if ( meta . file ) {
95
- dependencies . scripts [ id ] = dependencies . preload [ id ] = rendererContext . _parsedResources [ meta . file ] || parseResource ( meta . file )
91
+ dependencies . scripts [ id ] = dependencies . preload [ id ] = rendererContext . manifest [ id ]
96
92
}
97
93
98
94
// Add styles + preload
99
95
for ( const css of meta . css || [ ] ) {
100
- dependencies . styles [ css ] = dependencies . preload [ css ] = dependencies . prefetch [ css ] = rendererContext . _parsedResources [ css ] || parseResource ( css )
96
+ dependencies . styles [ css ] = dependencies . preload [ css ] = dependencies . prefetch [ css ] = rendererContext . manifest [ css ]
101
97
}
102
98
// Add assets as preload
103
99
for ( const asset of meta . assets || [ ] ) {
104
- dependencies . preload [ asset ] = dependencies . prefetch [ asset ] = rendererContext . _parsedResources [ asset ] || parseResource ( asset )
100
+ dependencies . preload [ asset ] = dependencies . prefetch [ asset ] = rendererContext . manifest [ asset ]
105
101
}
106
102
// Resolve nested dependencies and merge
107
103
for ( const depId of meta . imports || [ ] ) {
@@ -194,7 +190,7 @@ export function getRequestDependencies (ssrContext: SSRContext, rendererContext:
194
190
export function renderStyles ( ssrContext : SSRContext , rendererContext : RendererContext ) : string {
195
191
const { styles } = getRequestDependencies ( ssrContext , rendererContext )
196
192
return Object . values ( styles ) . map ( resource =>
197
- renderLinkToString ( { rel : 'stylesheet' , href : rendererContext . buildAssetsURL ( resource . path ) } )
193
+ renderLinkToString ( { rel : 'stylesheet' , href : rendererContext . buildAssetsURL ( resource . file ) } )
198
194
) . join ( '' )
199
195
}
200
196
@@ -216,31 +212,31 @@ export function getPreloadLinks (ssrContext: SSRContext, rendererContext: Render
216
212
const { preload } = getRequestDependencies ( ssrContext , rendererContext )
217
213
return Object . values ( preload )
218
214
. map ( resource => ( {
219
- rel : resource . isModule ? 'modulepreload' : 'preload' ,
220
- as : resource . asType ,
221
- type : resource . contentType ,
222
- crossorigin : resource . asType === 'font' || resource . isModule ? '' : null ,
223
- href : rendererContext . buildAssetsURL ( resource . path )
215
+ rel : resource . module ? 'modulepreload' : 'preload' ,
216
+ as : resource . resourceType ,
217
+ type : resource . mimeType ?? null ,
218
+ crossorigin : resource . resourceType === 'font' || resource . module ? '' : null ,
219
+ href : rendererContext . buildAssetsURL ( resource . file )
224
220
} ) )
225
221
}
226
222
227
223
export function getPrefetchLinks ( ssrContext : SSRContext , rendererContext : RendererContext ) : LinkAttributes [ ] {
228
224
const { prefetch } = getRequestDependencies ( ssrContext , rendererContext )
229
225
return Object . values ( prefetch ) . map ( resource => ( {
230
- rel : 'prefetch' + ( resource . asType === 'style' ? ' stylesheet' : '' ) ,
231
- as : resource . asType !== 'style' ? resource . asType : null ,
232
- type : resource . contentType ,
233
- crossorigin : resource . asType === 'font' || resource . isModule ? '' : null ,
234
- href : rendererContext . buildAssetsURL ( resource . path )
226
+ rel : 'prefetch' + ( resource . resourceType === 'style' ? ' stylesheet' : '' ) ,
227
+ as : resource . resourceType !== 'style' ? resource . resourceType : null ,
228
+ type : resource . mimeType ?? null ,
229
+ crossorigin : resource . resourceType === 'font' || resource . module ? '' : null ,
230
+ href : rendererContext . buildAssetsURL ( resource . file )
235
231
} ) )
236
232
}
237
233
238
234
export function renderScripts ( ssrContext : SSRContext , rendererContext : RendererContext ) : string {
239
235
const { scripts } = getRequestDependencies ( ssrContext , rendererContext )
240
236
return Object . values ( scripts ) . map ( resource => renderScriptToString ( {
241
- type : resource . isModule ? 'module' : null ,
242
- src : rendererContext . buildAssetsURL ( resource . path ) ,
243
- defer : resource . isModule ? null : '' ,
237
+ type : resource . module ? 'module' : null ,
238
+ src : rendererContext . buildAssetsURL ( resource . file ) ,
239
+ defer : resource . module ? null : '' ,
244
240
crossorigin : ''
245
241
} ) ) . join ( '' )
246
242
}
0 commit comments