web前端開發學習重點

2020-12-23 愛創課堂全棧前端

常見錯誤的分類

對於用戶在訪問頁面時發生的錯誤,主要包括以下幾個類型:

1、js運行時錯誤

JavaScript代碼在用戶瀏覽器中執行時,由於一些邊界情況、本地環境的不可控等因素,可能會存在js運行時錯誤。

而依賴客戶端的某些方法,由於兼容性或者網絡等問題,也有概率會出現運行時錯誤。

e.g: 下圖是當使用了未定義的變量"foo",導致產生js運行時錯誤時的上報數據:

2、資源加載錯誤

這裡的靜態資源包括js、css以及image等。現在的web項目,往往依賴了大量的靜態資源,而且一般也會有cdn存在。

如果某個節點出現問題導致某個靜態資源無法訪問,就需要能夠捕獲這種異常並進行上報,方便第一時間解決問題。

e.g: 下圖是圖片資源不存在時的上報數據:

3、未處理的promise錯誤

未使用catch捕獲的promise錯誤,往往都會存在比較大的風險。而編碼時有可能覆蓋的不夠全面,因此有必要監控未處理的promise錯誤並進行上報。

e.g: 下圖是promise請求接口發生錯誤後,未進行catch時的上報數據:

4、異步請求錯誤(fetch與xhr)

異步錯誤的捕獲分為兩個部分:一個是傳統的XMLHttpRequest,另一個是使用fetch api。

像axios和jQuery等庫就是在xhr上的封裝,而有些情況也可能會使用原生的fetch,因此對這兩種情況都要進行捕獲。

e.g: 下圖是xhr請求接口返回400時捕獲後的上報數據:

各個類型錯誤的捕獲方式

1、window.onerror與window.addEventListener('error')捕獲js運行時錯誤

使用window.onerror和window.addEventListener('error')都能捕獲,但是window.onerror含有詳細的error堆棧信息,存在error.stack中,所以我們選擇使用onerror的方式對js運行時錯誤進行捕獲。

2、資源加載錯誤使用addEventListener去監聽error事件捕獲

實現原理:當一項資源(如<img>或<script>)加載失敗,加載資源的元素會觸發一個Event接口的error事件,並執行該元素上的onerror()處理函數。

這些error事件不會向上冒泡到window,不過能被window.addEventListener在捕獲階段捕獲。

但這裡需要注意,由於上面提到了addEventListener也能夠捕獲js錯誤,因此需要過濾避免重複上報,判斷為資源錯誤的時候才進行上報。

3、未處理的promise錯誤處理方式

實現原理:當promise被reject並且錯誤信息沒有被處理的時候,會拋出一個unhandledrejection。

這個錯誤不會被window.onerror以及window.addEventListener('error')捕獲,但是有專門的window.addEventListener('unhandledrejection')方法進行捕獲處理。

4、fetch與xhr錯誤的捕獲

對於fetch和xhr,我們需要通過改寫它們的原生方法,在觸發錯誤時進行自動化的捕獲和上報。

改寫fetch方法:

對於XMLHttpRequest的重寫:

xhr改寫

關於responseURL 的說明

需要特別注意的是,當請求完全無法執行的時候,XMLHttpRequest會收到status=0 和 statusText=null的返回,此時responseURL也為空string。

另外在安卓4.4及以下版本的webview中,xhr對象也不存在responseURL屬性。

因此我們需要額外的改寫xhr的open方法,將傳入的url記錄下來,方便上報時帶上。

其他問題

1、其他框架,例如vue項目的錯誤捕獲

vue內部發生的錯誤會被Vue攔截,因此vue提供方法給我們處理vue組件內部發生的錯誤。

2、script error的解決方式

"script error.」有時也被稱為跨域錯誤。當網站請求並執行一個託管在第三方域名下的腳本時,就可能遇到該錯誤。最常見的情形是使用 CDN 託管 JS 資源。

其實這並不是一個 JavaScript Bug。出於安全考慮,瀏覽器會刻意隱藏其他域的 JS 文件拋出的具體錯誤信息,這樣做可以有效避免敏感信息無意中被不受控制的第三方腳本捕獲。

因此,瀏覽器只允許同域下的腳本捕獲具體錯誤信息,而其他腳本只知道發生了一個錯誤,但無法獲知錯誤的具體內容。

解決方案1:(推薦)

添加 crossorigin="anonymous" 屬性。

此步驟的作用是告知瀏覽器以匿名方式獲取目標腳本。這意味著請求腳本時不會向服務端發送潛在的用戶身份信息(例如 Cookies、HTTP 證書等)。

添加跨域 HTTP 響應頭:

或者

注意: 大部分主流 CDN 默認添加了 Access-Control-Allow-Origin 屬性。

完成上述兩步之後,即可通過 window.onerror 捕獲跨域腳本的報錯信息。

