Code前端首页关于Code前端联系我们

.env.development

terry 11小时前 阅读数 14 #Vue

不少刚接触Vue2的同学,一碰到接口请求就犯愁:baseURL是干啥的?开发和生产环境咋配才能不踩坑?不同场景下怎么灵活调整?今天咱就把Vue2里baseURL的门道掰开揉碎,从基础到进阶一次性讲明白,不管是新手入门还是解决实际项目问题,看完心里都有数~

baseURL是啥?为啥Vue2项目里得重视它?

先搞懂“baseURL”的本质:它是前端发起接口请求时,所有接口地址的公共前缀,举个栗子🌰:假设后端所有接口都长这样——https://xxx.com/api/userhttps://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前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门