.env.development
不少刚接触Vue2的同学,一碰到接口请求就犯愁:baseURL是干啥的?开发和生产环境咋配才能不踩坑?不同场景下怎么灵活调整?今天咱就把Vue2里baseURL的门道掰开揉碎,从基础到进阶一次性讲明白,不管是新手入门还是解决实际项目问题,看完心里都有数~
baseURL是啥?为啥Vue2项目里得重视它?
先搞懂“baseURL”的本质:它是前端发起接口请求时,所有接口地址的公共前缀,举个栗子🌰:假设后端所有接口都长这样——https://xxx.com/api/user
、https://xxx.com/api/goods
,那https://xxx.com/api
就是这些接口的baseURL。
那它在Vue2项目里有啥用?这得结合axios(前端最常用的请求库)
- 减少重复代码:要是每个接口都写完整域名,后期换域名得一个个改,麻烦到哭!用baseURL的话,只改一处配置,所有接口自动更新。
- 环境切换丝滑:开发时连本地后端(比如
http://localhost:3000/api
),生产时切线上域名(比如https://www.xxx.com/api
),改个配置文件就行,不用动业务代码。 - axios全局管控:axios支持创建“实例”,给实例全局设baseURL后,所有通过这个实例发的请求,都会自动拼接前缀,代码清爽到飞起~
Vue2项目里咋配置baseURL?最基础的步骤是啥?
配置baseURL的核心逻辑是:用axios创建实例 + 结合Vue-cli的环境变量,分环境管理不同的baseURL,步骤拆解如下:
安装并引入axios
先给项目装axios(如果没装的话):
npm install axios --save
然后在项目里新建一个“请求工具文件”,比如src/utils/request.js
,用来创建axios实例:
import axios from 'axios' // 创建axios实例,命名为service(名字随意) const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, // 关键:这里用环境变量动态赋值 timeout: 5000, // 请求超时时间,比如5秒没响应就报错 }) export default service // 导出实例,供其他文件调用
用“环境变量”分环境配置baseURL
Vue-cli项目里,不同环境(开发、生产、测试)的配置,靠根目录下的.env文件管理,重点记这几个文件:
-
开发环境:
.env.development
示例:VUE_APP_BASE_API = 'http://localhost:3000/api'
(本地后端服务地址,开发时用)
-
生产环境:
.env.production
示例:VUE_APP_BASE_API = 'https://www.xxx.com/api'
(线上后端服务地址,打包部署时用)
-
测试环境(可选):
.env.staging
类似,对应测试服地址。
⚠️ 注意:Vue-cli要求环境变量必须以VUE_APP_
开头,否则webpack打包时识别不到!
在组件/页面里用配置好的axios实例
比如在src/components/User.vue
里发请求:
import request from '@/utils/request' // 引入刚才创建的axios实例 export default { methods: { async getUserInfo() { try { const res = await request.get('/userinfo') // 请求地址是:baseURL + '/userinfo' → 开发时是http://localhost:3000/api/userinfo console.log(res.data) } catch (err) { console.error('请求失败:', err) } } } }
开发和生产环境配置baseURL,这些细节能少踩坑!
配置时最容易栽跟头的,就是开发、生产环境的差异处理,分享几个实战技巧:
环境变量文件的“隐藏规则”
- 文件名必须对应环境:
.env.development
对应开发环境(npm run serve
时生效),.env.production
对应生产环境(npm run build
时生效),如果文件名写错(比如写成.env.dev
),环境变量直接失效,baseURL变成undefined
,请求直接挂掉! - 文件要放在项目根目录(和
package.json
同级),不然Vue-cli找不到配置。
本地开发“跨域问题”的解法:反向代理
本地开发时,后端接口没开CORS(跨域资源共享),浏览器会拦截请求,报跨域错误,这时候光配baseURL没用,得结合Vue-cli的反向代理。
在vue.config.js
(项目根目录,没有就新建)里配置:
module.exports = { devServer: { proxy: { '/api': { // 匹配所有以/api开头的请求 target: 'http://localhost:3000', // 后端真实地址 changeOrigin: true, // 开启跨域(把请求头里的host改成target的地址) pathRewrite: { '^/api': '' } // 如果后端接口没有/api前缀,把请求里的/api去掉 } } } }
这时候,开发环境的baseURL可以设为'/api'
(对应代理的标识),请求流程变成:
前端请求/api/userinfo
→ 被代理到http://localhost:3000/userinfo
(如果pathRewrite配置了去掉/api)→ 后端处理后返回,同时响应头带CORS信息,浏览器不拦截。
测试环境的“中间态”处理
很多公司有专门的测试服,需要单独配置baseURL,这时可以:
- 新建
.env.staging
文件,配置测试服的baseURL:VUE_APP_BASE_API = 'https://test.xxx.com/api'
- 在
package.json
里加一条打包测试环境的脚本:"scripts": { "build:staging": "vue-cli-service build --mode staging" }
这样执行
npm run build:staging
时,会自动读取.env.staging
的配置,打包测试环境的代码。
配置baseURL时最容易踩的“坑”,咋避?
新手配置baseURL,这几个“雷区”高频踩中,提前避坑:
环境变量没生效,baseURL变成undefined
症状:请求时控制台报错,说url是undefined/userinfo
这种。
原因+解决:
- 检查
.env
文件里的变量名,必须是VUE_APP_xxx
开头(比如VUE_APP_BASE_API
),少个下划线都不行! - 确认文件位置在项目根目录,不是藏在
src
或其他文件夹里。 - 改了
.env
文件后,必须重启项目(重新执行npm run serve
),环境变量才会生效。
接口路径“多斜杠”或“少斜杠”,请求404
症状:请求地址变成http://xxx.com/api//userinfo
(双斜杠),或者http://xxx.comuserinfo
(少域名后缀)。
原因:baseURL和请求url的斜杠规则不一致。
- baseURL设为
'http://xxx.com/api/'
(末尾有斜杠),请求url写'/userinfo'
(开头有斜杠)→ 拼接后变成http://xxx.com/api//userinfo
。 - baseURL设为
'http://xxx.com/api'
(末尾没斜杠),请求url写'userinfo'
(开头没斜杠)→ 拼接后变成http://xxx.com/apiuserinfo
(少了个斜杠,地址错误)。
解决:统一规则!比如选一种风格:
- 风格1:baseURL末尾加斜杠,请求url开头不加 →
baseURL: 'http://xxx.com/api/'
,请求url:'userinfo'
→ 拼接后http://xxx.com/api/userinfo
。 - 风格2:baseURL末尾不加斜杠,请求url开头加 →
baseURL: 'http://xxx.com/api'
,请求url:'/userinfo'
→ 拼接后http://xxx.com/api/userinfo
。
生产环境打包后,baseURL还是开发环境的地址
症状:本地开发正常,打包部署到线上后,接口请求还是发往http://localhost:3000
,导致404。
原因:打包时用错了环境,比如执行npm run build
时,Vue-cli默认读.env.production
,但如果你的.env.production
没配置,或者配置错了,就会出问题。
解决:
- 检查
.env.production
里的VUE_APP_BASE_API
是否是线上地址。 - 确认打包命令是
npm run build
(对应生产环境),而不是误执行了npm run serve
(开发环境)。
把“跨域问题”甩锅给baseURL
症状:本地开发时,配了baseURL但请求还是报跨域错误。
原因:跨域是浏览器的安全策略,和baseURL没关系,如果后端没开CORS,就算你配了baseURL,浏览器也会拦截请求。
解决:本地开发用反向代理(前面讲的vue.config.js
里的devServer.proxy
),把前端请求代理到后端,绕开浏览器的跨域拦截。
进阶玩法:多场景下baseURL咋灵活应对?
实际项目里,baseURL的需求更复杂——比如对接多个后端、Mock数据、用户动态切换地址……分享几个进阶思路:
对接多个后端?创建多个axios实例!
如果项目要调多个后端的接口(比如用户系统用api1
,订单系统用api2
),可以给每个后端建一个axios实例:
// src/utils/request1.js → 对接用户系统 import axios from 'axios' export default axios.create({ baseURL: process.env.VUE_APP_API1, timeout: 5000 }) // src/utils/request2.js → 对接订单系统 import axios from 'axios' export default axios.create({ baseURL: process.env.VUE_APP_API2, timeout: 5000 })
然后在.env
文件里配置多个环境变量:
VUE_APP_API2 = 'http://localhost:4000/order-api' # .env.production VUE_APP_API1 = 'https://www.xxx.com/user-api' VUE_APP_API2 = 'https://www.xxx.com/order-api'
用的时候按需引入:
import request1 from '@/utils/request1' import request2 from '@/utils/request2' request1.get('/userinfo') // 调用户系统接口 request2.get('/orderlist') // 调订单系统接口
Mock数据时,baseURL咋玩?
开发前期后端接口没ready,需要用Mock.js模拟数据,这时可以:
-
方案1:动态改baseURL
在request.js
里判断环境,给axios实例换baseURL:const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, timeout: 5000 }) // 开发环境且需要Mock时,切换baseURL到Mock服务 if (process.env.NODE_ENV === 'development' && 开启Mock) { service.defaults.baseURL = '/mock' // 配合vue.config.js的devServer.proxy,把/mock代理到本地Mock服务 }
-
方案2:直接拦截请求返回Mock数据
用axios的拦截器,直接返回Mock数据,不用改baseURL:service.interceptors.request.use(config => { // Mock逻辑:如果是开发环境,且请求匹配Mock规则,返回假数据 if (process.env.NODE_ENV === 'development' && config.url === '/userinfo') { return Promise.resolve({ data: { name: ' Mock用户', age: 18 } }) } return config })
用户动态切换baseURL(比如切换区域)
有些项目需要用户选择“国内/海外”等区域,对应不同的后端地址,这时可以动态修改axios实例的baseURL:
// 在utils/request.js里导出一个“修改baseURL”的方法 let service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, timeout: 5000 }) export function setBaseURL(newUrl) { service.defaults.baseURL = newUrl } export default service
用户切换区域时调用:
import { setBaseURL } from '@/utils/request' // 比如用户选了海外区域,后端地址是https://oversea.xxx.com/api setBaseURL('https://oversea.xxx.com/api') // 之后的请求都会用新的baseURL request.get('/userinfo')
⚠️ 注意:已经发出去的请求不受影响,只有之后发起的请求会用新地址。
掌握baseURL,让Vue2接口请求更丝滑
绕了这么多,核心就这几点:
- baseURL是接口的“公共前缀”:提效、解耦环境,是前端请求层的关键配置。
- 配置要分环境:用Vue-cli的
.env
文件 +VUE_APP_
开头的环境变量,开发、生产、测试环境各司其职。 - 避坑抓细节:环境变量命名、路径斜杠、跨域代理、生产打包……每一步都得盯紧。
- 进阶场景灵活应对:多后端、Mock、动态切换……根据项目需求选合适的方案。
你可以打开自己的Vue2项目,试着配置不同环境的baseURL,用反向代理解决本地跨域,再模拟下多后端的场景~碰到问题时,回头看看这篇里的“坑”,大概率能找到解法~
要是还有啥细节没搞懂,评论区随时喊我,咱再唠唠~
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。