解決方案2

難以在 HTTP 請求響應頭中添加跨域屬性時,還可以考慮 try catch 這個備選方案。

在如下示例 HTML 頁面中加入 try catch:

可見 try catch 中的 Console 語句輸出了完整的信息,但 window.onerror 中只能捕獲「Script error」。根據這個特點,可以在 catch 語句中手動上報捕獲的異常。

總結

上述的錯誤捕獲基本覆蓋了前端監控所需的錯誤場景,但是第三部分指出的兩個其他問題,目前解決的方式都不太完美。

對於有使用框架的項目:一是需要有額外的處理流程,比如示例中就需要單獨為vue項目進行初始化;二是對於其他框架,都需要單獨處理,例如react項目的話,則需要使用官方提供的componentDidCatch方法來做錯誤捕獲。

而對於跨域js捕獲的問題:我們並不能保證所有的跨域靜態資源都添加跨域 HTTP 響應頭;而通過第二種包裹try-catch的方式進行上報,則需要考慮的場景繁多並且無法保證沒有遺漏。

雖然存在這兩點不足,但前端錯誤捕獲這部分還是和項目的使用場景密切相關的。我們可以在了解這些方式以後,選擇最適合自己項目的方案,為自己的監控工具服務。

相關焦點

  • 為什麼2017年Web前端開發工程師薪資越來越高?
    web可能是最有影響力的平臺和環境之一,在那裡執行的程序必須被小心對待。一位優秀的前端工程師不僅要考慮web技術和語言,並且還要了解所有不同的組件、系統和概念。那麼前端工程師要學習什麼樣的知識呢?有人說前端工程師的技術棧是這樣的:
  • 年薪30-50萬前端網際網路工程師 WEB/HTML5 震撼登場
    網際網路行業新貴—前端開發,HTML5WEB前端技術興起,前端開發的大潮已經襲來!8年前,隨著iPhone的興起iOS開發火爆中國。當年的行動者,如今已經成為百萬富翁!今天,隨著HTML5等WEB前端技術興起,前端開發的大潮已經襲來!趕快行動!讓青春不留遺憾!
  • 騰訊Web前端大會精彩回顧
    分會場一1.1 騰訊-萬波-WebGL 新篇章首先由來自騰訊的高級前端工程師BruceWan(萬波)分享《WebGL新的篇章》,萬老師通過通俗易懂的語言向大家講解了如何去更好的學習WebGL,分析了WebGL的可行性,介紹了WebGL & ThreeJs
  • 前端工程師主要做什麼?你了解Web前端開發工程師嗎-開課吧
    前端開發顧名思義就是頁面的設計,代碼的實現。目前企業對Web前端開發工程師的工作要求:1、熟悉、理解並掌握公司系統的架構、技術和開發工作。2、參與公司系統的需求分析、產品討論。3、能獨立完成應用系統的開發、自測試、聯調以及上線發布。
  • 裴琳 · 微成長--web性能優化與前端工程
    ....任性的分割線web性能優化與前端工程 每個參與過開發企業級web應用的前端工程師或許都曾思考過前端性能優化方面的問題。然而,對於構建大型web應用的團隊來說,要堅持貫徹這些優化原則並不是一件十分容易的事。
  • HTML5-前端開發很火且工資很高?
    目 錄HTML5前端開發的薪資市場的供求關係HTML5語言優勢HTML5前端開發的薪資首先我們來看看2016年上半年前端端開發的薪資情況(參考了拉勾網,智聯招聘,51job,前程無憂,Boss直聘上的數據)。
  • 免費送書 | 《瘋狂前端開發講義-jQuery+AngularJS+Bootstrap前端開發實戰》
    《瘋狂前端開發講義-jQuery+AngularJS+Bootstrap前端開發實戰》截止至2018年 2 月 1 號 12點前,精選留言被點讚最多的前3名用戶將獲得此書。PS:已獲獎不能再次獲獎,同時獲獎只能任選一本!
  • 前端高效開發必備的 js 庫梳理
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫之前有很多人問學好前端需要學習哪些 js 庫, 主流框架應該學 vue 還是 react ? 針對這些問題, 筆者來說說自己的看法和學習總結.
  • 平面設計、UI設計、Web前端有什麼不同?薪資水平如何?
    Web前端:主要是為實現網頁或UI界面的視覺效果提供技術支持,用戶交互和體驗也是前端來完成,偏編程技術方向,算是設計師的下遊,比如由UI設計師提出在某位置增加跳轉到另一頁面的按鈕,再由前端開發來實現這一需求。
  • 讓你見識一下什麼叫最完整、最系統的前端學習路線
    隨著網際網路的深入發展,前端開發工程師已成為市場上極具競爭力的人才。許多學生,包括以前的UI,java,或完全零基礎,想學習的前端。 前端開發受歡迎程度: 2018年,JetBrains 發起了其標準的年度調查項目,開發人員生態系統調查 (The Developer Ecosystem 2018)。該項調查不僅揭示了不同程式語言的流行趨勢,並且從開發人員的角度反映了他們的個人偏好。調查由淺入深,從一般性的問題開始,並逐漸延伸至各領域的科技趨勢。
  • 對web前端中SPA單頁面的理解以及它的優缺點介紹
    優點:用戶體驗好、快,內容的改變不需要重新加載整個頁面,避免了不必要的跳轉和重複渲染;基於上面一點,SPA 相對對伺服器壓力小;前後端職責分離,架構清晰,前端進行交互邏輯,後端負責數據處理;這樣做的好處是整個業務系統架構清晰,可以單獨開發、測試。
  • 「Web前端開發進階篇」Chrome瀏覽器的調試使用
    作者Web前端開發進階篇自Google發布Chrome瀏覽器以來,其隨著Chrome瀏覽的優化及其附帶的Chrome開發者工具和額外的擴展程序,受到了廣大開發者的喜愛,越來越多的前端開發人員喜歡在Chrome裡開發調試代碼,對開發人員非常友好,許多的優秀插件可以幫助開發人員更高效完成開發工作,另外可以登錄,不管到哪裡,只要一登錄就可以實現同步,極為方便
  • 從後端開發轉職前端開發,我學到了什麼?
    特別是當你已經習慣了後端開發的工作模式,習慣了構建數據結構,編寫類似於測試驅動開發的測試,習慣了使用持久層、倉庫和資料庫圖表,以及給前端創建API接口。凡此種種,不勝枚舉。後端有其複雜性,所以大部分人沒有時間學習前端開發的內部運作方式。我也是。
  • 中國航信重慶研發中心IOS、Andorid、初級JAVA開發 、前端開發、軟體測試崗位
    中國航信重慶研發中心是中國航信下屬的重點研發機構,在公司一體化多層次研發體系中佔據重要位置,中心最早組建於2009年,2012年10月遷入重慶市兩江新區木星科技樓辦公。  重慶研發中心秉持「民主、求實、專業、高效」的管理理念,在團隊激勵機制和人才培養模式上不斷探索和創新。
  • 2019 Web開發技術指南和趨勢(附 Youtube 截圖) |【簡介】
    這是一個 41min 的視頻,從前端到後端,從入門到精通,從編譯器到伺服器,都做了仔細的趨勢分析。☆PS:如果哪位魚油有興趣做字幕翻譯,歡迎下方留言哈,一旦完成(海量魚幣必不可少)視頻主要幹了三件事情:●魚油不需要學習所有技術來成為一個 web 開發者。●指南只是通過簡單分類列出了技術選項。
  • Web究竟是什麼意思呢?
    我們都常說web前端開發,那麼web究竟是什麼意思呢?web的本意是蜘蛛網和網的意思,在網頁設計中也就是我們稱之為網頁的意思。現廣泛譯作網絡、網際網路等技術領域。表現為三種形式,即超文本(hypertext)、超媒體(hypermedia)、超文本傳輸協議(HTTP)等。
  • 專訪|百度高級前端開發工程師@葉小釵
    今天我們來看看百度高級前端開發工程師@葉小釵的前端之旅。現在在百度創新業務發展部團隊負責移動端開發,團隊的產品關注於衣食住行中的行,所以產品名稱為:百度快行。 2)是在什麼樣的機緣下走進前端的?小釵進入前端是比較巧合的,我大學主要用.net做開發,當時比較複雜的項目單個存儲過程都寫了1000多行,可以說我在server端的還是有一些項目經驗的。
  • 2021年比較適合用於Web開發的7種程式語言
    Python 以其許多面向 web 開發的框架而聞名,這些框架可以幫助開發人員創建功能性應用程式。最受歡迎的是 Django、Pyramid、Bottle、Flask、CherryPy、WebApp2和TurboGears。Django 比其他 Python 框架使用得更為頻繁,因為它具有讓我們在構建 Web 應用程式更快、代碼更少的工具包。
  • 為什麼那麼多自學WEB前端的人後來都放棄了?
    WEB前端技術在網際網路技術中,以其相對低的門檻和廣泛的就業範圍,受到越來越多人的青睞。但在許多學習前端的同學中,卻存在「從入門到放棄」,或學習結業了卻找不到工作的情況。如果你對前端開發感興趣,正準備學習,但有前述顧慮,不妨看看本文,從技術角度分析,避開「從入門到放棄」的學習雷區。
  • Web前端慢加密
    0x05 前端加密  在過去,個人電腦和伺服器的性能,還是有較大差距的。但如今,隨著硬 件發展進入瓶頸,這個差距正縮小。在單線任務處理上,甚至不相上下。  客戶端擁有強大的算力,能不能分擔一些伺服器的工作?