繁体   English   中英

解码(javascript)源地图

[英]Decoding (javascript) source maps

我一直在困惑这里找到的下图

解码源地图

以下描述它应该如何工作:

进一步处理的上述图AAgBC将返回0,0,32,16,1 - 32是连续位,有助于构建16的以下值.B在Base64中纯解码为1.因此,使用的重要值是0,0,16,1。然后让我们知道第1行(由冒号统计的行数)生成的文件的第0列映射到文件0(文件0的数组是foo.js),第16行at第1栏。

我含糊地理解为什么B被转换为16 ,但什么是C 那怎么转换成1

该页面上的解释非常混乱。 忘记提到的关键是base64和VLQ系统基于6位字母而不是通常的8位字母表; 例如,base64数据与“普通”base64解码器不兼容,例如JavaScript自己的atob函数( atob("AAgBC")产生错误)。 我认为这个页面提供了更好的解释。

假设我们有一个函数decodeLine()来解码单行的数字, "IACH,mBAA0B,CAAS,EAAE,SAAgB" 这只是战斗的一半,因为每个4的数组(或5的数组)都相对于之前的4数组。

在这个例子中,第一个base64字符串“IACH”代表数组[4,0,1,-3] ,但是这个信息本身是无用的,因为它相对于前面的4个数组(第一个数字除外,在每行的开头重置为0)。 因此,如果前面的4个数组的总和是[11,1,10,3] ,我们可以计算出“IACH”的实际含义是[4, 1+0, 10+1,3+-3] = [4,1,11,0] 0,10 [4, 1+0, 10+1,3+-3] = [4,1,11,0] - 这意味着“输出列4对应于源文件1,源行11,源列0”。 类似地,“mBAA0B”解码为[19,0,0,26],其被添加到[4,1,11,0]以获得[23,1,11,26],这意味着“输出列23对应于源文件1,源线11,源列26“。

所以在这里我编写了代码来解码整个"mappings"字符串。 它有两个部分, decodeLine解码单行, scanMappings解码所有行,并为每个解码的6个值(行,列,源文件,源行,源列和可选名称索引)调用函数:

 function decodeLine(line) { function digit(c) { return atob("AAA"+c).charCodeAt(2); } if (line==="") return []; return line.split(",").map(token => { var output = [], num; for (var i = 0; i < token.length;) { var v = 0, shift = 0; do { var d = digit(token[i++]); // d = next 6-bit value decoded from base64 v |= (d & 31) << shift; // put lowest 5 bits of d into v } while (shift += 5, d & 32); // repeat if high bit of d is set output.push(v & 1 ? -(v >> 1) : v >> 1); // low bit is sign } return output; }); } function scanMappings(data, callback) { var lines = data.split(";"), output = []; var sum = [0,0,0,0,0]; for (var line = 0; line < lines.length; line++) { sum[0] = 0; decodeLine(lines[line]).forEach(p => { for (var i = 0; i < p.length; i++) sum[i] += p[i]; callback(line, ...sum); }) } } // Example taken from one of my TypeScript files console.log(JSON.stringify(decodeLine("IACH,mBAA0B,CAAS,EAAE,SAAgB"))); scanMappings( ";;;;;;;;;;;ICAA;;;;;;;;;;OAUG;IACH,mBAA0B,CAAS,EAAE,SAAgB;QACnD,uEAAuE", (line,col,srcFile,srcLine,srcCol) => console.log(`(${line},${col}) is from src file ${srcFile} at (${srcLine},${srcCol})`)); 

行和列从零开始。 规范就在这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM