摘要:本文會介紹新增的代碼覆蓋率功能如何收集數據如何基于它收集的數據來改進應用的性能。動態分析是指在應用運行狀態下收集代碼執行數據的過程,換句話說,覆蓋率數據就是在代碼執行過程中通過標記收集到的。
共 1812 字,讀完需 3 分鐘。工欲善其事必先利其器,前端周刊本周起每周會加餐 1 篇工具技巧,里面輔以動圖,讓大家看完就能學會,并上手使用。本文會介紹 Chrome Canary 新增的代碼覆蓋率功能、如何收集數據、如何基于它收集的數據來改進 WEB 應用的性能。
Chrome Canary 開發者工具中本周新增了 Coverage 功能,該功能同時適用于 JS 和 CSS,并有望很快登陸 Chrome 正式版。
Coverage 顧名思義就是代碼覆蓋率的意思,本文會跟大家介紹 Coverage 功能是什么、如何收集數據、及如何基于它收集的數據來改進 WEB 應用的性能。
Coverage 功能使用動態分析(Dynamic Analysis)法來收集代碼運行時的覆蓋率,讓開發者能夠窺探他的代碼到底有多大比例在發光發熱。動態分析是指在應用運行狀態下收集代碼執行數據的過程,換句話說,覆蓋率數據就是在代碼執行過程中通過標記收集到的。
Coverage 工具怎么用?在探討 Coverage 工具帶來的好處之前,先快速看下如何使用它來收集覆蓋率數據:
1. 調起 Coverage 面板 2. 錄制 Coverage 數據與 Performance 面板類似,Coverage 面板左上角有 3 個按鈕,點擊錄制的時候會開始錄制,同時錄制按鈕變紅,再次點擊錄制按鈕會停止錄制并把錄制到的覆蓋率數據展示出來。此外,可以點擊中間的快捷按鈕,“刷新并開始錄制”,待頁面加載完之后停止錄制。
Coverage 工具要求我們手動錄制的原因是:動態分析過程需要監控每行代碼的執行情況,也就意味著錄制過程中執行的代碼要比原始的應用的代碼要多,因為動態分析過程需要對你的代碼進行某種變換才知道哪些行被執行了。
3. 查看 Coverage 數據如上圖所示,Coverage 錄制結果表格展示了錄制過程中加載的所有 JS 和 CSS 文件,以及每個文件的大小、運行時覆蓋率,匯總數據展示在頁面底部的狀態欄中(上面的截圖沒有展示)。單擊單個靜態資源能將其在 Sources 面板中打開,代碼行號的左邊用紅綠色的條來標識代碼是否在錄制過程中被執行到。
Coverage 數據有啥用?上面錄制的數據中,最大的文件是 vendor.js,其中 55% 的代碼都沒有執行過,約 80 KB,這已經相當于一張典型圖片的文件大小了。
如果某個文件覆蓋率低(即未使用代碼比例很高),通常意味著用戶加載了太多不必要的代碼(要么真的是無用代碼,要么是當前時點還沒執行到的代碼),有性能常識的同學不難推斷出,這會導致頁面的完全加載時間、或單頁應用的啟動時間變慢,在慢速網絡下的性能損耗會尤其明顯;此外,更多代碼的解析、編譯也就意味著更多的硬件資源消耗,在低端設備上也會存在明顯的性能問題。
在筆者看來,Coverage 數據至少能從下面 2 個方面指導我們進行 WEB 應用的優化:
除移死代碼以 Coverage 數據為參考,我們能了解頁面重無用代碼的比例到底有多大。現實世界中,很多工程師可能是在遺留代碼庫上工作,并且遺留代碼庫存在的時間還很長,那么很可能這個代碼庫中存在大量的無用代碼,但是誰也不敢刪除他們,因為 JS 這門語言的動態性,你不能粗暴的把哪些看起來“沒有被使用”的代碼直接刪掉,除非你很清楚所有的代碼執行路徑,很顯然這對于大型應用或者遺留代碼庫來說是不現實的。
怎么移除死代碼呢?我們可以依賴打包工具,比如 UglifyJS 在壓縮代碼時支持直接刪除死代碼的配置項。而 Webpack 2 中引入了 Tree Shaking 的特性,能夠自動把項目中沒有用到的代碼從打包中去掉,但是這種優化僅限于被 export 的代碼。總而言之,死代碼要盡可能想辦法去掉,Coverage 工具能提供一個判斷基準。
懶加載代碼如果能刪的死代碼都刪了,但是 Coverage 數據還是居高不下,那么你應該換個角度思考。就像前文所說,JS 是動態語言,可能部分代碼在頁面加載時并沒有用到,但是用戶后來的操作會觸發這些代碼的執行,為什么不讓這些代碼在需要的時候再加載呢?聰明的你可能已經想到了,這就是懶加載的技術。
使用 Webpack 打包且沒有對配置做特別調優的話,它默認會把所有依賴打包成一個巨大的文件,很容易出現首次加載覆蓋率很低的情況,在 Webpack 中實現懶加載可以參考 Code Splitting 和 bundle-loader,具體的配置細節這里不展開講。使用懶加載之后可以極大的減少頁面初次下載的代碼,從而提高性能。需要注意的是,懶加載優化需要在模塊數量和模塊大小之間把握一個平衡,否則過多的模塊懶加載反而對性能不利,因為每個 HTTP 請求也是有額外開銷的。
One More Thing本文作者王仕軍,商業轉載請聯系作者獲得授權,非商業轉載請注明出處。如果你覺得本文對你有幫助,請點贊!如果對文中的內容有任何疑問,歡迎留言討論。想知道我接下來會寫些什么?歡迎訂閱知乎專欄:《前端周刊:讓你在前端領域跟上時代的腳步》。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/82400.html
1、Chrome控制臺小技巧 打開和關閉抽屜式選項卡:按Esc鍵可打開和關閉 DevTools 的 Drawer(抽屜式選項卡) 在Drawer(抽屜式選項卡)中,你可以在 Console 控制臺中執行命令,查看動畫檢查器(Animations),配置網絡條件(network conditions)和渲染(rendering)設置,搜索(search)字符串和文件等 showImg(https...
1、Chrome控制臺小技巧 打開和關閉抽屜式選項卡:按Esc鍵可打開和關閉 DevTools 的 Drawer(抽屜式選項卡) 在Drawer(抽屜式選項卡)中,你可以在 Console 控制臺中執行命令,查看動畫檢查器(Animations),配置網絡條件(network conditions)和渲染(rendering)設置,搜索(search)字符串和文件等 showImg(https...
摘要:比如為對應在目錄下,新建文件,文件中的內容,與正常接口返回格式相同,對象或者數組類型,從而覆蓋掉原接口請求。在中提及發布,增強用戶體驗,不過延期了, 使用chrome 作為本地網絡服務 chrome 65+ 新功能, 使用我們自己的本地資源覆蓋網頁所使用的資源,可以使用本地css文件覆蓋網頁的css文件,修改樣式。 類似的,使用DevTools的工作區設置持久化,將本地的文件夾映射到網...
摘要:比如為對應在目錄下,新建文件,文件中的內容,與正常接口返回格式相同,對象或者數組類型,從而覆蓋掉原接口請求。在中提及發布,增強用戶體驗,不過延期了, 使用chrome 作為本地網絡服務 chrome 65+ 新功能, 使用我們自己的本地資源覆蓋網頁所使用的資源,可以使用本地css文件覆蓋網頁的css文件,修改樣式。 類似的,使用DevTools的工作區設置持久化,將本地的文件夾映射到網...
閱讀 2376·2021-09-22 15:15
閱讀 640·2021-09-02 15:11
閱讀 1784·2021-08-30 09:48
閱讀 1884·2019-08-30 15:56
閱讀 1480·2019-08-30 15:52
閱讀 2042·2019-08-30 15:44
閱讀 431·2019-08-29 16:29
閱讀 1538·2019-08-29 11:06