@@ -12,6 +12,7 @@ const {
12
12
flattenDeep,
13
13
replace,
14
14
concat,
15
+ memoize,
15
16
} = require ( `lodash` )
16
17
17
18
const apiRunner = require ( `./api-runner-ssr` )
@@ -59,11 +60,38 @@ const getPageDataUrl = pagePath => {
59
60
return `${ __PATH_PREFIX__ } /${ pageDataPath } `
60
61
}
61
62
62
- const getPageDataFile = pagePath => {
63
+ const getPageData = pagePath => {
63
64
const pageDataPath = getPageDataPath ( pagePath )
64
- return join ( process . cwd ( ) , `public` , pageDataPath )
65
+ const absolutePageDataPath = join ( process . cwd ( ) , `public` , pageDataPath )
66
+ const pageDataRaw = fs . readFileSync ( absolutePageDataPath )
67
+
68
+ try {
69
+ return JSON . parse ( pageDataRaw . toString ( ) )
70
+ } catch ( err ) {
71
+ return null
72
+ }
65
73
}
66
74
75
+ const appDataPath = join ( `page-data` , `app-data.json` )
76
+
77
+ const getAppDataUrl = memoize ( ( ) => {
78
+ let appData
79
+
80
+ try {
81
+ const absoluteAppDataPath = join ( process . cwd ( ) , `public` , appDataPath )
82
+ const appDataRaw = fs . readFileSync ( absoluteAppDataPath )
83
+ appData = JSON . parse ( appDataRaw . toString ( ) )
84
+
85
+ if ( ! appData ) {
86
+ return null
87
+ }
88
+ } catch ( err ) {
89
+ return null
90
+ }
91
+
92
+ return `${ __PATH_PREFIX__ } /${ appDataPath } `
93
+ } )
94
+
67
95
const loadPageDataSync = pagePath => {
68
96
const pageDataPath = getPageDataPath ( pagePath )
69
97
const pageDataFile = join ( process . cwd ( ) , `public` , pageDataPath )
@@ -167,9 +195,11 @@ export default (pagePath, callback) => {
167
195
postBodyComponents = sanitizeComponents ( components )
168
196
}
169
197
170
- const pageDataRaw = fs . readFileSync ( getPageDataFile ( pagePath ) )
171
- const pageData = JSON . parse ( pageDataRaw )
198
+ const pageData = getPageData ( pagePath )
172
199
const pageDataUrl = getPageDataUrl ( pagePath )
200
+
201
+ const appDataUrl = getAppDataUrl ( )
202
+
173
203
const { componentChunkName } = pageData
174
204
175
205
class RouteHandler extends React . Component {
@@ -251,7 +281,7 @@ export default (pagePath, callback) => {
251
281
const fetchKey = `assetsByChunkName[${ s } ]`
252
282
253
283
let chunks = get ( stats , fetchKey )
254
- let namedChunkGroups = get ( stats , `namedChunkGroups` )
284
+ const namedChunkGroups = get ( stats , `namedChunkGroups` )
255
285
256
286
if ( ! chunks ) {
257
287
return null
@@ -334,6 +364,17 @@ export default (pagePath, callback) => {
334
364
/>
335
365
)
336
366
}
367
+ if ( appDataUrl ) {
368
+ headComponents . push (
369
+ < link
370
+ as = "fetch"
371
+ rel = "preload"
372
+ key = { appDataUrl }
373
+ href = { appDataUrl }
374
+ crossOrigin = "anonymous"
375
+ />
376
+ )
377
+ }
337
378
338
379
styles
339
380
. slice ( 0 )
0 commit comments