知道sourceMap是什么吗?
-
sourceMap是一项将编译、打包、压缩后的代码映射回源代码的技术,由于上线代码经过打包压缩并没有阅读性可言,一旦在开发中报错或者遇到问题,直接在混淆代码中debug问题会带来非常糟糕的体验,sourceMap可以帮助我们快速定位到源代码的位置,提高我们的开发效率 -
源代码与打包后的代码的映射关系
(一个js文件或css文件产生对应的映射.nap文件)
-
启动sourceMap的好处就是开发时候,当我们代码发生错误的时候,会帮我们指向哪个文件哪一行发生错误,因此做调试的时候很方便
-
在dev模式中,默认开启,关闭的话 可以在配置文件里
-
如何在调试使用sourceMap
为了减少请求数和文件下载体积,保证页面以最快的时间载入,线上文件的代码都是经过打包工具合并压缩过的。甚至有的时候,为了防止不法分子或者竞争对手来反编译你的源码,我们会进一步对代码进行混淆或者加密
- 对于一些混淆的、可读性差的代码,问题的定位还是有点麻烦的, 借助
SourceMap功能可以快速定位问题
sourceMap文件应该存放哪里?
- 可以放在远程服务器,也可以存放本地
如何使用
-
chrome浏览器必须开启相关设置
-
Setting -> Preferences-Sources -> 勾选Enable JavaScript source maps -> 勾选Enable CSS source maps
-
开启了这些选项,则 map 文件会随页面一起下载
-
sourceMap 文件是否影响网页性能?
这个答案肯定是不会影响,否则构建相关的优化就肯定会涉及到对于 source map 的处理了,毕竟 source map 文件也不小。
其实 source map 只有在打开 dev tools【开发者工具】 的情况下才会开始下载,相信大部分用户都不会去打开这个面板,所以这也就不是问题了。
这时可能会有读者想说:哎,但是我好像从来没有在 Network 里看到 source map 文件的加载呀?其实这只是浏览器隐藏了而已,如果大家使用抓包工具的话就能发现在打开 dev tools 的时候开始下载 source map 了。
sourceMap 的应用
- 一般来说 source map 的应用都是在监控系统中,开发者构建完应用后,通过插件将源代码及 source map 上传至平台中。一旦客户端上报错误后,方便开发者快速定位线上问题。
Chrome如何添加sourceMap文件
-
在 Chrome DevTools 【开发者工具中】的 Sources 中选择需要添加 SourceMap 的文件
-
在右侧文件窗口中右键并选择
Add source map... -
在弹出的输入框
Source map URL中写入- 通过file协议选择本地的map文件,先在浏览器地址栏中输入确保可以访问到。
-
添加完sourceMap文件之后,在调试的时候,就会发现映射到源码了
webpack如何配置sourceMap
- 在devtool配置
module.exports = {
devtool: 'source-map', // 启用 source map
};
devtool配置:
- source-map 模式下会输出质量最高最详细的 Source Map,这会造成构建速度缓慢,特别是在开发过程需要频繁修改的时候会增加等待时间
- 在开发环境下把
devtool设置成cheap-module-eval-source-map,因为生成这种 Source Map 的速度最快,能加速构建。由于在开发环境下不会做代码压缩,Source Map 中即使没有列信息也不会影响断点调试 - 不要在生产环境下使用
inline模式的 Source Map, 因为这会使 JavaScript 文件变得很大,而且会泄露源码 - 在生产环境下把
devtool设置成hidden-source-map,意思是生成最详细的 Source Map,但不会把 Source Map 暴露出去
devtool 配置选项 | 描述与使用场景 |
|---|---|
eval | 使用 eval 执行每个模块,并且在同一个文件中生成源映射。适用于开发环境,速度最快,但映射较简单。 |
inline-source-map | 将源映射包含在生成的文件中,而不是单独生成一个源映射文件。适用于开发环境,方便调试,但会增加生成文件的大小。 |
cheap-eval-source-map | 类似于 eval,但在每行代码末尾追加注释,生成比较简单的源映射。适用于开发环境。 |
cheap-module-eval-source-map | 在 cheap-eval-source-map 的基础上,将 loader 的 source map 添加到 source map 中。适用于开发环境。 |
eval-source-map | 在每行代码末尾生成完整的源映射,但仍使用 eval 执行模块。适用于开发环境。 |
cheap-source-map | 类似于 cheap-eval-source-map,但使用文件生成源映射,适用于开发环境,速度相对较慢。 |
cheap-module-source-map | 在 cheap-source-map 的基础上,将 loader 的 source map 添加到 source map 中。适用于开发环境。 |
source-map | 在单独的文件中生成完整的源映射,适用于生产环境。 |
hidden-source-map | 类似于 source-map,但不会在源代码中添加注释。适用于生产环境。 |
nosources-source-map | 生成一个完整的源映射,但不包含源代码。适用于生产环境,用于隐藏源代码。 |