vue/cli 配置动态代理无需重启服务的方法


Posted in Vue.js onMay 20, 2022

vue脚手架指的是vue-cli,它是一个专门为单页面应用快速搭建繁杂的脚手架,它可以轻松的创建新的应用程序而且可用于自动生成vue和webpack的项目模板。

vue/cli 配置动态代理,无需重启服务

devServe = http://localhost:3000;
prodServe = http://localhost:4000;

1. 在vue.config.js文件中,配置代理服务

使用vue/cli@5创建的项目,默认会创建vue.config.js文件,如果项目中没有此文件,那么就手动在项目根路径创建vue.config.js文件。

const { defineConfig } = require('@vue/cli-service');
const createProxy = require('./dynamic_proxy');

module.exports = defineConfig({
    transpileDependencies: true,
    devServer: {
        proxy: {
            '/': {
                target: '',
                ws: false,
                changeOrigin: true,
                router: () => {
                    return createProxy();
                }
            }
        }
    }
});

2. 在项目根路径创建文件夹dynamic_proxy,并创建proxy.list.json文件以及index.js文件。

proxy.list.json

[
    {
        "name": "devServe",
        "ip": "http://xxx.xxx.xxx.xxx:3001",
        "active": true
    },
    {
        "name": "prodServe",
        "ip": "http://xxx.xxx.xxx.xxx:3000",
        "active": false
    }
]

index.js

const { readFileSync } = require('fs');
const { resolve } = require('path');
const getProxyList = () => {
    try {
        const proxyList = readFileSync(resolve(__dirname, './proxy.list.json'), 'utf-8');
        return JSON.parse(proxyList);
    } catch (error) {
        throw new Error(error);
    }
};
const getActiveProxy = () => {
    try {
        const proxyList = getProxyList();
        if (proxyList.some(i => i.active)) {
            return proxyList.find(i => i.active);
        }
    } catch (error) {
        throw new Error(error);
    }
};
module.exports = () => {
    return getActiveProxy().ip;
};

3. 运行命令

npm run serve

4. 需要切换服务时,直接修改proxy.list.json中的active选项,修改为true,就可以自动切换了

5. 原理解析

vue cli 的代理是使用的http-proxy-middleware包,所以proxy选项的配置也是基于这个包的配置。在proxy配置选项中有两个属性target以及router。其中target是默认的代理地址。而router可以return一个字符串服务地址,那么当两个选项都配置了时,http-proxy-middleware在解析配置时,会首先使用router函数的返回值,当router的返回值不可以用时,那么就会fallback至target。

http-proxy-middleware router配置源码

vue/cli 配置动态代理无需重启服务的方法

配置校验源码

vue/cli 配置动态代理无需重启服务的方法

可以由上面源码看出首先会校验配置,如果targetrouter都不存在的话,就会直接Error,从第一张图片源码可以看出,如果router存在的话,则会直接新建一个newTarget,并且将options.target赋值为newTarget

到此这篇关于vue/cli 配置动态代理,无需重启服务的文章就介绍到这了!


Tags in this post...

Vue.js 相关文章推荐
解决vue elementUI 使用el-select 时 change事件的触发问题
Nov 17 Vue.js
Vue router传递参数并解决刷新页面参数丢失问题
Dec 02 Vue.js
vuex Module将 store 分割成模块的操作
Dec 07 Vue.js
vue实现购物车的小练习
Dec 21 Vue.js
全面解析Vue中的$nextTick
Dec 24 Vue.js
vue使用echarts画组织结构图
Feb 06 Vue.js
浅谈vue2的$refs在vue3组合式API中的替代方法
Apr 18 Vue.js
vue组件的路由高亮问题解决方法
May 11 Vue.js
简单聊聊Vue中的计算属性和属性侦听
Oct 05 Vue.js
详解Vue router路由
Nov 20 Vue.js
vue配置型表格基于el-table拓展之table-plus组件
Apr 12 Vue.js
Vue OpenLayer测距功能的实现
Apr 20 Vue.js
Vue ECharts实现机舱座位选择展示功能
May 15 #Vue.js
Vue组件化(ref,props, mixin,.插件)详解
vue postcss-px2rem 自适应布局
May 15 #Vue.js
VUE解决跨域问题Access to XMLHttpRequest at
vue使用watch监听属性变化
Apr 30 #Vue.js
vue-cli3.x配置全局的scss的时候报错问题及解决
vue项目如何打包之项目打包优化(让打包的js文件变小)
You might like
php中截取中文字符串的代码小结
2011/07/17 PHP
PHP函数in_array()使用详解
2014/08/20 PHP
PHP中实现接收多个name相同但Value不相同表单数据实例
2015/02/03 PHP
实例介绍PHP中zip_open()函数用法
2019/02/15 PHP
php中isset与empty函数的困惑与用法分析
2019/07/05 PHP
javascript 播放器 控制
2007/01/22 Javascript
JavaScript访问样式表代码
2010/10/15 Javascript
基于jQuery实现的水平和垂直居中的div窗口
2011/08/08 Javascript
使用javascript实现有效时间的控制,并显示将要过期的时间
2014/01/02 Javascript
利用进制转换压缩数字函数分享
2014/01/02 Javascript
JavaScript indexOf方法入门实例(计算指定字符在字符串中首次出现的位置)
2014/10/17 Javascript
jQuery实现按钮的点击 全选/反选 单选框/复选框 文本框 表单验证
2015/06/25 Javascript
js实现文本框只允许输入数字并限制数字大小的方法
2015/08/19 Javascript
JS简单实现点击复制链接的方法
2016/08/03 Javascript
JavaScript判断浏览器对CSS3属性是否支持的多种方法
2016/11/13 Javascript
Angular1.x复杂指令实例详解
2017/03/01 Javascript
Vue2 使用 Echarts 创建图表实例代码
2017/05/18 Javascript
判断js数据类型的函数实例详解
2019/05/23 Javascript
vue实现拖拽效果
2019/12/23 Javascript
[01:11]steam端dota2实名认证操作流程视频
2021/03/11 DOTA
python socket 超时设置 errno 10054
2014/07/01 Python
python编程实现希尔排序
2017/04/13 Python
Django中日期处理注意事项与自定义时间格式转换详解
2018/08/06 Python
Django实现文件上传下载功能
2019/10/06 Python
Python3 操作 MySQL 插入一条数据并返回主键 id的实例
2020/03/02 Python
Python restful框架接口开发实现
2020/04/13 Python
使用python修改文件并立即写回到原始位置操作(inplace读写)
2020/06/28 Python
CSS3中:nth-child和:nth-of-type的区别深入理解
2014/03/10 HTML / CSS
CSS3自定义滚动条样式 ::webkit-scrollbar的示例代码详解
2020/06/01 HTML / CSS
TIME时代杂志台湾总代理:台时亚洲
2018/10/22 全球购物
大学生职业生涯规划书模版
2013/12/30 职场文书
两年的个人工作自我评价
2014/01/10 职场文书
劳动争议仲裁代理词
2015/05/25 职场文书
教务处干事工作总结
2015/08/14 职场文书
班主任工作经验交流会总结
2015/11/02 职场文书
利用JavaScript写一个简单计算器
2021/11/27 Javascript