@@ -2,6 +2,10 @@ import { Component, createApp, createSSRApp } from "vue";
2
2
import type { SSRContext } from "../../server/renderer.ts" ;
3
3
import { RouterContext } from "./context.ts" ;
4
4
import { defineComponent } from "vue" ;
5
+ import { RouteModule } from "../core/route.ts" ;
6
+
7
+ // deno-lint-ignore no-explicit-any
8
+ const global = window as any ;
5
9
6
10
export const App = defineComponent ( {
7
11
name : "App" ,
@@ -19,14 +23,19 @@ export const App = defineComponent({
19
23
} ,
20
24
} ) ;
21
25
22
- const createSSRApp_ = ( app : Component , { ssrContext } : { ssrContext : SSRContext } ) => {
23
- const routeModules = ssrContext ?. routeModules ;
26
+ type RootProps = {
27
+ ssrContext ?: SSRContext ;
28
+ } ;
29
+
30
+ const createSSRApp_ = ( app : Component , props ?: RootProps ) => {
31
+ const { ssrContext } = props || { } ;
32
+ const routeModules = ssrContext ?. routeModules || loadSSRModulesFromTag ( ) ;
24
33
25
34
if ( ssrContext ?. url ) {
26
35
RouterContext . value . url = ssrContext ?. url ;
27
36
}
28
37
29
- if ( routeModules . length > 0 ) {
38
+ if ( routeModules && routeModules . length > 0 ) {
30
39
const defaultRouteModules = routeModules [ 0 ] ;
31
40
const { defaultExport } = defaultRouteModules ;
32
41
if ( defaultExport ) {
@@ -37,6 +46,47 @@ const createSSRApp_ = (app: Component, { ssrContext }: { ssrContext: SSRContext
37
46
return createSSRApp ( app ) ;
38
47
} ;
39
48
49
+ function getRouteModules ( ) : Record < string , { defaultExport ?: unknown ; withData ?: boolean } > {
50
+ return global . __ROUTE_MODULES || ( global . __ROUTE_MODULES = { } ) ;
51
+ }
52
+
53
+ function loadSSRModulesFromTag ( ) : RouteModule [ ] {
54
+ const el = window . document ?. getElementById ( "ssr-modules" ) ;
55
+ if ( el ) {
56
+ try {
57
+ const data = JSON . parse ( el . innerText ) ;
58
+ if ( Array . isArray ( data ) ) {
59
+ let suspenseData : Record < string , unknown > | null | undefined = undefined ;
60
+ const routeModules = getRouteModules ( ) ;
61
+ return data . map ( ( { url, filename, suspense, ...rest } ) => {
62
+ if ( suspense ) {
63
+ if ( suspenseData === undefined ) {
64
+ const el = window . document ?. getElementById ( "suspense-data" ) ;
65
+ if ( el ) {
66
+ suspenseData = JSON . parse ( el . innerText ) ;
67
+ } else {
68
+ suspenseData = null ;
69
+ }
70
+ }
71
+ if ( suspenseData ) {
72
+ rest . data = suspenseData [ url ] ;
73
+ }
74
+ }
75
+ return {
76
+ url : new URL ( url , location . href ) ,
77
+ filename,
78
+ defaultExport : routeModules [ filename ] . defaultExport ,
79
+ ...rest ,
80
+ } ;
81
+ } ) ;
82
+ }
83
+ } catch ( e ) {
84
+ throw new Error ( `loadSSRModulesFromTag: ${ e . message } ` ) ;
85
+ }
86
+ }
87
+ return [ ] ;
88
+ }
89
+
40
90
const createApp_ = ( app : Component ) => {
41
91
return createApp ( app ) ;
42
92
} ;
0 commit comments