SyMind / learning

路漫漫其修远兮,吾将上下而求索。
10 stars 1 forks source link

Source Map #24

Open SyMind opened 3 years ago

SyMind commented 3 years ago

原文:https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#

背景

原始 source map 格式(v1)由 Joseph Schorr 创建,用于 Closure 支持对优化后的 JavaScript 代码进行源代码级调试(尽管该格式本身与语言无关)。然而,随着使用 source map 的项目规模不断扩大,格式的冗长开始成为问题。v2 提供一些简单性和灵活性,以减小 source map 的总体大小。即使对 v2 版本的格式进行了更改,source map 文件的大小也限制了其用途。v3 格式基于@podivilov 的建议。

相关文档: Revision 2 proposal

术语

术语 定义
转换后的代码 由编译器转换后的代码。
源代码 尚未通过编译器的源代码。
Base 64 VLQ VLQ 是一个 Base64 值,其中最高有效位(第6位)被用于表示是否『连续』,最低有效位被用作符号位。注:VLQ Base64 编码可以表示的值被限制为32位。
Source Mapping URL 在转换后的代码中引用 source map 的 URL。

v3 版本格式

目的

格式

{
    "version" : 3,
    "file": "out.js",
    "sourceRoot": "",
    "sources": ["foo.js", "bar.js"],
    "sourcesContent": [null, null],
    "names": ["src", "maps", "are", "fun"],
    "mappings": "A,AAAB;;ABCDE;"
}

第1行:文件整体是一个 JSON 对象。 第2行:文件版本始终是对象中的第一项,并且必须是正整数。 第3行:可选项,与该 source map 关联的转换后的代码文件名。 第4行:可选项,源文件根目录,用于在服务器上重新定位源文件或删除『sources』字段中的重复值。此值将被添加到『sources』字段中的各项前。 第5行:『mappings』使用的源文件的列表。 第6行:可选项,源代码列表,在宿主环境中无法检索源代码时非常有用。内容按与第5行中『sources』项相同的顺序列出。如果应当按名称检索某些原始资源,则可使用『null』。 第7行:『mappings』项所使用的符号名列表。 第8行:编码后的映射数据的字符串。

『mappings』数据结构如下:

每个段中的字段为:

  1. 表示在转换后的代码的第几列,列的索引从零开始。
  2. 如果存在,表示对应『sources』列表的第几项,项的索引从零开始。
  3. 如果存在,表示对应源代码中第几行,行的索引从零开始。
  4. 如果存在,表示对应源代码中第几列,列的索引从零开始。
  5. 如果存在,表示对应『names』列表的第几项,项的索引从零开始。

注意:使用谷歌日历进行测试,此编码相对于 V2 格式 source map 的大小减少了 50%。