11import { isString } from '@vuepress/shared'
2- import type { Page } from '../types/index.js'
2+ import type { App , Page } from '../types/index.js'
33
44const TEMPLATE_WRAPPER_TAG_OPEN = '<div>'
55const TEMPLATE_WRAPPER_TAG_CLOSE = '</div>'
@@ -10,21 +10,32 @@ const SCRIPT_TAG_CLOSE = '</script>'
1010const SCRIPT_TAG_OPEN_LANG_TS_REGEX = / < \s * s c r i p t [ ^ > ] * \b l a n g = [ ' " ] t s [ ' " ] [ ^ > ] * /
1111const SCRIPT_TAG_OPEN_LANG_TS = '<script lang="ts">'
1212
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+
1317const HMR_CODE = `
1418if (import.meta.webpackHot) {
1519 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 } )
1921}
2022
2123if (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 } )
2426 })
2527}
2628`
2729
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+
2839/**
2940 * Util to resolve the open tag of script block
3041 */
@@ -43,7 +54,10 @@ const resolveScriptTagOpen = (sfcBlocks: Page['sfcBlocks']): string => {
4354/**
4455 * Render page to vue component
4556 */
46- export const renderPageToVue = ( { data, sfcBlocks } : Page ) : string => {
57+ export const renderPageToVue = (
58+ app : App ,
59+ { data, sfcBlocks } : Page ,
60+ ) : string => {
4761 // #688: wrap the content of `<template>` with a `<div>` to avoid some potential issues of fragment component
4862 const templateContent =
4963 sfcBlocks . template &&
@@ -56,12 +70,13 @@ export const renderPageToVue = ({ data, sfcBlocks }: Page): string => {
5670 ] . join ( '' )
5771
5872 // 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 )
6075 const scriptContent = [
61- resolveScriptTagOpen ( sfcBlocks ) ,
76+ scriptTagOpen ,
6277 sfcBlocks . script ?. contentStripped ,
6378 pageDataCode ,
64- HMR_CODE ,
79+ app . env . isDev && HMR_CODE ,
6580 sfcBlocks . script ?. tagClose ?? SCRIPT_TAG_CLOSE ,
6681 ]
6782 . filter ( isString )
0 commit comments