即使在阅读了答案之后,我的解释仍然不是很清楚。这是一个简单的英语解释,以防它帮助某人:
;;AAAA,IAAM,WAAW,SAAX;...
类似的东西<line0 info>;<line1 info>;...
所以对于;;AAAA;IAAM,WAAW,SAAX;...
,第 0 行和第 1 行没有任何重要信息(空格等)
那么对于第 2 行,我们有AAAA,IAAM,WAAW,SAAX
我们使用 base64 字符映射将这些组中的每一个转换为二进制:
BASE64_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
所以我们基本上在BASE64_ALPHABET
上面找到了索引,并将索引转换为6位二进制(6位,因为我们使用base64)。例如。A 的索引是 0,所以在 6 位二进制中它是 000000。所以 AAAA 将是000000 000000 000000 000000
那么如果我们这样做,IAAM
我们会得到:001000 000000 000000 001100
。
那么这个位表示是 4 个数字的 VLQ 编码版本。我们从左边的块开始,删除符号和继续位,保留这些位。并在延续位为 1 时继续添加位。
eg. 001000 is (cont)0100(sign)
so cont = 0 (no other block will be added to this number)
sign=0 (its positive)
bits = 0100 --> so it is 4 in decimal
-- note that we only remove sign bit for the first time. so if we had
101000 001000
we would say
0100 (cont=1, sign=0) 01000 (cont=0)
so we would have had +010001000 = 136
当我们继续这样做时,我们将得到这 4 个数字(连续位应该是 0 正好 4 次)。
- AAAA 将映射到 (0,0,0,0)
- IAAM 将映射到 (4,0,0,6)
- WAAW 将映射到 (11,0,0,11) ...
现在,这些中的每一个都意味着相对数字。所以我们更正了这些:
- AAAA 实际上指向:(0,0,0,0)
- IAAM 实际上指向: (0+4, 0+0, 0+0, 0+6) = (4,0,0,6)
- WAAW 实际上指向: (4+11, 0+0, 0+0, 6+11) = (15,0,0,17) // 我们在 IAAAM 实际指向的地方添加了它
...
所以这里的数字 (n1, n2, n3, n4) 代表
- n1:生成代码中的列
- n2:sourceMapping 输出的“sources”数组中对应的源文件索引
- n3:原始代码中的行号
- n4:原始代码中的列号
我们从一开始就已经知道这指的是哪一行。所以使用我们上面的信息,我们了解到:
- AAAA:生成代码的第 2 行第 1 列指向源 [0],第 0 行,第 0 列
- IAAM:第 2 行,第 4 列生成的代码指向源 [0],第 0 行,第 6 列
- WAAW:第 2 行,第 15 列生成的代码指向源 [0],第 0 行,第 17 列 ...
关于这个的两个很好的来源: