Vite 通过 define 配置项在编译阶段将字符串字面量直接替换为 JSON 字符串,用于安全注入版本号、构建时间、API 地址等静态常量,如 __VERSION__: JSON.stringify('1.2.0')。

Vite 构建时注入全局常量,主要靠 define 配置项实现。它在编译阶段将指定的字符串字面量直接替换进源码,不运行、不求值,安全高效,适合注入版本号、API 地址、构建时间等静态信息。
用 define 注入基础常量
在 vite.config.ts 或 vite.config.js 中配置:
-
define接收一个对象,键是代码中要被替换的全局标识符(必须是字符串字面量形式),值是替换后的 JSON 字符串 - 例如注入版本和构建时间:
import { defineConfig } from 'vite'
export default defineConfig({
define: {
__VERSION__: JSON.stringify('1.2.0'),
__BUILD_TIME__: JSON.stringify(new Date().toISOString()),
__API_BASE__: JSON.stringify('https://api.example.com')
}
```
之后在任意 `.ts` 或 `.js` 文件中可直接使用:console.log(__VERSION__, __API_BASE__) —— 构建后这些会被替换成对应字符串字面量。
注入环境变量并控制可见范围
Vite 默认只暴露以 VITE_ 开头的环境变量到客户端代码,但 define 可突破此限制,实现更灵活的注入:
立即学习“Java免费学习笔记(深入)”;
- 若需把
process.env.NODE_ENV安全暴露(避免运行时报错),可写:process.env.NODE_ENV: JSON.stringify(process.env.NODE_ENV) - 想让
process.env整体存在且为空对象(防未定义错误),用:'process.env': JSON.stringify({}) - 注意:键名含点号(如
process.env)必须加单引号包裹,否则 JS 语法报错
结合构建命令动态生成值
define 支持函数式配置,可在不同命令下注入不同内容:
- 区分 dev / build 场景:
export default defineConfig(({ command }) => ({
define: {
__MODE__: JSON.stringify(command), // "serve" 或 "build"
__DEBUG__: JSON.stringify(command === 'serve')
}
```
这样开发时 __DEBUG__ 为 true,上线后自动变为 false,无需手动切换。
注意事项与常见避坑
确保注入行为稳定可靠,需留意以下几点:
- 所有值必须是 JSON 可序列化的(不能是函数、正则、undefined)
- 不要注入复杂对象后试图在运行时修改它——它是编译期静态替换,不是全局变量声明
- 避免与 TypeScript 类型冲突:在
env.d.ts中补充类型声明,例如:declare const __VERSION__: string; - 如果项目用了
esbuild或自定义 minifier,确认其未移除这些常量(一般不会,但压缩级别过高时个别 minifier 可能误判)


















