vuecli 环境变量 NODE_ENV 是由什么决定的

871 阅读1分钟

vuecli 项目支持 模式和环境变量, 那么 process.env.NODE_ENV 的值是由什么决定的? 由对应的 .env.[x] 文件来决定

当运行 vue-cli-service 命令时,所有的环境变量都从对应的环境文件中载入。如果文件内部不包含 NODE_ENV 变量,它的值将取决于模式; 默认则是 "development"

众所周知, vuecli 内置了三种模式:

  • --mode development 对应文件 .env.development
  • --mode production 对应文件 .env.production
  • --mode test, 对应文件 .env.test

以上三个文件中的 NODE_ENV 是被锁定的, 无法通过相应的 .env.[x] 文件来覆盖

使用其他自定义的模式时, 如果不在对应的 .env.[x] 文件中指定 NODE_ENV, 则默认为 development,

与启动方式(vue-cli-service serve, vue-cli-service build)无关

二 文件优先级

.env                # 在所有的环境中被载入
.env.local          # 在所有的环境中被载入,但会被 git 忽略
.env.[mode]         # 只在指定的模式中被载入
.env.[mode].local   # 只在指定的模式中被载入,但会被 git 忽略

文件中的变量会做合并, 比如, 当 .env.re .env.re.local 文件都存在时,

// .env.re
NODE_ENV=production

// .env.re.local
// 没写 NODE_ENV

// package.json
scripts:{
 "dev:re": "vue-cli-service serve --mode re",
}

本地开发, 执行 npm run dev:re 时, 发现实际的 NODE_ENV = production, 猜测原因是: 本地开发时, .env.re.local 优先级最高, 所有肯定被读取到, 加上

如果不在对应的 .env.[x] 文件中指定 NODE_ENV, 则默认为 development

    如果没有合并策略, 那么 `NODE_ENV` 应该是 `development`, 而实际不是 `development`, 所以存在合并策略

END