前端调试系列二 sourcemap

101 阅读1分钟

什么是 sourcemap

sourcemap 是关联编译后的代码和源码的,通过一个个行列号的映射。

比如编译后代码的第 3 行第 4 列,对应着源码里的第 8 行第 5 列这种,这叫做一个 mapping。

sourcemap 的格式如下:

{
    version : 3,
    file: "out.js",
    sourceRoot : "",
    sources: ["foo.js", "bar.js"],
    names: ["a", "b"],
    mappings: "AAgBC,SAAQ,CAAEA;AAAEA",
      sourcesContent: ['const a = 1; console.log(a)', 'const b = 2; console.log(b)']
}
  • version:sourcemap 的版本,一般为 3
  • file:编译后的文件名
  • sourceRoot:源码根目录
  • names:转换前的变量名
  • sources:源码文件名
  • sourcesContent:每个 sources 对应的源码的内容
  • mappings:一个个位置映射

构建后一个 bundle.js 就对应了 n 个 sources 源文件所以sources可以有多个。

mappings 部分是通过分号; 和逗号 , 分隔的:

mappings:"AAAAA,BBBBB;CCCCC"

一个分号就代表一行,这样就免去了行的映射。

然后每一行可能有多个位置的映射,用 , 分隔。

比如 AAAAA 一共五位,分别有不同的含义:

  • 转换后代码的第几列(行数通过分号 ; 来确定)
  • 转换前的哪个源码文件,保存在 sources 里的,这里通过下标索引
  • 转换前的源码的第几行
  • 转换前的源码的第几列
  • 转换前的源码的哪个变量名,保存在 names 里的,这里通过下标索引

然后经过VLQ 编码之后,就成了 AAAAA 。

各种调试工具一般都支持 sourcemap 的解析,只要在文件末尾加上这样一行:

//# sourceMappingURL=/path/to/source.js.map

运行时就会关联到源码:

image.png