線上追蹤壓縮後的JS出錯程式碼

王駱菲發表於2019-03-01

原文:qianduan.group. 目前的web靜態資源為了減少載入時間和一部分的安全原因,都對js檔案進行了合併和壓縮,雖然在網頁體驗上非常不錯,但是對於線上js的錯誤跟蹤就顯得異常麻煩

解決思路

對於不要壓縮,這點肯定是不能妥協的,使用者體驗是堅決不能犧牲的,但是能不能從壓縮著手呢?答案是肯定的,第一時間,我們應該就會想到sourcemap,在sourcemap上來解決問題

怎麼利用sourcemap

深入瞭解sourcemap對映原理前,最好讀一下阮老師的文章《JavaScript Source Map 詳解》。 讀完之後,我們就大致瞭解了sourcemap的幾個概念,接下來我們具體分析一下

1. sourcemap檔案結構

{
    version : 3,
    file: "out.js",
    sourceRoot : "",
    sources: ["foo.js", "bar.js"],
    names: ["src", "maps", "are", "fun"],
    mappings: "AAgBC,SAAQ,CAAEA"
}複製程式碼

mappings裡面的資料就是對應位置的對映,需要對mappings裡面的各個位置進行分解

2. 分析位置

我們使用vlq庫進行分解,獲取具體的位置資訊

/*
* 返回相應的位置資訊
* rt[0]:這個位置在(轉換後的程式碼的)的第幾列。
* rt[1]:這個位置屬於sources屬性中的哪一個檔案。
* rt[2]:表示這個位置屬於轉換前程式碼的第幾行。
* rt[3]:表示這個位置屬於轉換前程式碼的第幾列。
* rt[4]:表示這個位置屬於names屬性中的哪一個變數。
*/
let rt = vlq.decode( `AAgBC` );複製程式碼

3. 記錄完整的對映關係

對於第二步,只是知道每個點位的位置,然後對於全部位置的記錄,需要關聯整理,可以參考sourcemap-stack庫,其中/src/mappingRealPath.js檔案下面的mappingSingleFile函式記錄關聯了全部資訊,以便後續使用

4.注意點

根據不同的環境,可能在計算中會有小偏差,所以我們需要修正相應的位置對映。在sourcemap-stack中,/src/mappingRealPath.js檔案下面的mapErrorPosition函式進行了位置修正,以便正確獲取

怎麼產生sourcemap

  1. 如果目前在使用react,vue等框架時,一般都會用到webpack,在webpack打包的時候,是可以生產map檔案的
  2. 如果是老式專案,一般會用到gulp等工具,這些工具在處理壓縮js檔案時,也是可以生產map檔案

使用工具

下面兩種途徑,只是提供了介面,對映關係都是依賴sourcemap-stack

  1. 目前可以通過sourcemap-site,git clone下來之後,執行就能開啟頁面(不再維護)
  2. 安裝下載vide編輯器,目前已經支援微信和支付寶小程式,也支援vue,react等開發,可以安裝vide-plugin-toolbar-sourcemap外掛,非常的方便

執行介面

stack3.5e60dbc0e02c.png
stack3.5e60dbc0e02c.png

引數說明

屬性 說明 型別
map地址 js檔案對應map檔案資源的伺服器地址,如果map檔案和js檔案在同一個目錄下,可以不填 String
map檔名 相比於js檔案,map檔案的格式,比如[name].[hash].js.map,[name].js.map。有點類似webpack配置的output下filename的格式 String
map加密金鑰 如果map檔案放到跟js同目錄下,一起釋出到cdn上,處於安全考慮,可以使用對稱性加密map檔案,加密包使用encrypte,如果沒有加密,這項不填 String
錯誤資訊 通過window.onerror等方式獲取到的錯誤資訊,一般可以通過error.stack來獲取,只需copy錯誤資訊,黏貼到介面上就行 String

執行結果

單擊分析按鈕後,就會對你配置的資訊就行檢索和分析,最終得到如下分析結果

預設顯示最頂層的堆疊出錯

stack1.e9c10b6d292d.png
stack1.e9c10b6d292d.png

可以單擊其他堆疊的行,進行原始碼檢視,非常的直觀

stack2.695bbba2565f.png
stack2.695bbba2565f.png

注意

因為一般js檔案的地址跟html地址都不一樣,所以為了得到error資訊,需要對js檔案允許跨域,在script標籤裡面加crossorigin屬性

總結

一般公司裡面都有線上js出錯的日誌上報,通過線上日誌的上報,檢視錯誤資訊,把錯誤資訊copy到工具上面,進行檢視。根據這個工具,可以對線上的錯誤進行原始碼的檢視了,幫助大家快速找到線上問題

相關文章