使用vite 构建项目时,管理变量的方式有如下几种:
- 从
.env等文件中读取; - 在
vite.config.js中定义; - 通过命令行参数配置;
- 从
package.json等文件中读取并注入;
以上的几种方式,都可以将变量注入到项目中,但是注入的方式不同:
- 一类是注入到
import.meta.env; - 一类是注入为全局变量 ;
1. .env文件;
vite 会自动加载项目根目录下的 .env 文件,.env 文件中以 VITE_ 开头的变量会自动注入到 import.meta.env 中,例如:
1 | # .env |
加载完毕后,import.meta.env 中的变量如下:
1 | console.log(import.meta.env.VITE_DEFAULT); // .env |
多个 .env 文件等加载顺序如下:
.env;.env.local;.env.[mode];.env.[mode].local;
如果存在多个的 .env 文件,则后面的会覆盖前面的,例如:
1 | # .env |
加载完毕后,import.meta.env 中的变量如下:
1 | console.log(import.meta.env.VITE_DEFAULT); // .env.local |
如果要指定当前的模式(注意与 NODE_ENV 的区别),可以在命令行中指定,例如:
1 | vite --mode development # 默认加载 .env.development |
2. 在vite.config.js文件中进行定义
vite.config.js 文件中可以配置 define 属性,该属性是一个对象,可以配置一些全局变量,例如:
1 | export default defineConfig({ |
注意这里的差异:加载完毕后,VITE_VAR_1 会注入到import.meta.env ,而其他则是注入为全局变量:
1 | console.log(import.meta.env.VITE_VAR_1); // "[vite.config.ts]var_1" |
如果使用 Typescript,则配置文件是vite.config.ts ,同时需要在 src/vite-env.d.ts 中定义全局变量的类型:
1 | // vite-env.d.ts |
3. 通过命令行参数进行配置
可以在命令行中指定环境变量,例如:
1 | cross-env VITE_DEFAULT='[cli]default' VITE_NAME='[cli]name' vite |
注:cross-env是一个跨平台设置环境变量的包,用来解决不同平台设置环境变量的问题。
执行命令后,import.meta.env 中的变量如下:
1 | console.log(import.meta.env.VITE_DEFAULT); // [cli]default |
4. 从package.json等文件加载变量
这个方式其实还是第二种方法:vite.config.js中定义,只不过是从package.json中读取的,单独列出来是因为package.json是标准文件,有时候也用来配置自定义变量:。
vite默认不会读取 package.json 中的变量,如果需要读取,可以在 vite.config.js 中进行配置:
1 | impport pkg from "./package.json"; |
注意:如果package.json 中的变量是字符串,则需要使用 JSON.stringify 进行包裹。 否则,会被解析为变量。
1 | //package.json |
加载完毕后,APP_NAME 会注入到import.meta.env ,例如:
1 | console.log(import.meta.env.APP_NAME); // "vite-env-demo" |
总结
如果一个变量同时通过.env、vite.config.js、命令行参数定义,则优先级如下:
- 优先级低:
.env; - 优先级中:
命令行参数; - 优先级高:
vite.config.js;
示例程序:https://github.com/xesam/react-dev-examples