vue环境配置相关解析
玩vue一段时间,都是云里雾里的跟着网上配置照搬,其实还未深刻理解每个配置具体的相关应用场景,vue.config.js该配置是一些跟运行及打包时候的相关内容,在一系列测试过后,慢慢的梳理了以下心得。
CROS跨域处理
开发初期,大家一般都会遇到CORS跨域,如下图所示:
-
服务端白名单配置 第一次对接的服务端,他也是初次接触前后分离项目,为了配合前端解决本地开发环境跨域问题,他是在服务端做了白名单配置,也就是将你的localhost:8080 以及 192.168.xx.xx:8080的IP地址报给服务端,他们将你的IP或域名写入白名单即可直接访问。 优点:前端省事,不用做任何处理,即可直接访问API接口。 缺点:如果你IP变了,或者此时可能需要运行多个项目,而你的端口号变了,则需要每次向服务端报备地址。
-
vue.config.js的proxy配置
proxy是个好东西,不管你是http请求还是https,都可以通过proxy来处理。
// vue.config.js
module.exports = {
publicPath: process.env.VUE_APP_PUBLIC_PATH, //npm构建后的基本路径、相对路径
outputPath: process.env.VUE_APP_OUTPUT_PATH, //npm run build打包后输出的目录地址
devServer: {
proxy: {
'/newapi': {
target: 'https://abc.baidu.com',
ws: false, //如果要代理 websockets,配置这个参数
changeOrigin: true, //是否跨域
pathRewrite:{
'^/newapi':'/api' //api前缀重写, /newapi/test => https://abc.baidu.com/api/test
}
},
'/': {
target: 'https://bcd.baidu.com',
ws: false,
changeOrigin: true,
pathRewrite:{
'^/api':'/api'
}
}
}
}
}
console.log('NODE_ENV-------'+ process.env.NODE_ENV) // 命令行运行的时候,查看构建环境信息
this.$axios.post('/newapi/login', json).then((res) => {
console.log(res);
})
说明:
- 多个代理需注意顺序,因为“/”字符匹配数比较高,请放到后面,优先匹配'newapi'
- 如果本地需要区分接口是不同服务器的,可以用pathRewrite来处理
- proxy的设定仅作用于本地开发环境的配置,对于build打包后的环境请求,并不是在这里设定
- publicPath配置打包后,部署生产环境和开发环境下的URL,可对当前环境进行区分
本地环境html打包后结果
线上环境html的路径结果
如果显示服务器上需要配置前缀,也可以通过publicPath来控制
环境配置
因为接口来自两个不同的服务器,之前误以为pathRewrite能搞定,可当build打包之后,发现显示的接口请求根本不会按照proxy配置的target去请求,更不会去做pathRewrite,这时候可以用process.env环境变量来控制。
环境变量 process.env.NODE_ENV 本地默认是"development",生产环境是“production”
development => npm run serve 运行后的本地开发环境
production => npm run build 打包后的线上生产环境
在src同级目录下创建.env.development和.env.production
.env.development配置信息如下:
VUE_APP_SERVE_URL = ''
VUE_APP_PUBLIC_PATH = '/'
VUE_APP_OUTPUT_PATH = '' // 本地环境没有打包配置项
.env.production配置信息如下:
VUE_APP_SERVE_URL = 'https://abc.baidu.com'
VUE_APP_PUBLIC_PATH = ''
VUE_APP_OUTPUT_PATH = 'dist' //生产环境build后以dist文件夹为目录
※ 注意:环境变量下定义的变量,必须使用VUE_APP_开头,否则无效。
对应的环境信息就可以配置到vue.config.js和axios请求,以及各个页面代码中
// src/libs/request.js axios请求封装
import Axios from "axios";
const header = {
'content-type': 'application/x-www-form-urlencoded',
};
const request = Axios.create({
timeout: 10000,
responseType: "json",
responseEncoding: "utf8",
baseURL: process.env.VUE_APP_SERVER_URL, // 根据不同环境显示不同SERVE_URL
headers: header,
});
// 请求拦截器
request.interceptors.request.use((config) => {
// ....
return config
}), function (error) {
console.error(error);
});
// 响应拦截器
request.interceptors.response.use((response) => {
// 如果返回的状态码为200,说明接口请求成功,可以正常拿到数据
// 否则的话抛出错误
}),(error) => {
// 异常抛出
}
export default request;
// src/lib/api.js
import request from '@/libs/request';
import qs from 'qs';
const API = '/api'
let API_NEW = '/newapi'
if(process.env.NODE_ENV !== 'development'){
API_NEW = '/api' //模拟proxy的pathRewrite,根据环境重写api前缀
}
export const getData = params => {
return request({
url: `${API_NEW}/data`,
method: 'get',
params,
});
};
export const getData2 = params => {
return request({
url: `${API_NEW}/data`,
method: 'get',
params,
});
};
export const postData = params => {
return request({
url: '/api/data',
method: 'post',
data: data: qs.stringify(params)
});
};
// page.vue
import {getData} from '@/libs/api';
create(){
getData({id: 123}).then(res=>{
console.log(res)
})
}
当进行api请求时,本地环境会根据proxy的设定自动忽略该配置项,build打包后的线上环境,依据baseURL的内容进行增加请求前缀,baseURL => Host
自定义环境配置
当如线上环境可能不止一个,可能有生产环境、开发测试环境,你还可以来个自定义环境变量 再创建一个.env.dev文件,这个dev和development的环境变量不同 .env.dev配置信息如下:
VUE_APP_SERVE_URL = 'https://abc-test.baidu.com'
VUE_APP_PUBLIC_PATH = ''
VUE_APP_OUTPUT_PATH = 'dev'
※ vue.config.js文件的配置信息,看最顶上的对应代码
接着修改package.json文件,如果只有development和production两个环境变量可不修改,有自定义环境变量,可以自定义打包命令
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"dev": "vue-cli-service build --mode dev", //可以这么写,打包的时候运行npm run dev
"build:dev": "vue-cli-service build --mode dev" //也可以这么写,打包的时候运行npm run build:dev
},
多环境配置,build遇到的坑
当我执行npm run dev的时候,部署到线上,发现baseURL配置的环境url根本没有执行,它还是跟本地开发环境一样,没有前缀是空的host,api请求一直不是我想到的目标路径,对比了dist和dev两个文件夹下的文件,dist也没看出相关的baseUrl放在哪,后来猛地突然发现dist与dev打包后文件格式不同
后来参考了:blog.csdn.net/weiwei_xue/…
解决办法是给.env.dev增加NODE_ENV = 'production'
NODE_ENV = 'production'
VUE_APP_SERVE_URL = 'https://abc-test.baidu.com'
VUE_APP_PUBLIC_PATH = ''
VUE_APP_OUTPUT_PATH = 'dev' //打包输出的文件夹目录为dev
意思就是让dev环境照着系统默认的生产环境模式进行打包,但其他配置信息依然根据VUE_APP_下的变量判断
具体生产环境production为什么会打包成三个目录,文件夹内容又有哪些差异点,如何定义生产环境打包后的信息,目前还没有研究透,待日后研究明白了,再做补充。
相关参考:
blog.csdn.net/qq_38543537… blog.csdn.net/shiaijuan1/… blog.csdn.net/weiwei_xue/…