1. 程式人生 > >h5頁面在瀏覽器上好好的,到手機上熄火了又看不到報錯資訊怎麼辦?

h5頁面在瀏覽器上好好的,到手機上熄火了又看不到報錯資訊怎麼辦?

## 背景 最近小編接了一個新需求,用h5開發頁面,通過webview嵌入原生APP中,自己在瀏覽器上開發爽歪歪,什麼資訊都能看到,可是一嵌入原生app中,瞬間就熄火了,啥也看不到了,不知道為什麼,反正就是頁面點不動了。 ![](https://img2020.cnblogs.com/blog/2050700/202009/2050700-20200919102511988-444590291.png) 這可把我急壞了,不知道有沒有小夥伴有和我一樣的困擾,我們在開發手機版網頁的時候,常常會出現下面的情景: (1) 開發時,在自己電腦上執行得好好的,在手機上開啟就掛了,但是手機上又看不到error log; (2) 上線後,某使用者表示頁面失靈,但我們自己又重現不出來,看不到使用者側的出錯資訊。 如果說(1)還可以通過電腦連線手機以檢視log來解決,那(2)在沒有完善的前端上報體系時就非常被動了。 作為開發者,我們的訴求很簡單:有沒有快捷的方法在手機前端頁面看到log日誌? 莫慌,今天小編給大家帶來了兩個除錯神器: - Eruda - vConsole ## Eruda ### Eruda介紹 Eruda 是一個專為前端移動端、移動端設計的除錯面板,類似Chrome DevTools 的迷你版(沒有chrome強大 這個是可以肯定的),其主要功能包括:捕獲 console 日誌、檢查元素狀態、顯示效能指標、捕獲XHR請求、顯示本地儲存和 Cookie資訊、瀏覽器特性檢測等等。 ![](https://img2020.cnblogs.com/blog/2050700/202009/2050700-20200919102732865-828834094.png) 通過這張圖,大家可以發現Eruda和瀏覽器的控制檯十分相似,可以說功能是相當的多了。雙手附上線上體驗地址: 請在手機上開啟連結:http://liriliri.github.io/eruda/index.html?eruda=true ### 各個面板功能 #### Console面板 該面板會替換console物件中的log,error,info,warn,dir,time,timeEnd方法以不同的樣式顯示出來,同時預設會通過onerror捕獲全域性錯誤(可以在設定面板關閉),打出錯誤資訊及其堆疊。當然,日誌的清除與過濾也是支援的,還可以直接在該面板輸入js指令碼並在全域性作用域下執行。該面板還內建了一些快捷指令來快速執行一些有用的功能,比如在頁面載入jQuery或underscore,使用正則表示式過濾log等。 #### Elements面板 檢視Dom狀態對於除錯工具自然是一個必不可少的功能。通過該工具,你無需連線PC端除錯工具就能輕鬆檢視DOM節點上的各個屬性值,內容,應用的CSS樣式。被檢視的元素也會在頁面上高亮,能夠使你快速知曉DOM元素的margin,padding。 #### Network面板 Network面板通過performance介面以圖表的形式展示頁面的載入速度。計劃在resource timing api得到廣泛應用時再加入各個資源的載入情況,不過目前它僅僅只能得到頁面的載入速度。 #### Resources面板 該面板主要用來展示localStorage,cookie,頁面指令碼,樣式,圖片等資源,同時能夠對其執行一些簡單的操作,如清除指定的localStorage條目。 #### Info面板 很多時候會需要檢視複製瀏覽器上的指定資訊,比如通過JsBridge獲取到的使用者Id,用於後臺資料查錯。又比如,測試碰到某些頁面錯誤時,我們首先做的一件事經常是:把連結發給我看看,然而APP裡並沒有複製連結的選項:( 還有,一個頁面在不同環境下需要有不同的表現,專案H5頁面經常需要在不同APP裡有不同表現以及呼叫不同jsApi。靠什麼來區分?UA。然而有時候對某個版本UA檢測不準確就會造成頁面出BUG,這時候如果有個方便的方法能夠快速檢視到出錯者的瀏覽器UA就太好了。 綜上,Info面板預設會展示出url和user-agent兩條資訊,你也可以通過呼叫它的介面輸出其它指定資訊。 #### Snippets面板 Console面板可以執行js指令碼,但在手機上輸入程式碼體驗實在不怎麼樣。利用該面板你可以新增一些方法以便於快速和多次觸發它。Sinppets預設加入了兩個指令碼,為頁面所有元素加border檢視排版結構以及重刷頁面。 #### Features面板 嗯,之前碰到過BUG,結果發現是APP的WebView沒開啟對localStorage的支援,所以有了該面板。它會檢測一些常用的功能是否被瀏覽器所支援,不支援的話將以紅色高亮進行顯示。 ### 使用方式 官方教程地址: https://github.com/liriliri/eruda/blob/master/doc/README_CN.md #### 原生使用 也可以使用cdn方式引入,這裡列舉了所有版本的js地址,可以隨意選擇一個版本複製引入。然後在頁面 裡面加入初始化程式碼。 示例程式碼如下: ``` ``` 為什麼要在head引入,這樣能儘量將你所有的的console都打印出來。 #### es6 webpack使用 示例程式碼如下: ``` npm install eruda --save 或者 cnpm install eruda --save 或者 yarn add eruda --save 然後在index.html頁面中載入指令碼: ``` JS 檔案對於移動端來說略重(gzip 後大概 100kb)。建議通過 url 引數來控制是否載入偵錯程式,比如: ``` ;(function () { var src = '//cdn.jsdelivr.net/npm/eruda'; if (!/eruda=true/.test(window.location) && localStorage.getItem('active-eruda') != 'true') return; document.write('
'); document.write('eruda.init();'); })(); ``` 初始化時可以傳入配置: - container: 用於外掛初始化的 Dom 元素,如果不設定,預設建立 div 作為容器直接置於 html 根結點下面。 - tool:指定要初始化哪些面板,預設載入所有。 ``` let el = document.createElement('div'); document.body.appendChild(el); eruda.init({ container: el, tool: ['console', 'elements'], useShadowDom: true }); ``` ## vConsole ### vConsole介紹 vConsole是一款由微信公眾平臺前端團隊打造的前端除錯面板,專治手機端看log難題。 雙手附上線上體驗地址: 請在手機上開啟連結:http://wechatfe.github.io/vconsole/demo.html 目前vConsole自帶有5個面板,預設為“日誌”面板,負責展示log。預設情況下,vConsole的面板是隱藏起來的。我們可以點選右下角的“面板”懸浮按鈕來顯示vConsole面板。 #### 日誌面板 ![](https://img2020.cnblogs.com/blog/2050700/202009/2050700-20200919103126849-1916026384.png) 第一個是日誌面板主要就是我們列印顯示的一些資料,細心的同學可能會發現上方的log控制檯上有四種類型的日誌。與電腦端的Developer Tools一樣,開發者可以通過呼叫不同的方法來打出不同的顏色,以便快速區分日誌型別: ``` console.log('foo'); // 白底黑字 console.info('bar'); // 白底紫字 console.warn('foo'); // 黃底黃字 console.error('bar'); // 紅底紅字 ``` #### “系統”面板 ![](https://img2020.cnblogs.com/blog/2050700/202009/2050700-20200919103736387-1454757427.png) 第二個是“系統”面板,vConsole會自動將一些基礎資訊(如系統版本)打印出來,方便開發者定位問題。若頁面是在微信內建瀏覽器中開啟的,vConsole還會打印出微信版本號、當前網路型別等額外資訊。 #### Network面板 ![](https://img2020.cnblogs.com/blog/2050700/202009/2050700-20200919104112222-329971957.png) 第三個是Network面板,所有 XMLHttpRequest 請求都會被顯示到 Network tab 中。 若不希望一個請求顯示在面板中,可新增屬性 _noVConsole = true 到 XHR 物件中: ``` var xhr = new XMLHttpRequest(); xhr._noVConsole = true; // 不會顯示到 tab 中 xhr.open("GET", 'http://example.com/'); xhr.send(); ``` #### Element面板 ![](https://img2020.cnblogs.com/blog/2050700/202009/2050700-20200919104220113-1797761727.png) 第四個是Element面板,可以檢視頁面的dom結構。 #### Storage面板 ![](https://img2020.cnblogs.com/blog/2050700/202009/2050700-20200919104324889-1196978584.png) 第五個是Storage面板,可以檢視本地儲存的資料,包括Cookies、localStorage及sessionStorage。 注意點: >
vconsole 這個外掛原始碼裡面是依賴 html dom api 來實現的,如果你所使用的的環境不支援 dom,與原有的瀏覽器核心有差異,可能無法使用。一般的 web-view 巢狀網頁是可以用的,或者手機瀏覽器都是OK的。如果是小程式或者第三方軟體解析html需要檢視一下原理。至於微信小程式為什麼有,因為別人就是內建的,自己寫適配了自己。 ### vConsole使用 官方教程地址: https://github.com/Tencent/vConsole/blob/dev/doc/tutorial_CN.md #### 原生使用 也可以使用cdn方式引入,這裡列舉了所有版本的js地址,可以隨意選擇一個版本複製引入。然後在頁面 裡面加入初始化程式碼。 示例程式碼如下: ``` ``` 為什麼要在head引入,這樣能儘量將你所有的的console都打印出來,vconsole原理是隻有 new 初始化的時候才會插入dom,並改寫監聽console方法。 #### es6 webpack使用 示例程式碼如下: ``` npm install vconsole 或者 cnpm install vconsole 或者 yarn add vconsole 然後設定個環境變數作為區分線上線下環境,比如: import VConsole from 'vconsole'; const isDebug = true; // 本地開發除錯注入vConsole if (isDebug) { new VConsole(); } ``` 引入模組後,vConsole會有一小段時間用於初始化工作,在渲染出面板HTML之前將無法立即列印log。因此,若要在引入模組後立即列印log,應使用vConsole.ready()方法: ``` vConsole.ready(function() { console.log('Hello World'); }); ``` > 手機前端開發除錯工具介紹到這裡就結束了。 ## 結語 工欲善其事必先利其器,希望這篇文章可以幫助到大家,如果喜歡小編的,歡迎大家關注小編的公眾號【猴哥說前端】。 參考: 1、Eruda 手機網頁前端除錯面板 https://www.oschina.net/p/eruda?hmsr=aladdin1e1 2、eruda官方教程 https://github.com/liriliri/eruda/blob/master/doc/README_CN.md 3、vConsole官方教程 https://github.com/Tencent/vConsole/blob/dev/doc/tutoria