vue项目开发,会经历本地测试、打包、生产过程,其中不同阶段需要调试的api接口环境不同,要根据具体来设置。其实主要就是两个方面,配置‘本地运行’和‘打包运行’的api接口环境。
(1)创建文件src/utils/baseURL.js
module.exports={local:'我是本地环境', //本地环境(一般是连接后端主机ip进行本地调试)development:'我是开发环境', // 开发环境(一般是连接测试服务器ip地址)baseURL:'我是生产环境', //生产环境(一般是线上正式发版的ip地址)otherUrl:'我是其他环境' // 其他环境(其他请求ip地址)}
(2)找到package.json,修改scripts属性对象
"scripts": {"dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js","start": "npm run dev","build": "node build/build.js"},
"scripts": {"dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js","dev_test": "webpack-dev-server --inline --progress --env=test --config build/webpack.dev.conf.js","dev_prod": "webpack-dev-server --inline --progress --env=prod --config build/webpack.dev.conf.js","start": "npm run dev","build": "node build/build.js"},
(3)修改config/dev.env.js
'use strict'const merge = require('webpack-merge')const prodEnv = require('./prod.env')const URL = require('../src/utils/baseURL.js')let params = process.argv[4]let baseUrl = ''let environment = nullswitch(params){// 本地环境case '--config':environment = "'本地环境'"baseUrl = `"${URL.local}"`break// 开发环境case '--env=test':environment = "'开发环境'"baseUrl = `"${URL.development}"`break// 生产环境case '--env=prod':environment = "'生产环境'"baseUrl = `"${URL.baseURL}"`break// 其他default:environment = "'其他'"baseUrl = `"${URL.otherUrl}"`}// 本地开发module.exports = merge(prodEnv, {NODE_ENV: '"development"',baseUrl:baseUrl,local:true,environment:environment})
(4)修改config/prod.env.js
'use strict'const merge = require('webpack-merge')const prodEnv = require('./prod.env')const URL = require('../src/utils/baseURL.js')let params = process.argv[2]let baseUrl = ''let environment = nullswitch(params){// 本地环境case '--inline':environment = "'本地环境'"baseUrl = `"${URL.local}"`break// 开发环境case 'test':environment = "'开发环境'"baseUrl = `"${URL.development}"`break// 生产环境case 'prod':environment = "'生产环境'"baseUrl = `"${URL.baseURL}"`break// 其他default:environment = "'其他'"baseUrl = `"${URL.otherUrl}"`}// 打包环境module.exports = merge(prodEnv, {NODE_ENV: '"production"',baseUrl:baseUrl,local:false,environment:environment})
(5)main.js获取环境并且注册挂载vue原型上
// 注册全局域名接口调用Vue.prototype.$baseUrl = process.env.baseUrl// 注册当前运行或者打包的是什么环境下的Vue.prototype.$Environment = process.env.environment
完成以上
本地项目启动命令使用:npm run dev,npm run dev_test、npm run dev_prod
打包环境命令使用:npm run build,npm run build test、npm run build prod
提示:process.env.baseUrl和process.env.environment变量可以在任意页面和组件中使用和访问
console.log( process.env.environment) // 获取当前是什么开发环境
可以通过process.env.local 布尔值来判断 当前是本地开发访问 还是线上访问,可以对请求封装和反向代理做一些区别和逻辑
// 配置请求基本信息(详见文档 | 这里只做了简单的配置)// baseurl / 超时时间(5秒) /if(process.env.NODE_ENV=='development'&&process.env.environment=='本地环境'){axios.defaults.baseURL = '/my'}else{axios.defaults.baseURL = process.env.baseUrl}
// axiosimport axios from 'axios'// 获取tokenvar token = localStorage.getItem('Token')// 配置请求基本信息(详见文档 | 这里只做了简单的配置)// baseurl / 超时时间(5秒) /if(process.env.NODE_ENV=='development'&&process.env.environment=='本地环境'){axios.defaults.baseURL = '/my'}else{axios.defaults.baseURL = process.env.baseUrl}// axios.defaults.baseURL = ''axios.defaults.timeout = 7000/*** POST - 请求封装* @param url* @param data* @returns Promise*/export function post(url, data = {}){// headers(携带token)axios.defaults.headers.common['token'] = token;// data 公共参数设置(例如token)// 如果你的服务端接口没有规定则不需要以下操作// [每次请求接口 data 数据必须携带的参数]// data.uid = uid// data.token = token// data.model = 'Browser'// data.platform = 'H5'return new Promise((resolve, reject) => {axios.post(url, data,{headers: {'content-type': 'application/x-www-form-urlencoded',}})// 请求成功回调.then(response => {// 拿到结果先对状态码进行对应处理(调用下方函数)// 传入状态码给处理函数即可(code)serveCode(response.data.code,response.data.message)// ok(正常返回)resolve(response.data);},// 请求失败回调err => {// 请求失败后(做一个弹出框提示用户)// 当然也可以做其他操作alert(err.message)reject(err)})})}/*** GET - 请求封装(与POST请求一样 | axios.get)* @param url* @param data* @returns Promise*/// ...export function get(url, data = {}){// headers(携带token)axios.defaults.headers.common['token'] = token;// data 公共参数设置(例如token)// 如果你的服务端接口没有规定则不需要以下操作// [每次请求接口 data 数据必须携带的参数]// data.uid = uid// data.token = token// data.model = 'Browser'// data.platform = 'H5'return new Promise((resolve, reject) => {axios({method: 'get',url: url,params: data,})// 请求成功回调.then(response => {// 拿到结果先对状态码进行对应处理(调用下方函数)// 传入状态码给处理函数即可(code)serveCode(response.data.code,response.data.message)// ok(正常返回)resolve(response.data);},// 请求失败回调err => {// 请求失败后(做一个弹出框提示用户)// 当然也可以做其他操作alert(err.message)reject(err)})})}/*** DELETE - 请求封装(与POST请求一样 | axios.delete)* @param url* @param data* @returns Promise*/// .../*** 状态码处理* @param {Number} code - 状态码* @return void*/function serveCode(code,message) {switch(code){// 无权限访问,请尝试重新登录case 1001 :// elementUI 提示框MessageBox.alert('为了您的账号安全,请重新登录系统', '登录已过期', {type: 'error',confirmButtonText: '我知道了',showClose: false,center: true})// 用户点击确认框.then(() => {// 做一些事情...// 例如登录已经过期了(清除缓存)// localStorage.removeItem('token')// localStorage.removeItem('uid')// 最后跳转到登录页// router.push('/login')})break;case 400 :// elementUI 提示框Message({showClose: true,duration: '2000',message: message,type: 'error'})break;// 其他状态码情况处理// ...}}
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号