壓縮代碼如何快速定位到腳本異常位置


  線上的代碼幾乎都經過了壓縮處理,幾十個文件打包成了一個並丑化了的代碼,當我們收到 a is not defined 的時候,我們根本不知道這個變量 a 究竟是什么含義,此時報錯的錯誤日志顯然是無效的。

  那么如何去快速定位到腳本異常的位置呢?

  第一想到的辦法是利用 sourcemap 定位到錯誤代碼的具體位置

  另外也可以通過在打包的時候,在每個合並的文件之間添加幾行空格,並相應加上一些注釋,這樣在定位問題的時候很容易可以知道是哪個文件報的錯誤,然后再通過一些關鍵詞的搜索,可以快速地定位到問題的所在位置。

一、壓縮代碼定位錯誤困難

// 1、源代碼(存在錯誤)
function test() { noerror // <- 報錯
} test(); // 2、經 webpack 打包壓縮后產生如下代碼
!function(n){function r(e){if(t[e])return t[e].exports;var o=t[e]={i:e,l:!1,exports:{}};return n[e].call(o.exports,o,o.exports,r),o.l=!0,o.exports}var t={};r.m=n,r.c=t,r.i=function(n){return n},r.d=function(n,t,e){r.o(n,t)||Object.defineProperty(n,t,{configurable:!1,enumerable:!0,get:e})},r.n=function(n){var t=n&&n.__esModule?function(){return n.default}:function(){return n};return r.d(t,"a",t),t},r.o=function(n,r){return Object.prototype.hasOwnProperty.call(n,r)},r.p="",r(r.s=0)}([function(n,r){function t(){noerror}t()}]); // 3、代碼如期報錯,並上報相關信息
{ msg: 'Uncaught ReferenceError: noerror is not defined', url: 'http://127.0.0.1:8077/main.min.js', row: '1', col: '515' }

  此時,錯誤信息中行列數為 1 和 515。 結合壓縮后的代碼,肉眼觀察很難定位出具體問題。

二、如何定位到具體錯誤

1、不壓縮 js 代碼

  這種方式簡單粗暴,但存在明顯問題:1. 源代碼泄漏,2. 文件的大小大大增加。

2、將壓縮代碼中分號變成換行

  uglifyjs 有一個叫 semicolons 配置參數,設置為 false 時,會將壓縮代碼中的分號替換為換行符,提高代碼可讀性, 如:

!function(n){function r(e){if(t[e])return t[e].exports var o=t[e]={i:e,l:!1,exports:{}} return n[e].call(o.exports,o,o.exports,r),o.l=!0,o.exports}var t={} r.m=n,r.c=t,r.i=function(n){return n},r.d=function(n,t,e){r.o(n,t)||Object.defineProperty(n,t,{configurable:!1,enumerable:!0,get:e})},r.n=function(n){var t=n&&n.__esModule?function(){return n.default}:function(){return n} return r.d(t,"a",t),t},r.o=function(n,r){return Object.prototype.hasOwnProperty.call(n,r)},r.p="",r(r.s=0)}([function(n,r){function t(){noerror}t()}])

  此時,錯誤信息中行列數為 5 和 137,查找起來比普通壓縮方便不少。但仍會出現一行中有很多代碼,不容易定位的問題。

3、js 代碼半壓縮,保留空格和換行

  uglifyjs 的另一配置參數 beautify 設置為 true 時,最終代碼將呈現壓縮后進行格式化的效果(保留空格和換行),如

!function(n) { // ... // ...
}([ function(n, r) { function t() { noerror; } t(); } ]);

  此時,錯誤信息中行列數為 32 和 9,能夠快速定位到具體位置,進而對應到源代碼。但由於增加了換行和空格,所以文件大小有所增加。

4、SourceMap 快速定位

  SourceMap 是一個信息文件,存儲着源文件的信息及源文件與處理后文件的映射關系。

  在定位壓縮代碼的報錯時,可以通過錯誤信息的行列數與對應的 SourceMap 文件,處理后得到源文件的具體錯誤信息。

5、開源方案 sentry

  sentry 是一個實時的錯誤日志追蹤和聚合平台,包含了上面 sourcemap 方案,並支持更多功能,如:錯誤調用棧,log 信息,issue管理,多項目,多用戶,提供多種語言客戶端等,具體介紹可以查看 getsentry/sentrysentry.io,這里暫不展開。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM