eval-sourcemap 同名文件debugger错位————webpack4.x版本

81 阅读2分钟

1. sourceURL=[module]指向的是什么

在看中间产物时,经常看见类似这样的sourcemap

image.png

网上关于sourceURL=[module]提及很少,大都是复制粘贴,好在chatGpt能很好地扫盲

其实module指的就是当前模块

image.png

2. 存在同名文件,为什么不能正确打到断点

假如有两个App.vue文件,一个name='App1',另一个name='App2',App1 引用了App2

这时候webpack生成sourcemap的时候,会先生成App2的sourcemap,然后再生成App1的。

sourcemap.sources字段里面的源码地址都是平铺到webpack:///下面的

这里两份soucemap的sources字段都是webpack:///App.vue?234e,但是具体的sourcesContent是不同的

在生成App2的sourcemap时,由于没有找到具体的内容,就会新建一个webpack:///App.vue?234e

image.png

后面生成App1的sourcemap时,由于已经存在了webpack:///App.vue?234e,就默认使用这份源码

所以至始至终都没有App1的源码!!!

后面debugger的时候,在App1的第20行中打了个断点,浏览器运行的是在经过loader处理过后的文件

image.png

这个时候,就会进到App2的源码的第20行

image.png

在App2第11行打了断点,下图是App2的Laoder之后的代码

image.png

这个时候进到了正确的debugger

image.png

但是这里还有一个问题,虽然App1的soucemap没有生成自己的源码,但是把源码对应的映射关系给改写了,所以webpack:///App.vue?234e对应的loader处理结果有两个

image.png

3. 为什么生成的soucemap的souces字段中的文件带有一个hash值

这个情况就是第二问中的webpack:///App.vue?234e

因为存在这个hash值,所以在vscode中打断点是不会生效的,vscode中的文件名是App.vue,和浏览器的源码文件名字不一样

起先我以为是为了避免缓存,hash是根据文件内容生成的,但是我怎么改文件内容,这个hash值都不会改变,即使是重新编译,这个hash值也还是没有变化。起先我还以为是为了区分同名文件加的后缀,但是同名文件的hash是一样的,咋会这样???

还好懂一些debugger的姿势,不然毫无办法

进入到webpack的源码

1679394580250.png

发现这个hash是根据"App.vue"这7个长度的字符串生成的!!!

所以不管我怎么搞,这个hash值都是不会变得,也会造成一系列同名的问题

可是为什么要生成这个hash值呢?

在webpack5.x版本中,eval带来的问题已经修复了

sourcemap.sources字段不再仅仅是模块名字,还带了路径,所以不会平铺出来

image.png 所以为啥要搞hash?

有知道的同学麻烦教我下哈