可能由於網頁、瀏覽器問題、快取等原因,可能導致線上執行 js 的時候與開發環境並不一樣,會拋出異常。 js 異常基本上是前端開發工程師的家常便飯。如何記錄,並使用它,卻很少人注意。最近在考慮一個想法,基本上涉及到兩個步驟:收集和使用。
一、收集
對於error 收集這一塊,還是比較方便的,因為在各瀏覽器中都有一個介面:window.onerror:
window.onerror = function(errorMessage, scriptorMessage {Lt.on (errorMessage, scriptURL, lineNumber)
} 甚至中提供了Stack Trace,例如在try/catch 中也提供了e.stack(各個瀏覽器不同,可以使用eriwen/javascript-stacktrace 這個相容庫),試試看下面段落程式碼:
fn()
} catch(e) {
alert(e.stack)
} 所以收集這些錯誤還是比較方便的,這裡需要注意的事,使用windowl. , callback, isBubble) 中callback 的第一個參數並不是event,而是一個Error object。這樣的話,為了方便,使用window.onerror 是一個不錯的選擇,但透過dot 操作符監聽的事件是可以重載的,而這段監聽腳本理論上是放在所有js 最前面的,所以需要考慮其中的風險。
記錄錯誤包括:Page URL, User Agent, Script URL, Error Message 和Line Number
每個錯誤解決後,都可以在一個地方寫解決方案,看到的人可以評論、加分,最終會存檔起來,作為一個知識庫,並用有方便的api 可以使用這些知識庫的內容
在開發的時候,相同頁面window.onerror 的時候,透過插件,分析Error Message 識別出類型,加上URL 的判斷,給予開發者提醒前人犯過的錯誤
開發者可以訂閱知識庫上某些標籤,自動接收郵件(當然也可以根據文件註解、mapping 等方式做更好的配對)
為什麼要這樣做?主要是為了解決下面的一些問題:
工具保證效率的提升和避免重複錯誤重複解決
訂閱保證通知更具針對性
三、注意點
目前初步實現了一個收集的工具(sofish/stacktrace.js)和存儲方式(以 URL 為索引),是否繼續,還需要時間和進一步考慮,先發出來,拋磚引玉。
五、附錄
$url = new Url();
$page = $url->post('page');
if(!$page) return;
class ErrorTrace extends MongoData {🀜/[ MongoData 中沒有,區別
public function findOne($obj) {
return $this->connection->findOne($obj);
}}; 'url' => $url->post('url'),
'message' => $url->post('message'),
'line' => $url->post('line'),
'ua' => $url->post('ua'),
);
$index = array('page' => $page);
$hash = md5(json_encode($fields));
/ / 不重複記錄一個錯誤,所有錯誤記錄在同一個URL 下
if($field = $store->findOne($index)) {
if(isset($field[$hash])) return;
return $ store->setAttr(new Query('page', $page), $hash, $fields);
}
$store->page = $page;
$store->$hash = $fields;
$store- >save();
?> This Gist brought to you by GitHub.