Skip to content

Commit 2f8e6ca

Browse files
committed
fix(build): avoid re-define __vite_import_meta_env__
Closes #17874
1 parent 4e5ce3c commit 2f8e6ca

File tree

2 files changed

+33
-6
lines changed

2 files changed

+33
-6
lines changed

packages/vite/src/node/__tests__/plugins/define.spec.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,4 +109,23 @@ describe('definePlugin', () => {
109109
/const __vite_import_meta_env__ = .*;\nconst env = __vite_import_meta_env__;/,
110110
)
111111
})
112+
113+
test('already has marker', async () => {
114+
const transform = await createDefinePluginTransform()
115+
expect(
116+
await transform(
117+
'console.log(__vite_import_meta_env__);\nconst env = import.meta.env;',
118+
),
119+
).toMatch(
120+
/const __vite_import_meta_env__\$ = .*;\nconsole.log\(__vite_import_meta_env__\);\nconst env = __vite_import_meta_env__\$;/,
121+
)
122+
123+
expect(
124+
await transform(
125+
'console.log(__vite_import_meta_env__, __vite_import_meta_env__$);\n const env = import.meta.env;',
126+
),
127+
).toMatch(
128+
/const __vite_import_meta_env__\$\$ = .*;\nconsole.log\(__vite_import_meta_env__, __vite_import_meta_env__\$\);\nconst env = __vite_import_meta_env__\$\$;/,
129+
)
130+
})
112131
})

packages/vite/src/node/plugins/define.ts

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import { isHTMLRequest } from './html'
99
const nonJsRe = /\.json(?:$|\?)/
1010
const isNonJsRequest = (request: string): boolean => nonJsRe.test(request)
1111
const importMetaEnvMarker = '__vite_import_meta_env__'
12-
const bareImportMetaEnvRe = new RegExp(`${importMetaEnvMarker}(?!\\.)\\b`)
1312
const importMetaEnvKeyRe = new RegExp(`${importMetaEnvMarker}\\..+?\\b`, 'g')
1413

1514
export function definePlugin(config: ResolvedConfig): Plugin {
@@ -80,7 +79,6 @@ export function definePlugin(config: ResolvedConfig): Plugin {
8079
SSR: ssr + '',
8180
...userDefineEnv,
8281
})
83-
const banner = `const ${importMetaEnvMarker} = ${importMetaEnvVal};\n`
8482

8583
// Create regex pattern as a fast check before running esbuild
8684
const patternKeys = Object.keys(userDefine)
@@ -94,7 +92,7 @@ export function definePlugin(config: ResolvedConfig): Plugin {
9492
? new RegExp(patternKeys.map(escapeRegex).join('|'))
9593
: null
9694

97-
return [define, pattern, banner] as const
95+
return [define, pattern, importMetaEnvVal] as const
9896
}
9997

10098
const defaultPattern = generatePattern(false)
@@ -122,13 +120,23 @@ export function definePlugin(config: ResolvedConfig): Plugin {
122120
return
123121
}
124122

125-
const [define, pattern, banner] = ssr ? ssrPattern : defaultPattern
123+
const [define, pattern, importMetaEnvVal] = ssr
124+
? ssrPattern
125+
: defaultPattern
126126
if (!pattern) return
127127

128128
// Check if our code needs any replacements before running esbuild
129129
pattern.lastIndex = 0
130130
if (!pattern.test(code)) return
131131

132+
let marker = importMetaEnvMarker
133+
while (new RegExp(escapeRegex(marker)).test(code)) {
134+
marker += '$'
135+
}
136+
if (marker !== importMetaEnvMarker && 'import.meta.env' in define) {
137+
define['import.meta.env'] = marker
138+
}
139+
132140
const result = await replaceDefine(code, id, define, config)
133141

134142
// Replace `import.meta.env.*` with undefined
@@ -137,8 +145,8 @@ export function definePlugin(config: ResolvedConfig): Plugin {
137145
)
138146

139147
// If there's bare `import.meta.env` references, prepend the banner
140-
if (bareImportMetaEnvRe.test(result.code)) {
141-
result.code = banner + result.code
148+
if (new RegExp(escapeRegex(marker)).test(result.code)) {
149+
result.code = `const ${marker} = ${importMetaEnvVal};\n` + result.code
142150

143151
if (result.map) {
144152
const map = JSON.parse(result.map)

0 commit comments

Comments
 (0)