当前位置: 首页 > article >正文

告别重启!Vue CLI 动态代理配置实战:实现热更新与灵活配置

在前端开发中,代理配置是解决跨域问题的常见手段。尤其是在使用 Vue CLI 进行开发时,我们经常需要通过 devServer.proxy 来配置代理。然而,传统的代理配置通常是静态的,修改后需要重启开发服务器,这在频繁调整代理配置的场景下显得非常不便。本文将介绍一种动态代理配置的解决方案,通过监听配置文件的变化,实现代理配置的热更新,无需重启开发服务器。同时,我们将代理配置从 JSON 文件改为 JavaScript 文件,支持注释和更灵活的配置方式。

1. 背景与痛点

在 Vue CLI 项目中,我们通常会在 vue.config.js 中配置代理,例如:

module.exports = {devServer: {proxy: {'/api': {target: 'http://your-default-target.com',pathRewrite: { '^/api': '' },},},},
};

这种配置方式虽然简单,但存在以下问题:

  1. 静态配置:修改代理配置后,需要重启开发服务器才能生效。
  2. 不支持注释:JSON 文件不支持注释,配置复杂时难以维护。
  3. 灵活性不足:无法在配置文件中编写逻辑(如条件判断、函数等)。

为了解决这些问题,我们可以通过以下方式实现动态代理配置。

2. 解决方案

2.1 使用 JavaScript 文件存储代理配置

我们将代理配置从 proxy-config.json 改为 proxy-config.js,利用 JavaScript 文件的灵活性,支持注释和动态逻辑。

proxy-config.js 示例:

