vue-cli11模式&环境变量使用及说明
作者:fangyinggui

模式
【模式】~ 是 vue-cli 项目中一个重要的概念。
【分类】vue-cli 默认有 3 个模式:
development: 用于 vue-cli-service serve;test: 用于 vue-cli-service test:unit;production: 用于 vue-cli-service build & vue-cli-service test:e2e;
注意
1 、可通过传递 --mode 选项参数为命令行覆写默认的模式。
- 例如:想要在构建命令中使用开发环境变量:
vue-cli-service build --mode development
2、当运行 vue-cli-service 命令时,所有的环境变量都从对应的环境文件中载入。
3、NODE_ENV将决定您的应用运行的模式,是开发,生产还是测试,因此也决定了创建哪种 webpack 配置。
- 示例 1:通过将 NODE_ENV 设置为 “test”, vue-cli 会创建一个优化过后的,并且旨在用于单元测试的 webpack 配置,它并不会处理图片以及一些对单元测试非必需的其他资源。
- 示例 2;NODE_ENV=development 创建一个 webpack 配置,该配置启用热更新,不会对资源进行 hash 也不会打出 vender bundles, 目的是为了在开发的时候能够快速重新构建。
- 示例 3:当你运行 vue-cli-service build 命令时,无论你要部署到哪个环境,应该始终把
NODE_ENV设置为 “production” 来获取可用于部署的应用程序。
4、若文件内不包含 NODE_ENV 变量,它的值将取决于模式。
- 例如:在 production 模式下被设置为 “production”, 在 test 模式下被设置为 “test”, 默认则是 “development”。
5、若在环境中有默认的 NODE_ENV, 应移除它或在运行 vue-cli-service 命令时明确地设置 NODE_ENV.
环境变量
【规则】vue-cli 项目可在根目录放置下列文件来指定环境变量:
.env # 在所有的环境中被载入 .env.local # 在所有的环境中被载入,但会被 git 忽略 .env.[mode] # 只在指定的模式中被载入 .env.[mode].local # 只在指定的模式中被载入,但会被 git 忽略
【示例】一个环境文件只包含环境变量的 “键=值” 对:
Foo=bar VUE_APP_NOT_SECRET_CODE=some_value
【注意】
1、不要在应用程序中存储任何机密信息;(例如:私有 API 秘钥)
2、环境变量会随着构建打包嵌入到输出代码,意味着任何人都有机会看到它;
3、只有 NODE_ENV, BASE_URL, 以 VUE_APP_ 开头的变量将通过 webpack.DefinePlugin 静态地嵌入到客户端侧的代码中。原因是为了避免意外公开机器上可能具有相同名称的私钥。
4、被载入变量将会对 vue-cli-service 的所有命令、插件和依赖可用。
【拓展】
dotenv 了解解析环境文件规则的细节,参考这个。
dotenv-expand 来实现变量扩展(Vue CLI 3.5+ 支持)。
FOO=foo BAR=bar CONCAT=$FOO$BAR # CONCAT=foobar
环境文件加载优先级
- 为一个特定模式准备的环境文件(例如
env.production)将会比一般的环境文件(例如.env) 拥有更高的优先级。 - .local 优先级 高于 其他;见下面 Staging 示例中;
- vue-cli 启动时 已经存在的环境变量 拥有最高优先级,并不会被 .env 文件覆写。
- 环境文件发生变化,需要重启服务。因为:.env 环境文件是通过运行 vue-cli-service 命令载入的,因此需要重启服务。
示例: Staging 模式
1、准备环境变量文件
- 1.1、假设有一个应用包含一个
.env文件;
VUE_APP_TITL=My App
- 1.2、和一个
.env.staging文件;
NODE_ENV=production VUE_APP_TITLE=My App(staging)
2、运行指令
2.1、指令 1:vue-cli-service build
会加载可能存在的 .env, .env.production, .env.production.local 文件然后构建出生产环境应用。
2.2、指令 2:vue-cli-service build --mode staging
会在 staging 模式下加载可能存在的 .env, .env.staging, .envstagin.local 文件然后创建出生产环境应用。
3、结论
2 种情况下,根据 NODE_ENV,构建出的应用都是生产环境应用的;
但在 staging 版本中, process.env.VUE_APP_TITLE 被覆写成了另一个值 “My App(staging)”。
客户端中使用环境变量
规则
规则:只有以 VUE_APP_ 开头的变量会被 webpack.DefinePlugin 静态嵌入到客户端侧的包中。
应用代码中访问: console.log(process.env.VUE_APP_SECRET)
构建过程中, precess.env.VUE_APP_SECRET 将会被相应的值所取代。
- 在 VUE_APP_SECRET=secret 时,会被替换为 “secret”。
- 在 VUE_APP_SECRET=noscret 时,会被替换为 “noscret”。
除了 VUE_APP_* 变量外,在应用代码中始终可用的还有 2 个特殊的变量:
VUE_APP_*
见上;
NODE_ENV
会是 “development”, “production” 或 “test” 中的一个。具体的值取决于应用运行的模式。
BASE_URL
会和 vue.config.js 中的 publicPath 选项相符,即应用会部署到的基础路径。
所有解析出来的环境变量都可以在 public/index.html 中以 HTML 插值中介绍的方式使用。
自定义
# 端口号 port=8888 # 注意:中间和末尾位置不能有空格
应用
1、版本信息;
注意:在 vue.config.js 文件中计算环境变量。它们仍然需要以 VUE_APP_ 前缀开头。
process.env.VUE_APP_VERSION = require('./package.json').version
module.exports = {
// config
}
只在本地有效的变量
场景:有时可能有些不应该提交到代码库中的变量,尤其是当项目托管托管在公共仓库时。
解决:应该使用一个 .env.local 文件取而代之。
本地环境文件默认会被忽略,且出现在 .gitignore 中。
.local 也可加在指定模式的环境文件上,比如 .env.development.local 将会在 development 模式下被载入,且被 git 忽略。
(vue-cli 中 git 忽略,普通的还是不会忽略)
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
