1
1
import { isString } from '@vuepress/shared'
2
- import type { Page } from '../types/index.js'
2
+ import type { App , Page } from '../types/index.js'
3
3
4
4
const TEMPLATE_WRAPPER_TAG_OPEN = '<div>'
5
5
const TEMPLATE_WRAPPER_TAG_CLOSE = '</div>'
@@ -10,21 +10,32 @@ const SCRIPT_TAG_CLOSE = '</script>'
10
10
const SCRIPT_TAG_OPEN_LANG_TS_REGEX = / < \s * s c r i p t [ ^ > ] * \b l a n g = [ ' " ] t s [ ' " ] [ ^ > ] * /
11
11
const SCRIPT_TAG_OPEN_LANG_TS = '<script lang="ts">'
12
12
13
+ const PAGE_DATA_CODE_VAR_NAME = '_pageData'
14
+ const PAGE_DATA_CODE_TEMPLATE_OUTLET = '__PAGE_DATA__'
15
+ const PAGE_DATA_CODE_TEMPLATE = `export const ${ PAGE_DATA_CODE_VAR_NAME } = JSON.parse(${ PAGE_DATA_CODE_TEMPLATE_OUTLET } )`
16
+
13
17
const HMR_CODE = `
14
18
if (import.meta.webpackHot) {
15
19
import.meta.webpackHot.accept()
16
- if (__VUE_HMR_RUNTIME__.updatePageData) {
17
- __VUE_HMR_RUNTIME__.updatePageData(_pageData)
18
- }
20
+ __VUE_HMR_RUNTIME__.updatePageData?.(${ PAGE_DATA_CODE_VAR_NAME } )
19
21
}
20
22
21
23
if (import.meta.hot) {
22
- import.meta.hot.accept(({ _pageData } ) => {
23
- __VUE_HMR_RUNTIME__.updatePageData(_pageData )
24
+ import.meta.hot.accept((m ) => {
25
+ __VUE_HMR_RUNTIME__.updatePageData?.(m. ${ PAGE_DATA_CODE_VAR_NAME } )
24
26
})
25
27
}
26
28
`
27
29
30
+ /**
31
+ * Util to resolve the page data code
32
+ */
33
+ const resolvePageDataCode = ( data : Page [ 'data' ] ) : string =>
34
+ PAGE_DATA_CODE_TEMPLATE . replace (
35
+ PAGE_DATA_CODE_TEMPLATE_OUTLET ,
36
+ JSON . stringify ( JSON . stringify ( data ) ) ,
37
+ )
38
+
28
39
/**
29
40
* Util to resolve the open tag of script block
30
41
*/
@@ -43,7 +54,10 @@ const resolveScriptTagOpen = (sfcBlocks: Page['sfcBlocks']): string => {
43
54
/**
44
55
* Render page to vue component
45
56
*/
46
- export const renderPageToVue = ( { data, sfcBlocks } : Page ) : string => {
57
+ export const renderPageToVue = (
58
+ app : App ,
59
+ { data, sfcBlocks } : Page ,
60
+ ) : string => {
47
61
// #688: wrap the content of `<template>` with a `<div>` to avoid some potential issues of fragment component
48
62
const templateContent =
49
63
sfcBlocks . template &&
@@ -56,12 +70,13 @@ export const renderPageToVue = ({ data, sfcBlocks }: Page): string => {
56
70
] . join ( '' )
57
71
58
72
// inject page data code and HMR code into the script content
59
- const pageDataCode = `export const _pageData = JSON.parse(${ JSON . stringify ( JSON . stringify ( data ) ) } )`
73
+ const scriptTagOpen = resolveScriptTagOpen ( sfcBlocks )
74
+ const pageDataCode = resolvePageDataCode ( data )
60
75
const scriptContent = [
61
- resolveScriptTagOpen ( sfcBlocks ) ,
76
+ scriptTagOpen ,
62
77
sfcBlocks . script ?. contentStripped ,
63
78
pageDataCode ,
64
- HMR_CODE ,
79
+ app . env . isDev && HMR_CODE ,
65
80
sfcBlocks . script ?. tagClose ?? SCRIPT_TAG_CLOSE ,
66
81
]
67
82
. filter ( isString )
0 commit comments