module.exports = {
// API 代理配置
'/api': {target: 'http://your-default-target.com', // 目标服务器pathRewrite: { '^/api': '' }, // 路径重写changeOrigin: true, // 支持跨域},// 其他代理配置
'/auth': {target: 'http://auth-server.com',pathRewrite: { '^/auth': '' },changeOrigin: true,},
};

2.2 动态加载代理配置

通过 chokidar 监听 proxy-config.js 文件的变化,并在文件变化时重新加载代理配置。

setupProxy.js 实现:

const path = require('path');
const { createProxyMiddleware } = require('http-proxy-middleware');
const chokidar = require('chokidar');// 代理配置文件路径
const proxyConfigPath = path.resolve(__dirname, 'proxy-config.js');// 初始化代理配置
let proxyConfig = require(proxyConfigPath);
console.log('Initial proxy config:', proxyConfig);// 导出代理配置函数
module.exports = function setupProxy(app) {
// 动态设置代理
let proxyMiddlewares = {};const updateProxies = () => {// 清空之前的代理Object.keys(proxyMiddlewares).forEach((context) => {app._router.stack = app._router.stack.filter((layer) => layer.handle !== proxyMiddlewares[context]);});// 重新加载代理配置deleterequire.cache[require.resolve(proxyConfigPath)]; // 清除缓存proxyConfig = require(proxyConfigPath); // 重新加载配置// 重新设置代理Object.keys(proxyConfig).forEach((context) => {const options = proxyConfig[context];console.log(`Setting up proxy for ${context}:`, options);const middleware = createProxyMiddleware(options);proxyMiddlewares[context] = middleware;app.use(context, middleware);});};// 初始化代理updateProxies();// 监听文件变化chokidar.watch(proxyConfigPath).on('change', () => {console.log('Proxy config file changed, reloading...');updateProxies(); // 重新设置代理});
};

2.3 在 vue.config.js 中集成

在 vue.config.js 中引入 setupProxy.js,并将代理配置应用到开发服务器。

vue.config.js 示例:

const setupProxy = require('./setupProxy');module.exports = {devServer: {host: 'localhost', // 开发服务器主机port: 8080, // 开发服务器端口clientLogLevel: 'warning', // 日志级别before(app) {console.log('Setting up proxy...');setupProxy(app); // 动态代理配置},},
};

3. 实现效果

3.1 动态更新代理配置

  • 启动开发服务器:
npm run serve
  • 修改 proxy-config.js 文件,例如:
module.exports = {'/api': {target: 'http://new-target.com', // 修改目标服务器pathRewrite: { '^/api': '/new-api' }, // 修改路径重写changeOrigin: true,},
};
  • 保存文件后,chokidar 会检测到文件变化,并自动重新加载代理配置。你可以在终端中看到日志输出:
Proxy config file changed, reloading...
Setting up proxy for /api: {target: 'http://new-target.com',pathRewrite: { '^/api': '/new-api' },changeOrigin: true
}
  • 代理配置会立即生效,无需重启服务。

3.2 支持注释与灵活配置

由于 proxy-config.js 是 JavaScript 文件,你可以轻松添加注释,甚至编写逻辑:

module.exports = {
// API 代理配置
'/api': {target: process.env.API_TARGET || 'http://default-target.com', // 支持环境变量pathRewrite: { '^/api': '' },changeOrigin: true,},// 根据条件动态配置...(process.env.NODE_ENV === 'development' ? {'/dev': {target: 'http://dev-server.com',pathRewrite: { '^/dev': '' },},} : {}),
};

相关文章:

告别重启!Vue CLI 动态代理配置实战:实现热更新与灵活配置

在前端开发中,代理配置是解决跨域问题的常见手段。尤其是在使用 Vue CLI 进行开发时,我们经常需要通过 devServer.proxy 来配置代理。然而,传统的代理配置通常是静态的,修改后需要重启开发服务器,这在频繁调整代理配置…...

基于springboot的校园部门资料管理系统

博主介绍:java高级开发,从事互联网行业多年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了多年的设计程序开发,开发过上千套设计程序,没有什么华丽的语言,只有实…...

数据结构初阶之堆的介绍与堆的实现

一、堆的概念与结构 如果有一个关键码的集合,把它的所有元素按完全二叉树的顺序存储在一个一维数组中,并满足:,则称为小堆(或大堆)。 将根结点最大的堆叫做最大堆或大根堆,根结点最小的堆叫做…...

Day29(补)-【AI思考】-精准突围策略——从“时间贫困“到“效率自由“的逆袭方案

文章目录 精准突围策略——从"时间贫困"到"效率自由"的逆袭方案**第一步:目标熵减工程(建立四维坐标)** 与其他学习方法的结合**第二步:清华方法本土化移植** 与其他工具对比**~~第三步:游戏化改造…...

docker中运行的MySQL怎么修改密码

1,进入MySQL容器 docker exec -it 容器名 bash 我运行了 docker ps命令查看。正在运行的容器名称。可以看到MySQL的我起名为db docker exec -it db bash 这样就成功的进入到容器中了。 2,登录MySQL中 mysql -u 用户名 -p 回车 密码 mysql -u root -p roo…...

leetcode——二叉树的中序遍历(java)

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 示例 1: 输入:root [1,null,2,3] 输出:[1,3,2] 示例 2: 输入:root [] 输出:[] 示例 3: 输入:root [1] 输出…...

腾讯云开发提供免费GPU服务

https://ide.cloud.tencent.com/dashboard/web 适用于推理场景,每个月10000分钟免费时长 166 小时 40 分钟 自带学术加速,速度还是不错的 白嫖 Tesla T4 16G 算力 显存:16GB 算力:8 TFlops SP CPU:8 核 内存&#…...

信息安全专业优秀毕业设计选题汇总:热点选题

目录 前言 毕设选题 开题指导建议 更多精选选题 选题帮助 最后 前言 大家好,这里是海浪学长毕设专题! 大四是整个大学期间最忙碌的时光,一边要忙着准备考研、考公、考教资或者实习为毕业后面临的升学就业做准备,一边要为毕业设计耗费大量精力。学长给大家整理…...

Java---猜数字游戏

本篇文章所实现的是Java经典的猜数字游戏 , 运用简单代码来实现基本功能 目录 一.题目要求 二.游戏准备 三.代码实现 一.题目要求 随机生成一个1-100之间的整数(可以自己设置区间),提示用户猜测,猜大提示"猜大了",…...

SAP系统中的主要采购类型/采购模式总结

在 SAP 系统中,采购类型主要有以下几种: 一、标准采购订单(Standard Purchase Order) 描述:这是最常用的采购类型,用于一次性采购货物或服务。采购部门根据需求部门提出的采购申请,向供应商发出采购订单,明确规定了采购的物料、数量、价格、交货日期等详细信息。 应…...

从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(基础组件实现)

目录 基础组件实现 如何将图像和文字显示到OLED上 如何绘制图像 如何绘制文字 如何获取字体? 如何正确的访问字体 如何抽象字体 如何绘制字符串 绘制方案 文本绘制 更加方便的绘制 字体附录 ascii 6x8字体 ascii 8 x 16字体 基础组件实现 我们现在离手…...

《深入浅出HTTPS​​​​​​​​​​​​​​​​​》读书笔记(31):HTTPS和TLS/SSL

《深入浅出HTTPS​​​​​​​​​​》读书笔记(31):HTTPS和TLS/SSL TLS/SSL协议和应用层协议无关,它只是加密应用层协议(比如HTTP)并传递给下层的TCP。 HTTP和TLS/SSL协议组合在一起就是HTTPS, HTTPS等…...

论文笔记(六十三)Understanding Diffusion Models: A Unified Perspective(五)

Understanding Diffusion Models: A Unified Perspective(五) 文章概括基于得分的生成模型(Score-based Generative Models) 文章概括 引用: article{luo2022understanding,title{Understanding diffusion models: A…...

量子编程语言:Qiskit 与 Cirq

在量子计算的领域,开发者已经可以使用一些专门为量子计算设计的编程语言和框架。其中,Qiskit 和 Cirq 是两个非常流行的选择,它们为不同的量子计算机提供编程接口,帮助开发者理解量子电路的设计和执行。 1. Qiskit Qiskit 是 IBM…...

floodfill算法(6题)

本质就是找出性质相似的连通块 目录 1.图像渲染 2.岛屿数量 3.岛屿的最大面积 4.被围绕的区域 5.太平洋大西洋水流问题 6.扫雷游戏 1.图像渲染 733. 图像渲染 - 力扣(LeetCode) 我们使用深度优先遍历去遍历即可,也不需要返回值。 值得…...

ThinkPHP 8模型与数据的插入、更新、删除

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 使用VS Code开发ThinkPHP项目-CSDN博客 编程与应用开…...

20个整流电路及仿真实验汇总

0、 前言 以下是关于“20个整流电路及仿真实验汇总”的前言部分: 在现代电力电子技术领域,整流电路作为将交流电(AC)转换为直流电(DC)的关键电路,广泛应用于各类电源设计、信号处理以及电力电子设备中。整流电路不仅能够为电子设备提供稳定的直流电源,还在电力传输、…...

项目升级Sass版本或升级Element Plus版本遇到的问题

项目升级Sass版本或升级Element Plus版本遇到的问题 如果项目有需求需要用到高版本的Element Plus组件,则需要升级相对应的sass版本,Element 文档中有提示,2.8.5及以后得版本,sass最低支持的版本为1.79.0,所升级sass、…...

AI常见的算法和例子

人工智能(AI)中常见的算法分为多个领域,如机器学习、深度学习、强化学习、自然语言处理和计算机视觉等。以下是一些常见的算法及其用途: 例子代码:纠结哥/pytorch_learn 1. 机器学习 (Machine Learning) 监督学习 (S…...

基于OSAL的嵌入式裸机事件驱动框架——整体架构调度机制

参考B站up主【架构分析】嵌入式祼机事件驱动框架 感谢大佬分享 任务ID : TASK_XXX TASK_XXX 在系统中每个任务的ID是唯一的,范围是 0 to 0xFFFE,0xFFFF保留为SYS_TSK_INIT。 同时任务ID的大小也充当任务调度的优先级,ID越大&#…...

Three.js 后期处理(Post-Processing)详解

目录 前言 一、什么是后期处理? 二、Three.js 后期处理的工作流程 2.1 创建 EffectComposer 2.2 添加渲染通道(Render Pass) 2.3 应用最终渲染 三、后期处理实现示例 3.1 基础代码 四、常见的后期处理效果 4.1 辉光效果&#xf…...

HTML特殊符号的使用示例

目录 一、基本特殊符号的使用 1、空格符号: 2、小于号 和 大于号: 3、引号: 二、版权、注册商标符号的使用 1、版权符号:© 2、注册商标符号: 三、数学符号的使用 四、箭头符号的使用 五、货币符号的使用…...

JAVA实战开源项目:在线文档管理系统(Vue+SpringBoot) 附源码

本文项目编号 T 038 ,文末自助获取源码 \color{red}{T038,文末自助获取源码} T038,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…...

git中有关old mode 100644、new mode 10075的问题解决小结

在 Git 版本控制系统中,文件权限变更是一种常见情况。当你看到类似 old mode 100644 和 new mode 100755 的信息时,这通常表示文件的权限发生了变化。本文将详细解析这种情况,并提供解决方法和注意事项。 问题背景 在 Git 中,文…...

快速分析LabVIEW主要特征进行判断

在LabVIEW中,快速分析程序特征进行判断是提升开发效率和减少调试时间的重要技巧。本文将介绍如何高效地识别和分析程序的关键特征,从而帮助开发者在编写和优化程序时做出及时的判断,避免不必要的错误。 ​ 数据流和并行性分析 LabVIEW的图形…...

UE学习日志#15 C++笔记#1 基础复习

1.C20的import 看看梦开始的地方&#xff1a; import <iostream>;int main() {std::cout << "Hello World!\n"; } 经过不仔细观察发现梦开始的好像不太一样&#xff0c;这个import是C20的模块特性 如果是在VS里编写的话&#xff0c;要用这个功能需要新…...

不够专业,想更体系化

在赚钱路上&#xff0c;总觉得学的不够好&#xff0c;还不专业&#xff0c;觉得拿不出手&#xff0c;不敢去教别人或者帮别人解决问题&#xff0c;发言&#xff0c;说自己的想法&#xff0c;或者收钱。 于是继续拼命学习&#xff0c;看书&#xff0c;买课&#xff0c;报班&…...

Deep Seek R1本地化部署

目录 说明 一、下载ollama 二、在ollama官网下载模型 三、使用 后记 说明 操作系统&#xff1a;win10 使用工具&#xff1a;ollama 一、下载ollama 从官网下载ollama&#xff1a; ollama默认安装在C盘&#xff0c;具体位置为C:\Users\用户名\AppData\Local\Programs\O…...

C# Winform制作一个登录系统

using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace 登录 {p…...

动态规划DP 最长上升子序列模型 总览

最长上升子序列模型 1. 最长上升子序列 1.1 怪盗基德的滑翔伞 1.1.1 登山 1.1.2 合唱队形 1.2 友好城市 1.3 最长上升子序列和 1.4 导弹拦截...