摘要:前端项目上线的时候不可避免的会考虑到不同的运行环境需要前端请求不同服务地址的问题方案一一般的情况下可以使用环境变量进行分环境打包开发环境继续使用代理需要编译的环境通过设置环境变量去控制打包过程最终生成适用于不同环境的前端资源有关环境
前端项目上线的时候 , 不可避免的会考虑到不同的运行环境需要前端请求不同服务地址的问题
方案一 :
一般的情况下 , 可以使用vue-cli-service环境变量进行分环境打包 ;
开发环境 , 继续使用proxy代理 ;
需要编译的环境 , 通过设置环境变量去控制打包过程 , 最终生成适用于不同环境的前端资源 ;
有关vue-cli-service环境变量的具体解释在另一篇文章中有详解 , 这里我们只关注实现
首先 , 我们需要添加各个环境的env配置文件 , 放在项目的根目录下
我们以联调环境为例 , 添加了一个.env.build_dev 文件
.env.build_dev
NODE_ENV="production" //表明这是需要编译的环境(需要打包) VUE_APP_CURRENTMODE="production" // 自定义的模式信息 VUE_APP_BASE_SERVER="http://****:8080" // 自定义的接口地址
在接口管理api.js文件中
import { fetchpost, fetchget, fetchput, fetchdelete } from "./config"; // 分环境打包 let baseUrl = ""; if (process.env.NODE_ENV == "development") { baseUrl = "/base" } else if (process.env.NODE_ENV == "production") { baseUrl = process.env.VUE_APP_BASE_SERVER } else { baseUrl = "" } export default { // 登录 login(params) { return fetchpost( `${baseUrl}/apis/v1/login`, params ); }, // 修改密码 setpsw(params) { return fetchput( `${baseUrl}/apis/v1/users/password`, params ); }, ...........略
接下来 , 我们需要在项目的package.json文件中为联调环境添加一个编译指令 "build_dev" , 并指定编译模式
package.json
"scripts": { "serve": "vue-cli-service serve", "build": "vue-cli-service build", "build_dev": "vue-cli-service build --mode build_dev", "build_pre_release": "vue-cli-service build --mode build_pre_release", "build_test": "vue-cli-service build --mode build_test", "lint": "vue-cli-service lint" },
这样 , 我们通过不同的指令去编译对应环境的前端资源
方案二 :
另一种方式, 是将前端请求的服务地址抽离出来 , 放进配置文件里面 ,
开发环境 , 继续使用proxy代理 ;
需要编译的环境 , 可以直接修改编译后的文件中的配置文件
这样的好处如下:
1: 前端不需要重复进行打包编译 ;
2: 自动化部署的时候可以使用脚本去替换前端资源中的配置文件 ;
3: 如果采用前端Docker化 , 可以在制作镜像的过程中修改/替换配置文件 ;
首先 , 我们将config.json文件放置在public文件夹中(防止被webpack编译)
在里面我们简单存放一个服务地址字段
config.json
{ "SERVER_URL": "" }
接下来,需要保证项目开始加载前 , 我们已经获取到这个配置文件了 , 所以在main.js 里面 , 我们需要先获取这个配置文件 , 再实例化vue
mian.js
import axios from "axios" // vue实例 function createdVue () { return new Vue({ router, store, render: h => h(App) }).$mount("#app"); } if (process.env.NODE_ENV == "development") { // 放在public文件夹下的静态文件需要通过绝对路径去获取 axios.get("/config.json").then(res=>{ // 开发环境通过proxy代理的形式 , 不需要获取配置地址 Vue.prototype.SERVER_URL = "" createdVue() }) } else if (process.env.NODE_ENV == "production") { // 放在public文件夹下的静态文件需要通过绝对路径去获取 axios.get("/config.json").then(res=>{ // 将获取到的配置文件作为全局变量保存 Vue.prototype.SERVER_URL = res.SERVER_URL // 成功获取到配置后再去创建vue实例 createdVue() }) }
一般项目中 , 我们都会对axios进行统一封装 , 为axios创建一个config.js 文件 , 里面对axios请求头 , baseUrl , 请求拦截 , 各种请求方式进行配置
在这里我们为每个请求添加baseUrl
config.js
import axios from "axios" import Vue from "vue"; import qs from "qs" import Router from "@/router.js" import {Message} from "element-ui" // axios.defaults.timeout = 10000 // 响应时间 // 获取全局变量中的服务地址 function getBaseUrl () { return Vue.prototype.SERVER_URL } // 配置请求头 axios.defaults.headers.post["Content-Type"] = "application/json" // 添加请求拦截器 axios.interceptors.request.use((config) => { // 为每次请求添加baseUrl config.baseURL = getBaseUrl() if (sessionStorage.token) { config.headers["Authorization"] = sessionStorage.token } return config }, (error) => { return Promise.reject(error) }) // 添加响应拦截器 axios.interceptors.response.use((res) => { // 如果错误码!==0;抛出异常 if (res.data.code && res.data.code !== 0) { switch (res.data.code) { case 1001: // 无权限 Router.replace("/login") break; case 1003: // 访问身份不合法 Router.replace("/login") break; default: break; } let message = res.data.msg || "出错了" return Promise.reject({message: message, err: res}) } else { return Promise.resolve(res.data) } }, (error) => { let message = "服务器错误" return Promise.reject({message: message, err: error}) }) // 返回一个Promise(发送post请求) export function fetchpost (url, params) { return new Promise((resolve, reject) => { axios.post(url, params).then(response => { resolve(response.data) }).catch((error) => { reject(error) }) }) } // 返回一个Promise(发送get请求) export function fetchget (url, params) { return new Promise((resolve, reject) => { axios.get(url, {params: params}).then(response => { resolve(response.data) }).catch((error) => { reject(error) }) }) } // 返回一个Promise(发送put请求) export function fetchput (url, params) { return new Promise((resolve, reject) => { axios.put(url, params).then(response => { resolve(response.data) }).catch((error) => { reject(error) }) }) } // 返回一个Promise(发送delete请求) export function fetchdelete (url, params) { return new Promise((resolve, reject) => { axios.delete(url, params).then(response => { resolve(response.data) }).catch((error) => { reject(error) }) }) }
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/104887.html
摘要:描述基于适配方案封装,构建手机端模板脚手架帮你做好的配置有多环境开发封装适配方案生产环境优化首屏加速低版本浏览器兼容环境发布脚本可以上手直接写代码多环境开发之前写过一个多环境的方案,是基于的多环境配置方案传送门最近新的项目采用了开始了 描述 基于vue-cli3.0+webpack 4+vant ui + sass+ rem适配方案+axios封装,构建手机端模板脚手架 帮你做好的配置...
摘要:前言一般服务器分为本地环境,测试环境,正式环境如果每次都要修改配置就很麻烦,总结一下我使用的方法修改执行命令修改文件的,在打包的时候执行不同的命令,测试执行那正式执行这里用到了能跨平台地设置及使用环境变量,使用 前言 一般服务器分为本地环境,测试环境,正式环境如果每次都要修改配置就很麻烦,总结一下我使用的方法 vue-demo/ |-build/ |-config/ |-d...
摘要:五六月份推荐集合查看最新的请点击集前端最近很火的框架资源定时更新,欢迎一下。苏幕遮燎沈香宋周邦彦燎沈香,消溽暑。鸟雀呼晴,侵晓窥檐语。叶上初阳乾宿雨,水面清圆,一一风荷举。家住吴门,久作长安旅。五月渔郎相忆否。小楫轻舟,梦入芙蓉浦。 五、六月份推荐集合 查看github最新的Vue weekly;请::点击::集web前端最近很火的vue2框架资源;定时更新,欢迎 Star 一下。 苏...
摘要:五六月份推荐集合查看最新的请点击集前端最近很火的框架资源定时更新,欢迎一下。苏幕遮燎沈香宋周邦彦燎沈香,消溽暑。鸟雀呼晴,侵晓窥檐语。叶上初阳乾宿雨,水面清圆,一一风荷举。家住吴门,久作长安旅。五月渔郎相忆否。小楫轻舟,梦入芙蓉浦。 五、六月份推荐集合 查看github最新的Vue weekly;请::点击::集web前端最近很火的vue2框架资源;定时更新,欢迎 Star 一下。 苏...
阅读 1419·2021-10-11 11:12
阅读 3252·2021-09-30 09:46
阅读 1637·2021-07-28 00:14
阅读 3140·2019-08-30 13:49
阅读 2588·2019-08-29 11:27
阅读 3232·2019-08-26 11:52
阅读 606·2019-08-23 18:14
阅读 3441·2019-08-23 16:27