這幾天在搞前端錯誤日誌,作過線上發佈的都知道,咱們發佈到生產環境的代碼,通常都有以下步驟:javascript
HTTP
請求數JavaScript
這三個步驟,都使得實際運行的代碼不一樣於開發代碼,不論是 debug 仍是捕獲線上的報錯,都會變得困難重重。html
解決這個問題的方法,就是使用sourceMap
。前端
簡單說,sourceMap
就是一個文件,裏面儲存着位置信息。java
仔細點說,這個文件裏保存的,是轉換後代碼的位置,和對應的轉換前的位置。webpack
有了它,出錯的時候,經過斷點工具能夠直接顯示原始代碼,而不是轉換後的代碼。web
經過webpack
等工具,咱們可使用 sourceMap
,這裏不細說配置方法,能夠看這裏數組
sourceMap
是一個map
文件,與源碼在同一個目錄下。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
中,編碼順序是從高位到低位