mirror of
https://github.com/vitejs/vite.git
synced 2024-11-21 14:48:41 +00:00
fix: define
in environment config was not working (#18515)
This commit is contained in:
parent
5da78a6859
commit
052799e893
@ -637,6 +637,7 @@ function resolveEnvironmentOptions(
|
|||||||
const consumer =
|
const consumer =
|
||||||
options.consumer ?? (isClientEnvironment ? 'client' : 'server')
|
options.consumer ?? (isClientEnvironment ? 'client' : 'server')
|
||||||
return {
|
return {
|
||||||
|
define: options.define,
|
||||||
resolve,
|
resolve,
|
||||||
consumer,
|
consumer,
|
||||||
webCompatible: options.webCompatible ?? consumer === 'client',
|
webCompatible: options.webCompatible ?? consumer === 'client',
|
||||||
|
@ -3,6 +3,7 @@ import type { Plugin } from '../plugin'
|
|||||||
import type { ResolvedConfig } from '../config'
|
import type { ResolvedConfig } from '../config'
|
||||||
import { CLIENT_ENTRY, ENV_ENTRY } from '../constants'
|
import { CLIENT_ENTRY, ENV_ENTRY } from '../constants'
|
||||||
import { isObject, normalizePath, resolveHostname } from '../utils'
|
import { isObject, normalizePath, resolveHostname } from '../utils'
|
||||||
|
import { usePerEnvironmentState } from '../environment'
|
||||||
import { replaceDefine, serializeDefine } from './define'
|
import { replaceDefine, serializeDefine } from './define'
|
||||||
|
|
||||||
// ids in transform are normalized to unix style
|
// ids in transform are normalized to unix style
|
||||||
@ -16,6 +17,19 @@ const normalizedEnvEntry = normalizePath(ENV_ENTRY)
|
|||||||
export function clientInjectionsPlugin(config: ResolvedConfig): Plugin {
|
export function clientInjectionsPlugin(config: ResolvedConfig): Plugin {
|
||||||
let injectConfigValues: (code: string) => string
|
let injectConfigValues: (code: string) => string
|
||||||
|
|
||||||
|
const getDefineReplacer = usePerEnvironmentState((environment) => {
|
||||||
|
const userDefine: Record<string, any> = {}
|
||||||
|
for (const key in environment.config.define) {
|
||||||
|
// import.meta.env.* is handled in `importAnalysis` plugin
|
||||||
|
if (!key.startsWith('import.meta.env.')) {
|
||||||
|
userDefine[key] = environment.config.define[key]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const serializedDefines = serializeDefine(userDefine)
|
||||||
|
const definesReplacement = () => serializedDefines
|
||||||
|
return (code: string) => code.replace(`__DEFINES__`, definesReplacement)
|
||||||
|
})
|
||||||
|
|
||||||
return {
|
return {
|
||||||
name: 'vite:client-inject',
|
name: 'vite:client-inject',
|
||||||
async buildStart() {
|
async buildStart() {
|
||||||
@ -51,18 +65,8 @@ export function clientInjectionsPlugin(config: ResolvedConfig): Plugin {
|
|||||||
hmrBase = path.posix.join(hmrBase, hmrConfig.path)
|
hmrBase = path.posix.join(hmrBase, hmrConfig.path)
|
||||||
}
|
}
|
||||||
|
|
||||||
const userDefine: Record<string, any> = {}
|
|
||||||
for (const key in config.define) {
|
|
||||||
// import.meta.env.* is handled in `importAnalysis` plugin
|
|
||||||
if (!key.startsWith('import.meta.env.')) {
|
|
||||||
userDefine[key] = config.define[key]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const serializedDefines = serializeDefine(userDefine)
|
|
||||||
|
|
||||||
const modeReplacement = escapeReplacement(config.mode)
|
const modeReplacement = escapeReplacement(config.mode)
|
||||||
const baseReplacement = escapeReplacement(devBase)
|
const baseReplacement = escapeReplacement(devBase)
|
||||||
const definesReplacement = () => serializedDefines
|
|
||||||
const serverHostReplacement = escapeReplacement(serverHost)
|
const serverHostReplacement = escapeReplacement(serverHost)
|
||||||
const hmrProtocolReplacement = escapeReplacement(protocol)
|
const hmrProtocolReplacement = escapeReplacement(protocol)
|
||||||
const hmrHostnameReplacement = escapeReplacement(host)
|
const hmrHostnameReplacement = escapeReplacement(host)
|
||||||
@ -77,7 +81,6 @@ export function clientInjectionsPlugin(config: ResolvedConfig): Plugin {
|
|||||||
return code
|
return code
|
||||||
.replace(`__MODE__`, modeReplacement)
|
.replace(`__MODE__`, modeReplacement)
|
||||||
.replace(/__BASE__/g, baseReplacement)
|
.replace(/__BASE__/g, baseReplacement)
|
||||||
.replace(`__DEFINES__`, definesReplacement)
|
|
||||||
.replace(`__SERVER_HOST__`, serverHostReplacement)
|
.replace(`__SERVER_HOST__`, serverHostReplacement)
|
||||||
.replace(`__HMR_PROTOCOL__`, hmrProtocolReplacement)
|
.replace(`__HMR_PROTOCOL__`, hmrProtocolReplacement)
|
||||||
.replace(`__HMR_HOSTNAME__`, hmrHostnameReplacement)
|
.replace(`__HMR_HOSTNAME__`, hmrHostnameReplacement)
|
||||||
@ -93,13 +96,14 @@ export function clientInjectionsPlugin(config: ResolvedConfig): Plugin {
|
|||||||
// TODO: Remove options?.ssr, Vitest currently hijacks this plugin
|
// TODO: Remove options?.ssr, Vitest currently hijacks this plugin
|
||||||
const ssr = options?.ssr ?? this.environment.config.consumer === 'server'
|
const ssr = options?.ssr ?? this.environment.config.consumer === 'server'
|
||||||
if (id === normalizedClientEntry || id === normalizedEnvEntry) {
|
if (id === normalizedClientEntry || id === normalizedEnvEntry) {
|
||||||
return injectConfigValues(code)
|
const defineReplacer = getDefineReplacer(this)
|
||||||
|
return defineReplacer(injectConfigValues(code))
|
||||||
} else if (!ssr && code.includes('process.env.NODE_ENV')) {
|
} else if (!ssr && code.includes('process.env.NODE_ENV')) {
|
||||||
// replace process.env.NODE_ENV instead of defining a global
|
// replace process.env.NODE_ENV instead of defining a global
|
||||||
// for it to avoid shimming a `process` object during dev,
|
// for it to avoid shimming a `process` object during dev,
|
||||||
// avoiding inconsistencies between dev and build
|
// avoiding inconsistencies between dev and build
|
||||||
const nodeEnv =
|
const nodeEnv =
|
||||||
config.define?.['process.env.NODE_ENV'] ||
|
this.environment.config.define?.['process.env.NODE_ENV'] ||
|
||||||
JSON.stringify(process.env.NODE_ENV || config.mode)
|
JSON.stringify(process.env.NODE_ENV || config.mode)
|
||||||
return await replaceDefine(this.environment, code, id, {
|
return await replaceDefine(this.environment, code, id, {
|
||||||
'process.env.NODE_ENV': nodeEnv,
|
'process.env.NODE_ENV': nodeEnv,
|
||||||
|
@ -46,18 +46,18 @@ export function definePlugin(config: ResolvedConfig): Plugin {
|
|||||||
importMetaFallbackKeys['import.meta.env'] = `undefined`
|
importMetaFallbackKeys['import.meta.env'] = `undefined`
|
||||||
}
|
}
|
||||||
|
|
||||||
const userDefine: Record<string, string> = {}
|
|
||||||
const userDefineEnv: Record<string, any> = {}
|
|
||||||
for (const key in config.define) {
|
|
||||||
userDefine[key] = handleDefineValue(config.define[key])
|
|
||||||
|
|
||||||
// make sure `import.meta.env` object has user define properties
|
|
||||||
if (isBuild && key.startsWith('import.meta.env.')) {
|
|
||||||
userDefineEnv[key.slice(16)] = config.define[key]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function generatePattern(environment: Environment) {
|
function generatePattern(environment: Environment) {
|
||||||
|
const userDefine: Record<string, string> = {}
|
||||||
|
const userDefineEnv: Record<string, any> = {}
|
||||||
|
for (const key in environment.config.define) {
|
||||||
|
userDefine[key] = handleDefineValue(environment.config.define[key])
|
||||||
|
|
||||||
|
// make sure `import.meta.env` object has user define properties
|
||||||
|
if (isBuild && key.startsWith('import.meta.env.')) {
|
||||||
|
userDefineEnv[key.slice(16)] = environment.config.define[key]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const replaceProcessEnv = environment.config.webCompatible
|
const replaceProcessEnv = environment.config.webCompatible
|
||||||
|
|
||||||
const define: Record<string, string> = {
|
const define: Record<string, string> = {
|
||||||
|
@ -3,6 +3,7 @@ import viteConfig from '../vite.config'
|
|||||||
import { page } from '~utils'
|
import { page } from '~utils'
|
||||||
|
|
||||||
const defines = viteConfig.define
|
const defines = viteConfig.define
|
||||||
|
const envDefines = viteConfig.environments.client.define
|
||||||
|
|
||||||
test('string', async () => {
|
test('string', async () => {
|
||||||
expect(await page.textContent('.exp')).toBe(
|
expect(await page.textContent('.exp')).toBe(
|
||||||
@ -48,6 +49,9 @@ test('string', async () => {
|
|||||||
expect(await page.textContent('.define-in-dep')).toBe(
|
expect(await page.textContent('.define-in-dep')).toBe(
|
||||||
defines.__STRINGIFIED_OBJ__,
|
defines.__STRINGIFIED_OBJ__,
|
||||||
)
|
)
|
||||||
|
expect(await page.textContent('.define-in-environment')).toBe(
|
||||||
|
envDefines.__DEFINE_IN_ENVIRONMENT__,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
test('ignores constants in string literals', async () => {
|
test('ignores constants in string literals', async () => {
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
<p>define variable in html: <code class="exp-define">__EXP__</code></p>
|
<p>define variable in html: <code class="exp-define">__EXP__</code></p>
|
||||||
<p>import json: <code class="import-json"></code></p>
|
<p>import json: <code class="import-json"></code></p>
|
||||||
<p>define in dep: <code class="define-in-dep"></code></p>
|
<p>define in dep: <code class="define-in-dep"></code></p>
|
||||||
|
<p>define in environment: <code class="define-in-environment"></code></p>
|
||||||
|
|
||||||
<h2>Define ignores string literals</h2>
|
<h2>Define ignores string literals</h2>
|
||||||
<section class="ignores-string-literals">
|
<section class="ignores-string-literals">
|
||||||
@ -114,6 +115,8 @@
|
|||||||
import { defined } from '@vitejs/test-commonjs-dep'
|
import { defined } from '@vitejs/test-commonjs-dep'
|
||||||
text('.define-in-dep', JSON.stringify(defined))
|
text('.define-in-dep', JSON.stringify(defined))
|
||||||
|
|
||||||
|
text('.define-in-environment', JSON.stringify(__DEFINE_IN_ENVIRONMENT__))
|
||||||
|
|
||||||
text('.ignores-string-literals .process-env-dot', 'process.env.')
|
text('.ignores-string-literals .process-env-dot', 'process.env.')
|
||||||
text(
|
text(
|
||||||
'.ignores-string-literals .global-process-env-dot',
|
'.ignores-string-literals .global-process-env-dot',
|
||||||
|
@ -31,4 +31,11 @@ export default defineConfig({
|
|||||||
__STRINGIFIED_OBJ__: JSON.stringify({ foo: true }),
|
__STRINGIFIED_OBJ__: JSON.stringify({ foo: true }),
|
||||||
'import.meta.env.SOME_IDENTIFIER': '__VITE_SOME_IDENTIFIER__',
|
'import.meta.env.SOME_IDENTIFIER': '__VITE_SOME_IDENTIFIER__',
|
||||||
},
|
},
|
||||||
|
environments: {
|
||||||
|
client: {
|
||||||
|
define: {
|
||||||
|
__DEFINE_IN_ENVIRONMENT__: '"defined only in client"',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
})
|
})
|
||||||
|
Loading…
Reference in New Issue
Block a user