这几天在搞前端错误日志,作过线上发布的都知道,咱们发布到生产环境的代码,通常都有以下步骤:javascript
HTTP
请求数JavaScript
这三个步骤,都使得实际运行的代码不一样于开发代码,不论是 debug 仍是捕获线上的报错,都会变得困难重重。html
解决这个问题的方法,就是使用sourceMap
。前端
简单说,sourceMap
就是一个文件,里面储存着位置信息。java
仔细点说,这个文件里保存的,是转换后代码的位置,和对应的转换前的位置。webpack
有了它,出错的时候,经过断点工具能够直接显示原始代码,而不是转换后的代码。web
经过webpack
等工具,咱们可使用 sourceMap
,这里不细说配置方法,能够看这里数组
sourceMap
是一个map
文件,与源码在同一个目录下。bash
在压缩代码的最后一行,会有这样的一个引用:app
//# sourceMappingURL=app.js.map
复制代码
指向的就是咱们的map
文件。工具
sourceMap
的格式以下:
{
version : 3, //SourceMap的版本,目前为3
sources: ["foo.js", "bar.js"], //转换前的文件,该项是一个数组,表示可能存在多个文件合并
names: ["src", "maps", "are", "fun"], //转换前的全部变量名和属性名
mappings: "AACvB,gBAAgB,EAAE;AAClB;", //记录位置信息的字符串
file: "out.js", //转换后的文件名
sourcesContent: " \t// The module cache\n", //转换后的代码
sourceRoot : "" //转换前的文件所在的目录。若是与转换前的文件在同一目录,该项为空
}
复制代码
其余的都很好解释,咱们详细说一下mappings
属性。
以"AACvB,gBAAgB,EAAE;AAClB;"
为例:
AACvB
表明该位置转换前的源码位置,以VLQ
编码表示;位置关系的保存经历了诸多步骤和优化,这个不详细说了,想看的能够看这里,咱们只说最后的结果。
在每一个位置中:
假设如今有a.js
,内容为feel the force
,处理后为b.js
,内容为the force feel
以the
为例,它在输出中的位置是(0,0),a.js
是sources
的第1个(这里只是举例),输入中的位置是(0,5),the
是names
的第2个(这里只是举例)。
那么映射关系为: 0 1 0 5 2
最后将 01052 表示为 Base64 VLQ 便可。
说明:
names
属性中的变量,能够省略第五位VLQ
编码表示,因为VLQ
编码是可变长的,因此每一位能够由多个字符构成相对位置是啥呢,看示意图:
第一次记录的输入位置和输出位置是绝对的,日后的输入位置和输出位置都是相对上一次的位置移动了多少,例如the
的输出位置为(0,-10),由于the
在feel
的左边数10下才能到这个位置。
VLQ
是Variable-length quantity
的缩写,是一种通用的、使用任意位数的二进制来表示一个任意大的数字的一种编码方式。这种编码最先用于MIDI文件,后来被多种格式采用,它的特色就是能够很是精简地表示很大的数值,用来节省空间。
这种编码须要用最高位表示连续性,若是是1,表明这组字节后面的一组字节也属于同一个数;若是是0,表示该数值到这就结束了。
这样干巴巴说不太容易懂,仍是举个栗子说明一下吧。
如何对数值137进行VLQ编码:
步骤 | 结果 |
---|---|
将137改写成二进制形式 | 10001001 |
七位一组作分组,不足的补0 | 0000001 0001001 |
最后一组开头补0,其他补1 | 10000001 00001001 |
因此,137的VLQ编码形式为10000001 00001001
与通常的VLQ
的区别:
Base64
字符只能表示6bit(2^6)
的数据Base64 VLQ
须要可以表示负数,因而用最后一位来做为符号标志位。[-15,15]
,若是超过了就要用连续标识位了。表示正负的方式:
VLQ
编码的第一组字节,那它的最后一位表明"符号",0为正,1为负;咱们再来举个栗子说明下使用方法。
如何对数值137进行Base64 VLQ
编码:
步骤 | 结果 |
---|---|
将137改写成二进制形式 | 10001001 |
127是正数,末位补0 | 100010010 |
五位一组作分组,不足的补0 | 01000 10010 |
将组倒序排序 | 10010 01000 |
最后一组开头补0,其他补1 | 110010 001000 |
转64进制 | y和I |
因此 137 经过Base64 VLQ
表示为yl
能够看出:
Base64 VLQ
中,编码顺序是从低位到高位VLQ
中,编码顺序是从高位到低位