视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
如何解决webpack-dev-server代理常切换问题
2020-11-27 22:02:07 责编:小采
文档

背景

通常我们有一份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性能榨汁机》

    下载本文
    显示全文
    专题