如何解决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 相关文章推荐
javascript 鼠标滚轮事件
Apr 09 Javascript
犀利的js 函数集合
Jun 11 Javascript
javascript DOM编程实例(智播客学习)
Nov 23 Javascript
JavaScript声明变量时为什么要加var关键字
Sep 29 Javascript
基于jQuery实现的菜单切换效果
Oct 16 Javascript
一个字符串中出现次数最多的字符 统计这个次数【实现代码】
Apr 29 Javascript
详解网站中图片日常使用以及优化手法
Jan 09 Javascript
微信小程序的动画效果详解
Jan 18 Javascript
jquery的 filter()方法使用教程
Mar 22 jQuery
vuex实现的简单购物车功能示例
Feb 13 Javascript
vue.js实现备忘录demo
Jun 26 Javascript
vue获取验证码倒计时组件
Aug 26 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
PHP常用函数小技巧
2008/09/11 PHP
jQuery+PHP实现的掷色子抽奖游戏实例
2015/01/04 PHP
DEDECMS首页调用图片集里的多张图片
2015/06/05 PHP
PHP模板引擎Smarty内建函数详解
2016/04/11 PHP
图片自动更新(说明)
2006/10/02 Javascript
javascript 按回车键相应按钮提交事件
2009/11/02 Javascript
js constructor的实际作用分析
2011/11/15 Javascript
js获取时间(本周、本季度、本月..)
2013/11/22 Javascript
Javascript 绘制 sin 曲线过程附图
2014/08/21 Javascript
原生javascript实现拖动元素示例代码
2014/09/01 Javascript
jQuery实现隔行背景色变色
2014/11/24 Javascript
关于cookie的初识和运用(js和jq)
2016/04/07 Javascript
JQuery 两种方法解决刚创建的元素遍历不到的问题
2016/04/13 Javascript
JavaScript字符串检索字符的方法
2017/06/23 Javascript
Vuejs在v-for中,利用index来对第一项添加class的方法
2018/03/03 Javascript
JS使用遮罩实现点击某区域以外时弹窗的弹出与关闭功能示例
2018/07/31 Javascript
Bootstrap-table自定义可编辑每页显示记录数
2018/09/07 Javascript
Jquery和CSS实现选择框重置按钮功能
2018/11/08 jQuery
Javascript实现打鼓效果
2021/01/29 Javascript
手动实现vue2.0的双向数据绑定原理详解
2021/02/06 Vue.js
python中利用xml.dom模块解析xml的方法教程
2017/05/24 Python
对python中的os.getpid()和os.fork()函数详解
2019/08/08 Python
Python插件机制实现详解
2020/05/04 Python
序列化Python对象的方法
2020/08/01 Python
Anaconda+spyder+pycharm的pytorch配置详解(GPU)
2020/10/18 Python
python中绕过反爬虫的方法总结
2020/11/25 Python
html5 datalist 选中option选项后的触发事件
2020/03/05 HTML / CSS
NFL欧洲商店(德国):NFL Europe Shop DE
2018/11/03 全球购物
艺术学院毕业生自荐信
2014/07/05 职场文书
2014年预备党员端正入党动机思想汇报
2014/09/13 职场文书
大学生个人学习总结
2015/02/15 职场文书
2015年社区居委会工作总结
2015/05/18 职场文书
培训简讯范文
2015/07/20 职场文书
2016领导干部廉洁自律心得体会
2016/01/13 职场文书
小学生优秀作文范文(六篇)
2019/07/10 职场文书
Anaconda安装pytorch和paddle的方法步骤
2022/04/03 Python