@@ -3,6 +3,7 @@ import type { Plugin } from '../plugin'
3
3
import type { ResolvedConfig } from '../config'
4
4
import { CLIENT_ENTRY , ENV_ENTRY } from '../constants'
5
5
import { isObject , normalizePath , resolveHostname } from '../utils'
6
+ import { usePerEnvironmentState } from '../environment'
6
7
import { replaceDefine , serializeDefine } from './define'
7
8
8
9
// ids in transform are normalized to unix style
@@ -16,6 +17,19 @@ const normalizedEnvEntry = normalizePath(ENV_ENTRY)
16
17
export function clientInjectionsPlugin ( config : ResolvedConfig ) : Plugin {
17
18
let injectConfigValues : ( code : string ) => string
18
19
20
+ const getDefineReplacer = usePerEnvironmentState ( ( environment ) => {
21
+ const userDefine : Record < string , any > = { }
22
+ for ( const key in environment . config . define ) {
23
+ // import.meta.env.* is handled in `importAnalysis` plugin
24
+ if ( ! key . startsWith ( 'import.meta.env.' ) ) {
25
+ userDefine [ key ] = environment . config . define [ key ]
26
+ }
27
+ }
28
+ const serializedDefines = serializeDefine ( userDefine )
29
+ const definesReplacement = ( ) => serializedDefines
30
+ return ( code : string ) => code . replace ( `__DEFINES__` , definesReplacement )
31
+ } )
32
+
19
33
return {
20
34
name : 'vite:client-inject' ,
21
35
async buildStart ( ) {
@@ -51,18 +65,8 @@ export function clientInjectionsPlugin(config: ResolvedConfig): Plugin {
51
65
hmrBase = path . posix . join ( hmrBase , hmrConfig . path )
52
66
}
53
67
54
- const userDefine : Record < string , any > = { }
55
- for ( const key in config . define ) {
56
- // import.meta.env.* is handled in `importAnalysis` plugin
57
- if ( ! key . startsWith ( 'import.meta.env.' ) ) {
58
- userDefine [ key ] = config . define [ key ]
59
- }
60
- }
61
- const serializedDefines = serializeDefine ( userDefine )
62
-
63
68
const modeReplacement = escapeReplacement ( config . mode )
64
69
const baseReplacement = escapeReplacement ( devBase )
65
- const definesReplacement = ( ) => serializedDefines
66
70
const serverHostReplacement = escapeReplacement ( serverHost )
67
71
const hmrProtocolReplacement = escapeReplacement ( protocol )
68
72
const hmrHostnameReplacement = escapeReplacement ( host )
@@ -77,7 +81,6 @@ export function clientInjectionsPlugin(config: ResolvedConfig): Plugin {
77
81
return code
78
82
. replace ( `__MODE__` , modeReplacement )
79
83
. replace ( / _ _ B A S E _ _ / g, baseReplacement )
80
- . replace ( `__DEFINES__` , definesReplacement )
81
84
. replace ( `__SERVER_HOST__` , serverHostReplacement )
82
85
. replace ( `__HMR_PROTOCOL__` , hmrProtocolReplacement )
83
86
. replace ( `__HMR_HOSTNAME__` , hmrHostnameReplacement )
@@ -93,13 +96,14 @@ export function clientInjectionsPlugin(config: ResolvedConfig): Plugin {
93
96
// TODO: Remove options?.ssr, Vitest currently hijacks this plugin
94
97
const ssr = options ?. ssr ?? this . environment . config . consumer === 'server'
95
98
if ( id === normalizedClientEntry || id === normalizedEnvEntry ) {
96
- return injectConfigValues ( code )
99
+ const defineReplacer = getDefineReplacer ( this )
100
+ return defineReplacer ( injectConfigValues ( code ) )
97
101
} else if ( ! ssr && code . includes ( 'process.env.NODE_ENV' ) ) {
98
102
// replace process.env.NODE_ENV instead of defining a global
99
103
// for it to avoid shimming a `process` object during dev,
100
104
// avoiding inconsistencies between dev and build
101
105
const nodeEnv =
102
- config . define ?. [ 'process.env.NODE_ENV' ] ||
106
+ this . environment . config . define ?. [ 'process.env.NODE_ENV' ] ||
103
107
JSON . stringify ( process . env . NODE_ENV || config . mode )
104
108
return await replaceDefine ( this . environment , code , id , {
105
109
'process.env.NODE_ENV' : nodeEnv ,
0 commit comments