如何解决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代码编写需要注意的7个小细节小结
Sep 21 Javascript
原生js实现查找/添加/删除/指定元素的class
Apr 12 Javascript
超详细的javascript数组方法汇总
Nov 21 Javascript
JS实现日期时间动态显示的方法
Dec 07 Javascript
如何使用AngularJs打造权限管理系统【简易型】
May 09 Javascript
模拟javascript中的sort排序(简单实例)
Aug 17 Javascript
jQuery实现发送验证码并60秒倒计时功能
Nov 25 Javascript
简单的JS控制button颜色随点击更改的实现方法
Apr 17 Javascript
React组件生命周期详解
Jul 03 Javascript
关于微信小程序map组件z-index的层级问题分析
Jul 09 Javascript
React-redux实现小案例(todolist)的过程
Sep 29 Javascript
vue自定义指令和动态路由实现权限控制
Aug 28 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自动生成月历代码
2006/10/09 PHP
用libTemplate实现静态网页的生成
2006/10/09 PHP
rephactor 优秀的PHP的重构工具
2011/06/09 PHP
PHP实现连接设备、通讯和发送命令的方法
2015/10/13 PHP
PHP两个n位的二进制整数相加问题的解决
2018/08/26 PHP
用javascript来实现动画导航效果的代码
2007/12/16 Javascript
js 获取、清空input type="file"的值(示例代码)
2013/12/24 Javascript
jquery实现简单的全选和反选功能
2016/01/02 Javascript
Javascript中indexOf()和lastIndexOf应用方法实例
2016/08/24 Javascript
微信小程序 支付功能开发错误总结
2017/02/21 Javascript
JavaScript实现移动端页面按手机屏幕分辨率自动缩放的最强代码
2017/08/18 Javascript
jQuery.Sumoselect插件实现下拉复选框效果
2017/11/09 jQuery
在vue项目中使用Nprogress.js进度条的方法
2018/01/31 Javascript
利用npm 安装删除模块的方法
2018/05/15 Javascript
node.js读取Excel数据(下载图片)的方法示例
2018/08/02 Javascript
解决select2在bootstrap modal中不能正常使用的问题
2018/08/09 Javascript
详解vue更改头像功能实现
2019/04/28 Javascript
超轻量级的js时间库miment使用解析
2019/08/02 Javascript
vue 二维码长按保存和复制内容操作
2020/09/22 Javascript
JavaScript 中判断变量是否为数字的示例代码
2020/10/22 Javascript
快速实现基于Python的微信聊天机器人示例代码
2017/03/03 Python
对python xlrd读取datetime类型数据的方法详解
2018/12/26 Python
Python将列表数据写入文件(txt, csv,excel)
2019/04/03 Python
python实现祝福弹窗效果
2019/04/07 Python
Python re 模块findall() 函数返回值展现方式解析
2019/08/09 Python
Django自带日志 settings.py文件配置方法
2019/08/30 Python
python之yield和Generator深入解析
2019/09/18 Python
清除canvas画布内容(点擦除+线擦除)
2020/08/12 HTML / CSS
Puma印度官网:德国运动品牌
2019/10/06 全球购物
毕业生自荐信如何写
2014/03/24 职场文书
税务会计岗位职责
2015/04/02 职场文书
消防隐患整改通知书
2015/04/22 职场文书
《一面五星红旗》教学反思
2016/02/23 职场文书
python正则表达式re.search()的基本使用教程
2021/05/21 Python
Nginx实现负载均衡的项目实践
2022/03/18 Servers
create-react-app开发常用配置教程
2022/06/25 Javascript