Vue2中env文件怎么玩?从基础到实战的环境配置指南
做Vue2项目时,是不是总碰到“开发时用测试接口,上线要切正式接口”“本地要开调试工具,生产得关掉”这类需求?这时候「env文件」就是解决环境配置的关键!但刚上手的话,可能连.env文件咋建、变量咋用、不同环境咋区分都摸不着头脑,这篇文章从基础到实战,把Vue2里env的玩法、避坑点全拆明白,跟着步骤走,环境配置再也不犯难~
Vue2里的env是干啥的?
简单说,env文件是用来管理不同环境变量的,比如开发、测试、生产环境,接口域名、功能开关、调试配置肯定不一样,要是每次切换环境都手动改代码里的配置,不仅麻烦还容易出错,而env文件能让我们把这些“环境专属配置”单独存起来,打包或运行时自动加载对应环境的变量,代码里只需要读这些变量就行,不用手动改逻辑。
举个实际场景:开发时,后端给的测试接口是http://dev-api.com
;测试环境要换成http://staging-api.com
;生产环境得用https://prod-api.com
,有了env文件,每个环境对应一个配置文件,打包时选对环境,接口地址自动切换,不用改一行业务代码。
Vue2里的env机制,是靠Vue CLI(脚手架)实现的,它基于webpack的环境变量注入逻辑,把.env文件里的变量打包进项目,代码里通过process.env.变量名
就能拿到值。
怎么创建不同环境的env文件?
Vue2对env文件的命名和规则有严格要求,把这部分搞明白才能正确配置:
文件命名格式
必须以.env
开头,后面跟环境标识,常见的有:
.env.development
→ 开发环境(本地开发时用).env.production
→ 生产环境(上线打包时用).env.staging
→ 测试环境(很多团队用来做预发布,可选)
要是想自定义环境(比如叫test),就建.env.test
,后面配置打包命令时指定mode为test就行。
文件里咋写变量?
每个.env文件里,变量要写成“键=值”的形式,而且变量名必须以VUEAPP
开头(这是Vue CLI的规则,不然识别不到),比如开发环境的接口配置:
# .env.development里的内容 VUE_APP_BASE_API = 'http://dev-api.com' VUE_APP_DEBUG_TOOL = true
生产环境要关闭调试工具、换正式接口:
# .env.production里的内容 VUE_APP_BASE_API = 'https://prod-api.com' VUE_APP_DEBUG_TOOL = false
注意:值如果是字符串,建议用引号包起来;布尔值直接写true/false就行,代码里取的时候要注意类型转换(后面会讲)。
文件放哪?
所有.env文件要放在项目的根目录(和package.json同级),这样Vue CLI才能找到。
代码里咋用这些环境变量?
配置好env文件后,代码里通过process.env.VUE_APP_xxx
就能拿到变量,举几个常见场景:
配置axios的基础接口
比如项目里用axios发请求,要根据环境换基础地址,在axios的配置文件(比如src/utils/request.js
)里写:
import axios from 'axios' const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, // 读取env里的接口地址 timeout: 5000 }) export default service
这样开发时自动用dev-api,生产打包后自动换成prod-api,不用手动改。
组件里用环境变量
比如在某个组件里,根据环境判断是否显示调试按钮:
<template> <button v-if="isDebug">调试工具</button> </template> <script> export default { computed: { isDebug() { // 注意:env里的布尔值是字符串,所以要转成布尔型 return process.env.VUE_APP_DEBUG_TOOL === 'true' } } } </script>
这里要注意:env文件里的布尔值存的是字符串(比如VUE_APP_DEBUG_TOOL = true
,实际读取是'true'
),所以代码里要转成布尔型判断。
打包时指定环境
Vue CLI默认的npm run serve
会加载.env.development
;npm run build
默认加载.env.production
,如果要指定环境,得在package.json
的scripts
里加命令,用--mode
指定环境标识。
比如给测试环境加打包命令:
{ "scripts": { "serve": "vue-cli-service serve", "build:prod": "vue-cli-service build --mode production", "build:staging": "vue-cli-service build --mode staging" } }
执行npm run build:staging
时,就会加载.env.staging
里的变量,打包出测试环境的代码。
开发、生产环境配置有啥区别?
不同环境的配置逻辑和用途完全不一样,得根据场景设计变量:
开发环境(development)
- 用途:本地开发、联调、自测
- 典型配置:
- 接口地址:测试服接口(方便和后端联调)
- 调试工具:开启(比如vConsole、vue-devtools)
- 代码压缩:关闭(方便本地调试,看报错)
- 日志打印:开启(方便排查问题)
生产环境(production)
- 用途:正式上线,面向用户
- 典型配置:
- 接口地址:正式服接口(必须稳定)
- 调试工具:关闭(防止用户看到内部信息)
- 代码压缩:开启(减小包体积,加快加载)
- 日志打印:关闭(减少性能消耗,避免敏感信息泄露)
测试环境(staging,可选)
- 用途:测试团队验收、灰度发布前验证
- 典型配置:
- 接口地址:预发布服接口(和生产接近,但数据是测试用的)
- 调试工具:部分开启(比如只开日志,方便测试报bug)
- 代码压缩:开启(模拟生产环境性能)
简单说,开发环境怎么方便怎么来,生产环境怎么安全稳定怎么来,测试环境介于两者之间。
env配置的常见坑,怎么避?
刚用env时,很容易踩这些“隐形陷阱”,提前避坑能省很多时间:
变量名没加VUEAPP
前缀
Vue CLI只认以VUEAPP
开头的变量!如果写了BASE_API = 'xxx'
,代码里process.env.BASE_API
会是undefined
。解决方法:所有变量名前面加上VUEAPP
,比如VUE_APP_BASE_API
。
改了env文件没重启项目
env文件的加载是在项目启动/打包时完成的,本地开发时改了.env文件,必须重启npm run serve
才会生效。解决方法:改完env文件后,先停掉本地服务,再重新启动。
生产环境打包后,变量没生效
有时候执行npm run build:prod
后,接口还是开发环境的地址——大概率是打包时mode没指定对,或者.env.production里的变量写错了。解决方法:检查package.json里的build命令是否加了--mode production
,再检查.env.production里的变量名和值是否正确。
自定义环境不生效
想加个test环境,建了.env.test,但是执行npm run build:test
没加载到变量。解决方法:确保package.json里的命令是vue-cli-service build --mode test
(mode要和.env.test的“test”对应),env.test里的变量名带VUEAPP
。
实战:给Vue2项目配多环境接口
光讲理论不够,用实际案例演示怎么配多环境接口,步骤清晰到新手也能跟:
步骤1:创建不同环境的env文件
在项目根目录新建三个文件:
.env.development
(开发).env.staging
(测试).env.production
(生产)
分别写入接口配置:
# .env.development VUE_APP_BASE_API = 'http://dev-api.yourcompany.com' # .env.staging VUE_APP_BASE_API = 'http://staging-api.yourcompany.com' # .env.production VUE_APP_BASE_API = 'https://prod-api.yourcompany.com'
步骤2:配置package.json的scripts
给不同环境加打包/运行命令:
{ "scripts": { "serve": "vue-cli-service serve", // 开发环境,默认加载.env.development "build:prod": "vue-cli-service build --mode production", // 生产打包 "build:staging": "vue-cli-service build --mode staging", // 测试打包 "test:serve": "vue-cli-service serve --mode staging" // 本地跑测试环境(可选,方便测试预发布逻辑) } }
步骤3:在axios里配置基础地址
新建src/utils/request.js
,配置axios:
import axios from 'axios' const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, timeout: 5000 }) // 请求拦截、响应拦截可以再加,这里省略... export default service
步骤4:测试不同环境
- 本地开发:执行
npm run serve
,axios的baseURL会是dev-api,页面上能调测试接口。 - 测试环境打包:执行
npm run build:staging
,打包后的代码里baseURL是staging-api,部署到测试服给测试团队验收。 - 生产环境打包:执行
npm run build:prod
,打包后baseURL是prod-api,直接上线。
如果想本地跑测试环境(看测试接口的效果),执行npm run test:serve
,此时项目用的是.env.staging的配置,和测试服接口联调更方便。
进阶:env和全局常量结合,玩出更多花样
除了接口地址,env还能管理功能开关、日志配置、第三方key等。
场景1:控制日志打印
在.env.development里开日志,生产环境关:
# .env.development VUE_APP_LOG_ENABLE = true # .env.production VUE_APP_LOG_ENABLE = false
然后在src/utils/log.js
里封装日志工具:
export function log(...args) { if (process.env.VUE_APP_LOG_ENABLE === 'true') { console.log('[自定义日志]', ...args) } }
组件里用:
<template>...</template> <script> import { log } from '@/utils/log.js' export default { mounted() { log('组件挂载了', this.data) // 开发环境打印,生产环境不打印 } } </script>
场景2:全局注入环境变量
有些配置要在很多组件里用,每次写process.env
太麻烦,可以在main.js里注入全局变量:
import Vue from 'vue' import App from './App.vue' // 注入全局环境配置 Vue.prototype.$envConfig = { baseApi: process.env.VUE_APP_BASE_API, logEnable: process.env.VUE_APP_LOG_ENABLE === 'true' } new Vue({ render: h => h(App) }).$mount('#app')
组件里直接用this.$envConfig.baseApi
,更简洁:
<script> export default { mounted() { if (this.$envConfig.logEnable) { console.log('当前接口地址:', this.$envConfig.baseApi) } } } </script>
这样一来,env不仅能管接口,还能统筹整个项目的环境专属逻辑,扩展性拉满~
看完这些,再碰到环境配置的需求,是不是觉得清晰多了?总结下核心点:env文件靠命名区分环境,变量名带VUE_APP_,代码里用process.env拿值,打包时用--mode指定环境,从基础配置到实战案例,再到进阶玩法,把这些逻辑吃透,Vue2项目的多环境管理就稳了~要是还有疑问,评论区留言,咱们再唠~
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。