likes
comments
collection
share

webpack中sourcemap的使用

作者站长头像
站长
· 阅读数 63

source-map是什么

简单说,Source map就是以.map结尾的,里面维护了代码打包前后映射关系的一个文件。

webpack中sourcemap的使用

source-map有什么作用

我们代码运行在浏览器上时,是经过压缩丑化的,当代码报错时,调试起来非常困难。比如下面这个例子

const message = "hello webpack";
console.log(message);
console.log(age); // 没有申明age变量,所以这行代码肯定报错

使用webpack打包后,打开浏览器的效果:

webpack中sourcemap的使用

点击报错文件之后:

webpack中sourcemap的使用

这根本没有办法找到具体的位置,这个时候source-map的作用就体现出来了。

修改webpack里面的配置:

webpack中sourcemap的使用

重新打包,浏览器控制台的报错会表明具体的位置信息:

webpack中sourcemap的使用

webpack中sourcemap的使用

source-map作用是帮助定位到报错代码的原始位置。

浏览器启用source-map

谷歌浏览器是默认打开了source-map的,如果没有按照下面方式手动开启:

webpack中sourcemap的使用

webpack中sourcemap的使用

webpack中sourcemap的使用

source-map的工作原理

打开build/bundle.js文件,尾部有这么一行注释

webpack中sourcemap的使用

浏览器可以根据这一行注释中,sourceMappingURL找到对应的文件。

分析source-map文件

webpack中sourcemap的使用

  • version: 当前使用的版本,目前是第3版;
  • file:打包后的文件(浏览器加载的文件)
  • sources:从哪些文件转换过来的source-map和打包的代码(最初始的文件)
  • names:转换前的变量和属性名称
  • mappings:source-map用来和源文件映射的信息(比如位置信息等),一串VLQ编码
  • sourcesContent:转换前的具体代码信息
  • sourceRoot:所有sources相对的根目录

生成source-map

devtool控制是否生成,以及如何生成source-map。webpack提供了非常多的选项来生成source-map,选择不同的值,生成的source-map会明显影响到构建和重新构建的速度。

  • false:不使用source-map。

  • none:生产模式下的默认值,不生成source-map文件

  • eval: 开发模式下的默认值,不生产source-map文件

    • 它会在eval执行的代码中,添加// #sourceURL=;
    • 它会在浏览器调式面板中生成对应的文件目录,方便我们调试代码。
eval值

webpack中sourcemap的使用

webpack中sourcemap的使用

source-map值

生成一个独立的source-map文件,并且在bundle文件中有一个注释执行source-map文件。

webpack中sourcemap的使用

webpack中sourcemap的使用

eval-source-map值

不会生成独立的文件,source-map是以data URL形式添加到eval函数的后面

webpack中sourcemap的使用

webpack中sourcemap的使用

inline-source-map值

不会生成独立的文件,但是source-map会以data URL形式添加到bundle文件的后面

webpack中sourcemap的使用

cheap-source-map值

会生成source-map文件,但是会更加高效一些(cheap低开销),因为没有生成列映射。在开发中我们一般只需要行信息就可以定位到错误了。

cheap-module-source-map值

类似于cheap-source-map,但是对源自loader的source-map处理会更好。

nosources-source-map值

会生成source-map,但是只有错误信息的提示,不会生成源代码文件;

webpack中sourcemap的使用

还有很多值这里就不一一列举了,可以查看webpack文档,并调试。

www.webpackjs.com/configurati…

总结

开发环境更需要方便调试,推荐使用:

source-map或者cheap-module-source-map

生产环境需要隐藏源代码,推荐使用:

nosources-source-map、false或者不写

转载自:https://juejin.cn/post/7212942861519454245
评论
请登录