vue-cli4 mode、NODE_ENV、webpack mode
- 最近使用
vue-cli4
初始化了一个项目,对其中mode、NODE_ENV、webpack mode
的关系有点迷 - 所以花了点时间整理了下
vue-cli4 环境变量
声明环境变量
vue-cli
可通过.env
前缀的环境文件来声明环境变量
1 | # .env |
- 被载入的变量将会对
vue-cli-service
的所有命令、插件和依赖可用
客户端可以使用的环境变量
- 在客户端(
src/目录下
)可以使用process.env.XXX
来引用环境变量,主要有下面的变量可以引用- 环境文件中以
VUE_APP_
开头的环境变量 NODE_ENV
, 会是development
、production
或test
中的一个BASE_URL
,会和vue.config.js
中的publicPath
选项相符
- 环境文件中以
vue-cli mode
默认 mode
mode
可以理解为vue-cli
运行的一个环境,一个标志量;内部的插件依赖此变量来决定是否启用vue-cli mode
默认只会有development
、production
、test
三种取值development
- 会在调用
vue-cli-service serve
命令时,mode
被设置为development
- 会在调用
production
- 会在调用
vue-cli-service build
和vue-cli-service test:e2e
命令时,mode
被设置为production
- 会在调用
test
- 会在调用
vue-cli-service test:unit
命令时,mode
被设置为test
- 会在调用
- 每个模式都会将
NODE_ENV
的值设置为模式的名称——比如在development
模式下NODE_ENV
的值会被设置为development
覆盖、自定义 mode
- 可以使用
vue-cli-service xxx --mode custom
来覆盖原有mode
(自定义 mode)
vue-cli mode 和环境文件的关系
- 当指定了
mode
时(无论是命令默认值还是--mode
自定义的) - 会去项目根目录下找到
.env.[mode]
文件,读取并设置其中的环境变量 - 如果
mode
的值是除development、production、test
以外的值,则需要在环境文件中手动指定NODE_ENV
值,这样vue-cli
内部的插件才知道需要工作在哪种环境下 - 例子
vue-cli-service build --mode staging
,使用--mode
覆盖了默认的production
模式,则需要在.env.staging
环境文件中手动指定NODE_ENV
1 | # .env.staging |
vue-cli mode
和NODE_ENV
及webpack mode
三者间是如何互动,下面会解释
vue-cli mode、NODE_ENV、webpack mode 三者的关系
webpack mode
- webpack 从 4 开始,支持
mode
选项,根据mode
自动开启一些插件和优化 mode
的可选值有development
- 告知
webpack
启用NamedChunksPlugin
和NamedModulesPlugin
- 告知
production
- 告知
webpack
启用FlagDependencyUsagePlugin
、FlagIncludedChunksPlugin
、ModuleConcatenationPlugin
、NoEmitOnErrorsPlugin
、OccurrenceOrderPlugin
、SideEffectsFlagPlugin
、UglifyJsPlugin
- 启用压缩、优化
- 告知
vue-cli
内部会使用到webpack
,所以也需要设置webpack mode
三者关系
- 首先在
vue-cli
中NODE_ENV
默认被设置为development
,除非vue-cli mode
为production
或者test
- 其次,环境文件中的
NODE_ENV
具有更高的优先级,即如果环境文件中也有设置NODE_ENV
,则会覆盖上一步的NODE_ENV
- 最后
webpack mode
是根据上一步的NODE_ENV
值来确定的,只要值不是production
,则webpack
都会运行在development
模式
例子 1
vue-cli-service serve
mode
初始为development
,NODE_ENV
初始为development
.env.development
1 | NODE_ENV=production # 被覆盖为production |
NODE_ENV
最终为production
,所以webpack mode
最终为production
,会启用压缩、优化等行为
例子 2
vue-cli-service build --mode staging
- 通过
cli
参数覆盖默认mode
,此时mode
为staging
- 通过
.env.staging
1 | # 未设置NODE_ENV |
- 由于使用了自定义
mode
、环境文件中又没有设置NODE_ENV
,导致NODE_ENV
为默认值development
、所以webpack mode
为development
,并不会启用压缩等行为
例子 3
vue-cli-service build --mode staging
- 通过
cli
参数覆盖默认mode
,此时mode
为staging
- 通过
.env.staging
1 | NODE_ENV=production # 设置NODE_ENV |
- 环境文件中设置了
NODE_ENV=production
,所以webpack mode
为production
例子 4
vue-cli-service build --mode staging
- 通过
cli
参数覆盖默认mode
,此时mode
为staging
- 通过
.env.staging
1 | NODE_ENV=staging # 设置NODE_ENV为非production、development、test的值 |
- 环境文件中设置了
NODE_ENV=staging
,所以webpack mode
会运行在默认development
环境下