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

 更新时间:2019年01月09日 09:55:47   作者:mugaro  
通常我们有一份webpack.dev.config.js使用webpack-dev-server的proxy,代理到开发服务器,来解决本地跨域问题。假如项目变大,可能需要proxy到不同环境,那么如何解决webpack-dev-server代理常切换问题,下面就一起来了解一下

背景

通常我们有一份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 Date 知识浅析

    JavaScript Date 知识浅析

    这篇文章主要介绍了JavaScript Date 知识,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-01-01
  • jquery div模态窗口的简单实例

    jquery div模态窗口的简单实例

    下面小编就为大家带来一篇jquery div模态窗口的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05
  • JS拖拽排序插件Sortable.js用法实例分析

    JS拖拽排序插件Sortable.js用法实例分析

    这篇文章主要介绍了JS拖拽排序插件Sortable.js用法,结合实例形式分析了拖拽排序插件Sortable.js功能、使用方法及相关操作注意事项,需要的朋友可以参考下
    2019-02-02
  • JavaScript判断文件是否存在的实例代码

    JavaScript判断文件是否存在的实例代码

    这篇文章主要给大家介绍了关于JavaScript判断文件是否存在的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • 利用JS做网页特效_大图轮播(实例讲解)

    利用JS做网页特效_大图轮播(实例讲解)

    下面小编就为大家带来一篇利用JS做网页特效_大图轮播(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • js数组对象里面如何获取某个属性值相等的对象

    js数组对象里面如何获取某个属性值相等的对象

    这篇文章主要介绍了js数组对象里面如何获取某个属性值相等的对象问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • iscroll.js滚动加载实例详解

    iscroll.js滚动加载实例详解

    这篇文章主要为大家详细介绍了iscroll.js滚动加载实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • 详解javascript中的babel到底是什么

    详解javascript中的babel到底是什么

    这篇文章主要介绍了详解javascript中的babel到底是什么,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • javascript删除html标签函数cIsHTML

    javascript删除html标签函数cIsHTML

    这篇文章主要介绍了javascript删除html标签函数cIsHTML,需要的朋友可以参考下
    2017-01-01

最新评论