如何解决webpack-dev-server代理常切换问题


Posted in Javascript onJanuary 09, 2019

背景

通常我们有一份webpack.dev.config.js使用webpack-dev-server的proxy,代理到开发服务器,来解决本地跨域问题。假如项目变大,可能需要proxy到不同环境,比如docker,或者后端开发人员的电脑上

现有问题

  • 需要手动更改proxy配置,比较麻烦还容易写错
  • 改变后的config文件会被git检测到
  • 不小心将本地修改的配置push到远程仓库,对其他人造成困扰

需求

假如本地开发服务器是dev.xxx.cn,docker环境是docker.xxx.cn,服务端开发人员ip是192.168.1.1

因为我本地用了gulp,启动前端开发环境到命令是 gulp local (与 npm run xx 的效果差不多),那么我希望

  • 当gulp local的时候,proxy 为 dev.xxx.cn
  • 当gulp local -t docker的时候,proxy 为 docker.xxx.cn
  • 当gulp local -t 192.168.1.1的时候,proxy 为 192.168.1.1

解决方案

创建webpack.local.js,proxy配置如下

proxy: {
 '/api/**': {
  target: 'http://{target|dev}.xxx.cn',
  changeOrigin: true,
 },
}

在我们运行 gulp local 时,读取local.config文件,替换{target|dev}为 -t 后的内容,比如 gulp local -t docker ,替换后变为 'http://docker.xxx.cn'

再将替换后的文件内容输出到一个名为webpack.local.target.js的文件里,然后执行 webpack-dev-server -c webpack.local.target.js

最后修改.gitignore文件,加入webpack.loc.target.js,这样每次生成的文件就不会被误push到远程

实现细节

上面的配置中 {target|dev} |后面的dev是执行 gulp local 时的默认选项

const { t } = gulputil.env
let config = fs.readFileSync(_path.join(__dirname, '/webpack.loc.js')).toString()

if (/\d{1,3}(\.\d{1,3}){3}/.test(t)) {
 config = config.replace(/\\{target[^}]+\\}[^']*/g, t)
} else if (typeof t === 'string' && t.length > 0) {
 config = config.replace(/\\{target[^}]+\\}/g, t)
} else {
 config = config.replace(/\\{target\\|([^}]+)\\}/g, '$1')
}
fs.writeFileSync(_path.join(__dirname, '/webpack.loc.target.js'), config)

第一个if判断内容为-t后的参数是否为ip,如果是,替换 'http://{target|dev}.xxx.cn' 为 http://192.168.1.1

第二个判断是否有参数,如果有,替换为 http://docker.xxx.cn

第三个判断就是直接运行 gulp local 不加 -t 时,替换为 http://dev.xxx.cn

正则不太懂可以看我另一篇文章《正则速记法》

觉得运行开发环境打包慢可以看《webpack性能榨汁机》

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
PNGHandler-借助JS让PNG图在IE下实现透明(包括背景图)
Aug 31 Javascript
javascript使用eval或者new Function进行语法检查
Oct 16 Javascript
javascript实现tabs选项卡切换效果(扩展版)
Mar 19 Javascript
jquery全选checkBox功能实现代码(取消全选功能)
Dec 10 Javascript
浅谈jQuery中height与width
Jul 06 Javascript
深入浅析Node.js 事件循环
Dec 20 Javascript
Boostrap模态窗口的学习小结
Mar 28 Javascript
Javascript表单特效之十大常用原理性样例代码大总结
Jul 12 Javascript
js事件驱动机制 浏览器兼容处理方法
Jul 23 Javascript
xmlplus组件设计系列之选项卡(Tabbar)(5)
May 03 Javascript
Node.js中流(stream)的使用方法示例
Jul 16 Javascript
js图片轮播插件的封装
Jul 21 Javascript
JavaScript学习笔记之数组基本操作示例
Jan 09 #Javascript
浅谈webpack性能榨汁机(打包速度优化)
Jan 09 #Javascript
Node.js的进程管理的深入理解
Jan 09 #Javascript
从vue源码看props的用法
Jan 09 #Javascript
浅谈关于JS下大批量异步任务按顺序执行解决方案一点思考
Jan 08 #Javascript
vue-cli2 构建速度优化的实现方法
Jan 08 #Javascript
一个因@click.stop引发的bug的解决
Jan 08 #Javascript
You might like
建立动态的WML站点(一)
2006/10/09 PHP
PHP反射机制用法实例
2014/08/28 PHP
CodeIgniter集成smarty的方法详解
2016/05/26 PHP
PHP单例模式简单用法示例
2017/06/23 PHP
Laravel框架基于中间件实现禁止未登录用户访问页面功能示例
2019/01/17 PHP
Laravel validate error处理,ajax,json示例
2019/10/25 PHP
javascript DOM编程实例(智播客学习)
2009/11/23 Javascript
javascript 模拟点击广告
2010/01/02 Javascript
自用js开发框架小成 学习js的朋友可以看看
2010/11/16 Javascript
JavaScript高级程序设计(第3版)学习笔记13 ECMAScript5新特性
2012/10/11 Javascript
js取消单选按钮选中并判断对象是否为空
2013/11/14 Javascript
JavaScript匿名函数与委托使用示例
2014/07/22 Javascript
JavaScript重定向URL参数的两种方法小结
2016/10/19 Javascript
javascript事件的绑定基础实例讲解(34)
2017/02/14 Javascript
AngularJS+Bootstrap3多级导航菜单的实现代码
2017/08/16 Javascript
Vue配置marked链接添加target="_blank"的方法
2019/07/19 Javascript
js 根据对象数组中的属性进行排序实现代码
2019/09/12 Javascript
js 数据类型判断的方法
2020/12/03 Javascript
原生js实现移动小球(碰撞检测)
2020/12/17 Javascript
[25:59]Newbee vs TNC 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python模拟登陆阿里妈妈生成商品推广链接
2014/04/03 Python
Python实现获取域名所用服务器的真实IP
2015/10/25 Python
详解Python3.6的py文件打包生成exe
2018/07/13 Python
在PyCharm中实现关闭一个死循环程序的方法
2018/11/29 Python
Python2.7实现多进程下开发多线程示例
2019/05/31 Python
Python爬虫抓取技术的一些经验
2019/07/12 Python
Numpy中ndim、shape、dtype、astype的用法详解
2020/06/14 Python
在Mac中配置Python虚拟环境过程解析
2020/06/22 Python
贝玲妃美国官方网站:Benefit美国
2016/08/28 全球购物
Dower & Hall官网:英国小众轻奢珠宝品牌
2019/01/31 全球购物
涉外经济法专业毕业生推荐信
2013/11/24 职场文书
中学生操行评语
2014/04/24 职场文书
优秀员工推荐信
2014/05/10 职场文书
司法工作人员群众路线对照检查材料思想汇报
2014/09/30 职场文书
2016公司年会主持词
2015/07/01 职场文书
使用vuex-persistedstate本地存储vuex
2022/04/29 Vue.js