@@ -34,14 +34,7 @@ export async function createMarkdownToVueRenderFn(
34
34
35
35
pages = pages . map ( ( p ) => slash ( p . replace ( / \. m d $ / , '' ) ) )
36
36
37
- const userDefineRegex = userDefines
38
- ? new RegExp (
39
- `\\b(${ Object . keys ( userDefines )
40
- . map ( ( key ) => key . replace ( / [ - [ \] / { } ( ) * + ? . \\ ^ $ | ] / g, '\\$&' ) )
41
- . join ( '|' ) } )`,
42
- 'g'
43
- )
44
- : null
37
+ const replaceRegex = genReplaceRegexp ( userDefines , isBuild )
45
38
46
39
return async (
47
40
src : string ,
@@ -74,24 +67,9 @@ export async function createMarkdownToVueRenderFn(
74
67
md . __path = file
75
68
md . __relativePath = relativePath
76
69
77
- let html = md . render ( content )
70
+ const html = md . render ( content )
78
71
const data = md . __data
79
72
80
- if ( isBuild ) {
81
- // avoid env variables being replaced by vite
82
- html = html
83
- . replace ( / \b i m p o r t \. m e t a / g, 'import.<wbr/>meta' )
84
- . replace ( / \b p r o c e s s \. e n v / g, 'process.<wbr/>env' )
85
-
86
- // also avoid replacing vite user defines
87
- if ( userDefineRegex ) {
88
- html = html . replace (
89
- userDefineRegex ,
90
- ( _ ) => `${ _ [ 0 ] } <wbr/>${ _ . slice ( 1 ) } `
91
- )
92
- }
93
- }
94
-
95
73
// validate data.links
96
74
const deadLinks : string [ ] = [ ]
97
75
const recordDeadLink = ( url : string ) => {
@@ -149,8 +127,14 @@ export async function createMarkdownToVueRenderFn(
149
127
}
150
128
151
129
const vueSrc =
152
- genPageDataCode ( data . hoistedTags || [ ] , pageData ) . join ( '\n' ) +
153
- `\n<template><div>${ html } </div></template>`
130
+ genPageDataCode ( data . hoistedTags || [ ] , pageData , replaceRegex ) . join (
131
+ '\n'
132
+ ) +
133
+ `\n<template><div>${ replaceConstants (
134
+ html ,
135
+ replaceRegex ,
136
+ vueTemplateBreaker
137
+ ) } </div></template>`
154
138
155
139
debug ( `[render] ${ file } in ${ Date . now ( ) - start } ms.` )
156
140
@@ -171,10 +155,42 @@ const scriptSetupRE = /<\s*script[^>]*\bsetup\b[^>]*/
171
155
const scriptClientRE = / < \s * s c r i p t [ ^ > ] * \b c l i e n t \b [ ^ > ] * /
172
156
const defaultExportRE = / ( (?: ^ | \n | ; ) \s * ) e x p o r t ( \s * ) d e f a u l t /
173
157
const namedDefaultExportRE = / ( (?: ^ | \n | ; ) \s * ) e x p o r t ( .+ ) a s ( \s * ) d e f a u l t /
158
+ const jsStringBreaker = '\u200b'
159
+ const vueTemplateBreaker = '<wbr>'
160
+
161
+ function genReplaceRegexp (
162
+ userDefines : Record < string , any > = { } ,
163
+ isBuild : boolean
164
+ ) : RegExp {
165
+ // `process.env` need to be handled in both dev and build
166
+ // @see https://github.com/vitejs/vite/blob/cad27ee8c00bbd5aeeb2be9bfb3eb164c1b77885/packages/vite/src/node/plugins/clientInjections.ts#L57-L64
167
+ const replacements = [ 'process.env' ]
168
+ if ( isBuild ) {
169
+ replacements . push ( 'import.meta' , ...Object . keys ( userDefines ) )
170
+ }
171
+ return new RegExp (
172
+ `\\b(${ replacements
173
+ . map ( ( key ) => key . replace ( / [ - [ \] / { } ( ) * + ? . \\ ^ $ | ] / g, '\\$&' ) )
174
+ . join ( '|' ) } )`,
175
+ 'g'
176
+ )
177
+ }
178
+
179
+ /**
180
+ * To avoid env variables being replaced by vite:
181
+ * - insert `'\u200b'` char into those strings inside js string (page data)
182
+ * - insert `<wbr>` tag into those strings inside html string (vue template)
183
+ *
184
+ * @see https://vitejs.dev/guide/env-and-mode.html#production-replacement
185
+ */
186
+ function replaceConstants ( str : string , replaceRegex : RegExp , breaker : string ) {
187
+ return str . replace ( replaceRegex , ( _ ) => `${ _ [ 0 ] } ${ breaker } ${ _ . slice ( 1 ) } ` )
188
+ }
174
189
175
- function genPageDataCode ( tags : string [ ] , data : PageData ) {
190
+ function genPageDataCode ( tags : string [ ] , data : PageData , replaceRegex : RegExp ) {
191
+ const dataJson = JSON . stringify ( data )
176
192
const code = `\nexport const __pageData = JSON.parse(${ JSON . stringify (
177
- JSON . stringify ( data )
193
+ replaceConstants ( dataJson , replaceRegex , jsStringBreaker )
178
194
) } )`
179
195
180
196
const existingScriptIndex = tags . findIndex ( ( tag ) => {
0 commit comments