1. sourceURL=[module]指向的是什么
在看中间产物时,经常看见类似这样的sourcemap
网上关于sourceURL=[module]提及很少,大都是复制粘贴,好在chatGpt能很好地扫盲
其实module指的就是当前模块
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
后面生成App1的sourcemap时,由于已经存在了webpack:///App.vue?234e,就默认使用这份源码
所以至始至终都没有App1的源码!!!
后面debugger的时候,在App1的第20行中打了个断点,浏览器运行的是在经过loader处理过后的文件
这个时候,就会进到App2的源码的第20行
在App2第11行打了断点,下图是App2的Laoder之后的代码
这个时候进到了正确的debugger
但是这里还有一个问题,虽然App1的soucemap没有生成自己的源码,但是把源码对应的映射关系给改写了,所以webpack:///App.vue?234e对应的loader处理结果有两个
3. 为什么生成的soucemap的souces字段中的文件带有一个hash值
这个情况就是第二问中的webpack:///App.vue?234e
因为存在这个hash值,所以在vscode中打断点是不会生效的,vscode中的文件名是App.vue,和浏览器的源码文件名字不一样
起先我以为是为了避免缓存,hash是根据文件内容生成的,但是我怎么改文件内容,这个hash值都不会改变,即使是重新编译,这个hash值也还是没有变化。起先我还以为是为了区分同名文件加的后缀,但是同名文件的hash是一样的,咋会这样???
还好懂一些debugger的姿势,不然毫无办法
进入到webpack的源码
发现这个hash是根据"App.vue"这7个长度的字符串生成的!!!
所以不管我怎么搞,这个hash值都是不会变得,也会造成一系列同名的问题
可是为什么要生成这个hash值呢?
在webpack5.x版本中,eval带来的问题已经修复了
sourcemap.sources字段不再仅仅是模块名字,还带了路径,所以不会平铺出来
所以为啥要搞hash?
有知道的同学麻烦教我下哈