js source map原理

作用:主要用于调试,现在代码都会经过压缩混淆,这样报错提示会很难定位代码,sourcemap就是一个信息文件,里面存储着位置信息,也就是说,转换后的代码的每个位置,所对应的转换前的位置( 

如何开启source map?

在打包后的代码尾部追加一行:

//@ sourceMappingURL="xxxxx"复制代码
souce map的格式
{
    version: 3, // source map的版本,目前为3
    file: "out.js", // 转换后的文件名
    sourceRoot: "", // 转换前的文件所在的目录,如果与转换前的文件在同一目录,该项为空
    sources: [], // 转换前的文件
    names: [], // 转换前的所有变量名的属性名
    mappings: "" // 记录位置信息的字符串
    sourceContents: [] // webpack生成的sourcemap有这一项,里面是模块源码
}复制代码

webpack devtool配置

value

作用

eval

每个模块都用eval封装进行运算,并且在末尾追加注释 //@ sourceURL

source-map

生成一个sourcemap文件,并且会在每个bundle文件末尾追加注释 // sourcemap=xx.js.map

hiden-source-map

跟上面source-map作用一样,生成一个sourcemap文件,只是没有文件末尾的注释,默认查找xx.js.map文件

inline-source-map

生成一个base64的sourcemap文件并注释追加在每个bundle文件的末尾

eval-source-map

每个module都用eval封装运算,并在模块的末尾追加base64的SourceMap

cheap-source-map

生成一个没有列信息的sourcemap文件,不包含loader的sourcemap(代码定位的是webpack中配置的loader转换的代码,不是纯源码)

cheap-module-source-map

生成一个没有列信息的sourcemap文件,同时loader的sourcemap被简化为只包含对应行的

总结:

  • eval: 每个module用eval封装进行运算,每个module后配置source-map的dataUrl或者sourceurl
  • source-map: 每个bundle文件后追加sourcemap的sourceURL或者dataURL,包括行信息,列信息,loader也有对应的sourcemap
  • cheap: sourcemap文件中的mappings中只有对应的行信息,没有列文件,并且没有对应的loader的sourcemap,对应的都是loader转换后的代码,不是纯正的源代码
  • module: 添加loader的对应的sourcemap
  • inline: 文件内联base64的dataURL的sourcemap信息(不推荐使用,因为这样会造成源代码的体积巨大)

以上几种可以进行随机搭配,生成适合自己的sourcemap