为什么我们不用sourcemap了?hey-cli默认关闭打包配置

2,588 阅读3分钟
  • 什么是source map?
  • webpack目前的source map生成策略
  • 为什么我们不用source map了?
  • 什么是反向代理?
  • 我们如何调试前端BUG?

什么是source map?

随着代码增多,我们需要对代码进行压缩。
代码压缩后进行调bug定位将非常困难,于是引入sourcemap记录压缩前后的位置信息记录,当产生错误时直接定位到未压缩前的位置,将大大的方便我们调试。
----from 网络
阮一峰写的一篇文章,JavaScript Source Map 详解,大家如果感兴趣可以看一看。

其实,很多程序员有可能不是很了解。
但是没有关系,我们这篇文章主要是关于前端开发、调试的经验分享。

webpack目前的打包策略

webpack的 devtool 属性是用来配置代码source map生成策略的。
从适用于开发环境到适用于生产环境,每一种都些微有一些不同。
hey-cli 的devtool只选择开发环境的eval,与生产环境的none,这两种是webpack打包部署最快的策略,分别都是+++(super fast)的速度。

而其他的关于sourcemap的策略都被我们无视了。
至于下面,我们将列出我们为什么无视这些sourcemap打包策略的原因。

为什么我们不用sourcemap了?

1、chrome自带了pretty print的功能

关于一些代码上的错误,使用chrome调试可以直接pretty代码,压缩代码经过pretty后,可读性大大增高。

2、如果build代码使用sourcemap,build速度大大降低

sourcemap附带了很多信息,如果build需要生成sourcemap,将会大大降低build的速度。

3、我们都是使用本地代码来调试所有环境的BUG

是的,感谢反向代理的机制。
如果问题比较复杂,或者是性能类的,很难从线上的代码中调试出结果。
我们通过修改hey-cli的反向代理配置,即可调试不同的环境。
最后一章,我们会详细说明。
如果你对hey-cli不是很了解,请移步前端开发大杀器hey-cli,全局支持vue react es6开发部署
当然,如果你是使用webpack配置,包括vue-cli等脚手架生成webpack配置,都可以使用。

什么是反向代理?

这个我就不详细说明,大家可以看看nginx的一些配置即可。
阮一峰先生也写了一个初级入门:Nginx 容器教程

webpack反向代理配置

webpack代理配置: devServer.proxy

hey-cli反向代理配置

hey-cli只需要在hey.conf.js中的webpack对象下配置devServer即可,配置和devServer.proxy一致。

hey.conf.js

module.exports = {
  ...
  "webpack": {
    ...
    //define proxy, https://webpack.js.org/configuration/dev-server/#devserver-proxy
    "devServer": {
      "proxy": {
        "/api": {
          "target": "http://0.0.0.0:8080"
        }
      },
      historyApiFallback: true
    }
  }
};

我们如何调试前端BUG?

前面说了这么多,其实只剩下最后一步了。
先说实际操作:
以使用hey-cli为例。
平时的开发环境hey.conf.js:

devServer: {
  proxy: {
    "/api": {
      //开发环境后端
      target: "http://开发环境:8080",
      pathRewrite: { "^/api": "" }
    },
  },
  historyApiFallback: true
},

调试正式环境

devServer: {
  proxy: {
    "/api": {
      //正式环境后端
      target: "http://正式环境:8080",
      pathRewrite: { "^/api": "" }
    },
  },
  historyApiFallback: true
},

重启hey-cli,访问开发环境,使用正式环境的后端。

调试完成,checkouthey.conf.js,提交hotfix。

注意

我们的前端团队始终保持一个做法:所有环境的前端代码是一模一样的,并且不推荐使用js来判断不同的环境。
至于为什么这样子做,相信大家都可以理解。
关键问题是,如何完成这样的一个设定?
目前我们的做法是,gateway提供一个/envs的接口,每个环境的不同配置通过接口统一获取。
如果大家感兴趣的话,可以继续讨论,看看有没有什么更好的施行方案。