- 原文地址:How to debug front-end: optimising network assets
- 原文做者:Michał Witkowski
- 譯文出自:掘金翻譯計劃
- 本文永久連接:github.com/xitu/gold-m…
- 譯者:stormluke
- 校對者:Starrier、allenlongbaobao
網絡性能能夠決定 web app 的成敗。最初 app 很新很小時,不多有開發者會持續關注 app 到底用了多長時間發送了多少兆字節給用戶。css
若是你從未測量過本身 app 的性能,那極可能會有一些改進餘地。問題是,你須要改善多少才能讓用戶注意到。html
在下面的研究中,你能夠找到有關多長的加載時間差別能夠被人們明顯地感覺到的信息。若是你想讓用戶注意到你的努力,那就要超過 20% 這個門檻。閱讀更多前端
這篇文章中,我會介紹(TL;DR):android
若是你正在努力解決這以外的一些問題,請在評論告訴所咱們 —— 咱們的團隊和讀者們很樂意提供幫助。webpack
這篇文章是《如何調試前端》系列的一部分:ios
因爲整篇文章都是關於 Chrome Devtools 的,咱們就先從 Audit 標籤頁開始(其自己使用了 Lighthouse)git
打開 Chrome Devtools > Audits > Perform an audit... > Run auditgithub
我決定檢查性能(Performance)和最佳實踐(Best practices),但咱們此次暫不涉及漸進式 Web 應用(Progressive Web App)或無障礙性(Accessibility)主題。web
不錯。一段時間後,咱們完成了性能評估,並知道了一些改進這些性能指標的可行方法。若是 Audit 把屏幕分辨率調成了「移動設備」,請沒必要擔憂,由於對於 Chrome 來講這是正常的。我強烈建議你用 Chrome 金絲雀版(Canary)來執行評估。金絲雀版有個能夠評估桌面版網頁的選項,而且增長了網絡限速功能 —— 看看下面的圖片。npm
指標(Metrics)選項卡收集了基本的測量結果,而且提供了頁面加載時間的整體概況。
首次有意義繪圖(First meaningful paint)
—— audit 肯定用戶首次看到主要內容所需的時間。請儘量保持在 1 秒如下。閱讀更多
首次可交互(First interactive)
—— 指首次用戶看到可交互 UI 元素而且頁面能夠響應所需的時間。
感知速度指數(Perceptual Speed Index)
—— 指顯示頁面可見部分的平均時間。它以毫秒錶示並取決於視口的大小。請儘可能保持在 1250 毫秒如下。閱讀更多
預估輸入延遲(Estimated Input Latency)
—— 應用響應用戶輸入的時間,以毫秒爲單位。
改進點(Opportunities)
—— 是一個更詳細的部分,收集了有關圖片、CSS 和響應時間的信息。我會介紹每一個項目,並加上一些如何加速的小提示。
CSS 文件被視爲渲染阻塞資源。意味着瀏覽器會等待它們徹底加載完畢,以後纔開始渲染。最簡單的方法就是不加載沒必要要的 CSS 文件。若是你使用 bootstrap,也許你不須要整個庫來樣式化你的頁面 —— 尤爲是在項目剛開始時。
其次,你能夠考慮針對不一樣屏幕尺寸進行優化。要下降加載 CSS 的數量級,可使用條件加載,它只加載特定屏幕分辨率所需的 CSS 文件。下面有個例子。
<link href="other.css" rel="stylesheet" media="(min-width: 40em)">
<link href="print.css" rel="stylesheet" media="print">
複製代碼
若是對你來講還不夠,Keith Clark 提出了一個不阻塞頁面渲染的加載 CSS 的好主意。訣竅是對媒體查詢(media query)使用帶有無效值的連接元素。當媒體查詢結果爲 false 時,瀏覽器仍然會下載樣式表,但不會延遲渲染頁面。您能夠將剩餘的沒必要要的 CSS 分離出來並稍後下載。閱讀更多
雖然這部分多是不言自明的,但仍值得咱們提醒本身它的做用。爲了減小服務器響應時間,你能夠考慮爲某些資源使用 CDN。也能夠採用 HTTP2,或簡單地刪除沒必要要的請求,並在渲染頁面後延遲加載它們。
這三部分都與一個主題緊密相關 —— 圖片。要準確瞭解你正在加載哪些圖片以及它們所佔的時間比重,請進入 Chrome Devtools 的網絡選項卡並經過 IMG 選項進行過濾。經過查看大小和時間這兩行,看看你是否滿意這些結果。關於每一個圖片的大小比重並無通常性的規則。這很大程度上取決於你的客戶端設備、客戶端羣以及更多隻有你本身才瞭解的狀況。
我想在這裏更多地談談圖片優化。在 Audit 結果中這個主題屢次出現。
圖片光柵圖和矢量圖。光柵圖由像素組成。咱們一般將它們用於照片和複雜的動畫。擴展名:jpg、jpeg、gif。
矢量圖由幾何圖像組成。咱們將它們用於徽標和圖標,由於它們能夠隨意縮放不失真。擴展名:svg。
SVG 從一開始就相對較小,但用這些優化器可使它更小。
這裏有點棘手,由於光柵圖像可能很是大。有幾種技術可使它們保持較大的分辨率但仍有較小的文件大小。
首先準備多個版本的圖像。你並不想在手機上加載視網膜級大小的圖像,對嗎?嘗試製做 3 到 4 個版本的圖片。手機版、平板版、桌面版和視網膜版。它們的大小取決於你的目標設備。若是你有任何疑問,請查看連接中的標準查詢。
當你的圖像準備好後,src 屬性有助於定義什麼時候加載哪些圖像。
<img src="ing.jpg" srcset="img.jpg, img2x.jpg 2x" alt="img">
複製代碼
src
給不支持 srcset
的瀏覽器用 srcset
給支持的瀏覽器用 img2x.jpg
給像素縮放比爲 2.0 的設備用(視網膜)
<img src="img.jpg" srcset="img1024.jpg 1024w, img2048.jpg 2048w" alt="img">
複製代碼
src
給不支持 srcset
的瀏覽器用 srcset
給支持的瀏覽器用 img1024
給寬度爲 1024 時使用,等等.
上面的例子來自於 Developer Mozilla
你還能夠建立上面提到過的媒體查詢和樣式,例如平板或手機。這種方法與 CSS 預處理器同時使用時特別有效。
srcset 屬性的替代品是媒體查詢,它的規則不在 HTML 中,而是在 CSS 文件裏。對於純 CSS,這種方法很是耗時,不值得花時間去作。但在這裏,預處理器能夠經過混入(mixins)和變量來解決問題。有了預處理器後,媒體查詢與 srcset 不相上下。決定權在你。
@desktop: ~"only screen and (min-width: 960px) and (max-width: 1199px)";
@tablet: ~"only screen and (min-width: 720px) and (max-width: 959px)";
@media @desktop {
footer {
width: 940px;
}
}
@media @tablet {
footer {
width: 768px;
}
}
複製代碼
當照片準備好並優化後,你還能夠優化分發的過程。像 Cloudinary 這樣的工具能夠顯着減小響應延遲。他們的服務器遍及全球,所以分發速度會更快。使用 HTTP 時,對於一個服務器你只能開啓 6 個並行請求。使用 CDN 後,並行請求數量會隨着服務器數量成倍增加。
有時候,圖片必須很花哨且很大。若是你爲長時間的延遲而困擾,能夠試試圖片模糊化或延遲加載。
延遲加載是一種在須要時纔開始加載圖片或其餘任何內容的方法。當圖庫中有 1000 個圖片時,並不是全部圖片都須要加載。只需加載前 10 個,其他的等用戶須要時再加載。
有大量的庫能夠作到這點。閱讀更多
Facebook 目前正在使用圖片模糊化。當你在網絡很差的狀況下打開某人的資料頁時,剛開始圖片是模糊的;後來它才變得清晰。閱讀更多
診斷頁(Diagnostics)結束了這一系列測試。我不會詳細介紹列表裏的每個標題,由於其中一些主題已經介紹過了。我只會說起其中的一些,並試圖在總體上涵蓋這些主題。
Goole 很注重緩存和無服務器應用。緩存徹底取決於你,我不是緩存的忠實擁護者。若是你想了解更多緩存的東西,Google 準備了一些不錯的課程。閱讀更多
關鍵請求鏈(Critical request chains)包含了須要在頁面渲染前就完成的請求。保持它儘量小相當重要。
咱們以前提到了 CSS 加載,如今咱們來討論一下 Web 字體。
在建立 web 應用/網站時,目前咱們使用四種字體格式:EOT、TTF、WOFF、WOFF2。
沒有一種格式是最合適的,所以咱們須要再次針對不一樣的瀏覽器使用不一樣的格式。這個主題的入門教程和更多解釋在這裏。閱讀更多 不過在剛開始時,最好問問本身是否真的須要使用一個 web 字體。這裏有一篇關於它的很是好的文章。
字體是形狀和路徑描述的集合,用於建立字母。每一個字母都是不一樣的,但幸運的是他們有不少共同點,因此咱們能夠稍微壓縮一下。
因爲 EOT 和 TTF 格式默認未壓縮,請確保你的服務器配置了使用 GZIP。
WOFF 內置了壓縮功能。請在你的服務器上使用最佳壓縮設置。
WOFF2具備自定義預處理。閱讀更多
你是否只使用英文?請記住:不須要在字體中添加阿拉伯文或希臘文字母。你也可使用 unicode 代碼點。這使得瀏覽器能夠將較大的 Unicode 字體拆分紅較小的子集。閱讀更多
加載字體會阻塞頁面渲染,由於瀏覽器須要使用其中的全部字體來構建 DOM。字體加載策略能夠防止加載延遲。字體顯示(fonts-display)是策略之一,在 CSS 屬性中。閱讀更多
如今,隨着 ES6 愈來愈重要,咱們普遍使用 webpack 和 gulp。在使用庫,務必記住,你並不老是須要整個庫。若是你不須要引入整個 lodash,只需引入一個函數。
import _ from 'lodash '
—— 會把整個 lodash 庫加到包中
import {map} from 'lodash'
—— 也會把整個 lodash 庫加到包中,你可使用 lodash-webpack-plugin、babel-plugin-lodash 這些插件
import map from 'lodash/map'
—— 只會把 map 模塊加入包中
仔細查看框架中的 ES6 函數和你本身的函數。你不須要爲每一個功能都引入一個新庫。要檢查你的包是如何構建的,請使用下面連接中的工具。
固然有更多的工具來衡量你網站的性能。
其中一個是 tools.pingdom.com,它或多或少地爲你提供與 Audits + Network 選項卡類似的信息。
我同時也推薦安裝 PageSpeed Insights 這個 Chrome 擴展。它直接向你顯示哪一個圖片須要更小點。
本文試圖向你展現如何經過減小資源的大小來使你的網站更輕盈。這只是提升網站性能的第一步。畢竟,這個領域十分普遍,並隨着現代前端的發展而變化。請關注這個話題和你的競爭對手。儘可能提早一步。
掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 Android、iOS、前端、後端、區塊鏈、產品、設計、人工智能等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃、官方微博、知乎專欄。