Lighthouse:提升網站速度

Sofia Emelianova
Sofia Emelianova

總覽

使用 Lighthouse 面板,對網站進行全面審查。並透過「Lighthouse」面板產生報表,取得自家網站的下列深入分析資料:

  • 成效
  • 無障礙設定
  • 最佳做法
  • 搜尋引擎最佳化 (SEO)

... 以及許多其他指標。

以下教學課程可協助您在 Chrome 開發人員工具中使用 Lighthouse

如要進一步瞭解 Lighthouse 可用來改善網站品質的其他方式,請參閱 Lighthouse 說明文件。

教學課程的目標

本教學課程將介紹如何使用 Chrome 開發人員工具,找出加快網站載入速度的方法。

請繼續閱讀,或觀看本教學課程的影片版本:

必要條件

您應具備基本的網路開發經驗,類似於這個網路開發入門課程所教的內容。

您無需瞭解載入效能。

簡介

我是 Tony。Tony 在貓咪圈中非常有名,他建立了網站,讓粉絲瞭解他最愛的食物。他的粉絲很喜歡這個網站,但 Tony 不斷聽到網站載入速度太慢的抱怨。Tony 請你協助他加快網站速度。

Tony 貓。

步驟 1:檢查網站

無論您想改善網站的載入效能,都應先進行稽核。這項稽核有兩個重要功能:

  • 會建立基準來協助您評估後續的變化。
  • 並提供實用訣竅,說明哪些變更最能帶來影響。

設定

首先,您需要為 Tony 的網站設定新的作業環境,以便日後進行變更:

  1. 在 Glitch 上重混網站專案。新專案會在新分頁中開啟。這個分頁將稱為「編輯器」分頁

    點選「Remix」後,原始來源和編輯器分頁。

    專案名稱會從「tony」變更為隨機產生的名稱。您現在擁有可編輯的程式碼副本。稍後您會修改這段程式碼。

  2. 在編輯器分頁的底部,依序點選「預覽」>「在新視窗中預覽」。示範內容會在新分頁中開啟。這個分頁將稱為「示範」分頁。網站可能需要一段時間才能載入。

    「Demo」分頁。

  3. 在示範旁邊開啟開發人員工具

    開發人員工具和示範。

建立基準

基準是指在您改善網站效能之前的網站成效記錄。

  1. 開啟 Lighthouse 面板。可能位於 更多面板後方。

    Lighthouse 面板。

  2. 請將 Lighthouse 報表的配置設定與螢幕截圖中的設定相符。以下是不同選項的說明:

    • 清除儲存空間。勾選這個核取方塊後,系統會在每次稽核前清除與該頁面相關聯的所有儲存空間。如果您想稽核首次造訪的使用者在網站上的體驗,請保留這項設定。如要提供重複造訪體驗,請停用這項設定。
    • 啟用 JS 取樣。這個選項預設為關閉。開啟後,這項功能會在效能追蹤記錄中加入詳細的 JavaScript 呼叫堆疊,但可能會減慢報表產生速度。產生「Lighthouse」報表後,您可以依序前往「Tools」選單 >「View Unthrotled Trace」
    • 模擬節流 (預設) 。這個選項會模擬行動裝置上瀏覽的一般情況。之所以稱為「模擬」,是因為 Lighthouse 在稽核程序中不會實際降低頻寬。而是根據行動裝置的條件推算網頁載入所需的時間。另一方面,開發人員工具節流 (進階) 設定實際上會限制 CPU 和網路,但代價是稽核程序會變得較長。
    • 依序前往「模式」> 「導覽 (預設)」。這個模式會分析單一網頁載入作業,這正是本教學課程所需的模式。詳情請參閱三種模式
    • 「裝置」>「行動裝置」。行動裝置選項會變更使用者代理程式字串,並模擬行動裝置檢視區。電腦版選項基本上只是停用行動版變更。
    • 點選「類別」>「成效」。啟用單一類別可讓 Lighthouse 只根據相應的稽核組合產生報告。如果想查看其他類別提供的推薦內容,可以保留這些類別。停用不相關的類別可稍微加快稽核程序。
  3. 按一下「分析網頁載入」。10 到 30 秒後,「Lighthouse」面板會顯示網站成效的報告。

    網站效能的 Lighthouse 報表。

處理報表錯誤

如果 Lighthouse 報表未顯示錯誤,請嘗試在沒有其他開啟的分頁的情況下,透過無痕式視窗執行示範分頁。這可確保您在清除狀態下執行 Chrome。Chrome 擴充功能尤其會對稽核程序造成乾擾。

發生錯誤的報表。

瞭解報表

報表頂端的數字是網站的整體成效分數。稍後,當您對程式碼進行變更時,這個數字應會上升。分數越高,成效越好。

整體成效分數。

指標

向下捲動至「Metrics」部分,然後按一下「Expand view」。如要查看指標的說明文件,請按一下「瞭解詳情...」

「指標」區段。

本節提供網站效能的量化評估資料。 每項指標都會針對成效的不同面向提供深入分析,例如,First Contentful Paint 會告訴您內容首次繪製到畫面中的時間,這是使用者對頁面載入感知的重要里程碑,而「互動所需時間」則是用來標示頁面顯示時間,足以處理使用者互動。

螢幕截圖

接下來是一系列螢幕截圖,顯示網頁載入時的樣貌。

載入期間網頁的螢幕截圖。

商機

接著是「商機」專區,提供有關如何改善這個網頁載入效能的具體提示。

「商機」區段。

點選商機即可瞭解詳情。

進一步瞭解文字壓縮機會。

按一下「進一步瞭解...」,即可查看說明文件,瞭解商機的重要性,以及如何修正商機的具體建議。

診斷

「診斷」專區會進一步說明影響頁面載入時間的因素。

診斷專區。

已通過稽核

「已通過的稽核項目」部分會顯示網站的正確做法。按一下即可展開該部分。

「通過的稽核」專區。

步驟 2:實驗

Lighthouse 報表的「商機」部分會提供改善網頁成效的訣竅。在本節中,您將對程式碼集實作建議變更,並在每次變更後稽核網站,以評估對網站速度的影響。

啟用文字壓縮

您的報告指出啟用文字壓縮是改善網頁效能的絕佳機會。

文字壓縮是指透過網路傳送文字前,先縮減 (或壓縮) 文字檔案大小。就像你可能會在傳送檔案時先壓縮資料夾,以縮減檔案大小。

啟用壓縮功能前,您可以透過下列幾種方式手動檢查文字資源是否已壓縮。

開啟「Network」面板,然後依序選取「Settings」>「「Use large request rows」

「Network」面板中的「Size」欄,顯示大型要求列。

每個「Size」儲存格都會顯示兩個值。最上層的值是已下載資源的大小。底部值是未壓縮資源的大小。如果兩個值相同,則資源在透過網路傳送時不會經過壓縮。在這個範例中,bundle.js 的頂端和底部值皆為 1.4 MB

您也可以檢查資源的 HTTP 標頭,確認是否有壓縮功能:

  1. 按一下「bundle.js」,然後開啟「Headers」分頁。

    「Headers」分頁。

  2. 在「回應標頭」部分搜尋 content-encoding 標頭。您應該不會看到一個,表示 bundle.js 並未經過壓縮。當資源經過壓縮時,這個標頭通常會設為 gzipdeflatebr。如需這些值的說明,請參閱「指令」。

說明就到此為止。該進行一些變更了!加入幾行程式碼即可啟用文字壓縮功能:

  1. 在「Editor」分頁中,開啟 server.js,然後新增下列兩行 (已加粗顯示):

    ...
    const fs = require('fs');
    const compression = require('compression');
    
    app.use(compression());
    app.use(express.static('build'));
    ...
    
  2. 請務必將 app.use(compression()) 放在 app.use(express.static('build')) 前方。

    編輯 server.js。

  3. 等待 Glitch 部署網站的新版本。左下角顯示開心的表情符號代表部署成功。

使用先前學習到的工作流程,手動檢查壓縮功能是否正常運作:

  1. 返回「Demo」分頁並重新載入網頁。

    bundle.js 等文字資源的「Size」欄現在應顯示兩個不同的值。bundle.js269 KB 上方值為透過網路傳送的檔案大小,最下方的 1.4 MB 值則是未壓縮的檔案大小。

    「Size」欄現在會顯示兩個不同的文字資源值。

  2. bundle.js 的「Response Headers」部分現在應包含 content-encoding: gzip 標頭。

    「Response Headers」部分現在包含 content-encoding 標頭。

再次在頁面上執行 Lighthouse 報表,評估文字壓縮對頁面載入效能的影響:

  1. 開啟「Lighthouse」面板,然後按一下頂端動作列的 加入訂單「執行稽核作業...」

    「Perform an audit」按鈕。

  2. 保留先前的設定,然後按一下「分析網頁載入時間」

    啟用文字壓縮功能後的 Lighthouse 報表。

太厲害了!看起來進展不錯。您的整體效能分數應該會提高,表示網站的速度變快了。

現實生活中的文字壓縮

大多數伺服器其實都做類似的簡單的修正來啟用壓縮功能!請直接搜尋 如何設定要用來壓縮文字的伺服器

調整圖片大小

新報表指出,正確調整圖片大小是另一個重大商機。

調整圖片大小有助於縮減圖片檔案大小,進而加快載入時間。如果使用者在行動裝置螢幕上查看寬度為 500 像素的圖片,那麼傳送寬度為 1500 像素的圖片就毫無意義。理想情況下,您最多可傳送 500 像素寬的圖片。

  1. 在報表中按一下「使用適當大小的圖片」,即可查看應調整哪些圖片大小。所有 4 張圖片都過大。

    「使用合適的圖片大小」商機的詳細資料

  2. 返回編輯器分頁,開啟 src/model.js

  3. const dir = 'small' 取代 const dir = 'big'。 這個目錄包含已調整大小的相同圖片副本。

  4. 再次檢查網頁,瞭解這項變更對載入效能有何影響。

    調整圖片大小後的 Lighthouse 報表。

這項變更似乎只會對整體成效分數產生輕微影響。不過,分數無法清楚顯示您為使用者節省了多少網路資料。舊相片的總大小約為 6.1 MB,現在則只有 633 KB。您可以前往「Network」面板底部的狀態列查看這項資訊。

調整圖片大小前後傳輸的資料量。

在真實環境中調整圖片大小

對於小型應用程式而言,這類一次性的調整大小作業可能就足夠了。但對於大型應用程式而言,這顯然是無法擴充的。以下列舉幾種管理大型應用程式圖片的策略:

  • 在建構程序期間調整圖片大小。
  • 在建構程序中為每張圖片建立多種大小,然後在程式碼中使用 srcset。在執行階段,瀏覽器會負責選擇最適合執行裝置的大小。請參閱相對大小的圖片
  • 使用圖片 CDN,讓您在要求圖片時,以動態方式調整圖片大小。
  • 至少請務必對每張圖片進行最佳化。這通常可以節省大量費用。最佳化是指透過特殊程式執行圖片,藉此縮減圖片檔案大小。如需更多提示,請參閱「Essential Image Optimization」。

排除會妨礙顯示的資源

最新的報告指出,目前最大的改善機會是排除會妨礙顯示的資源。

轉譯阻斷資源是外部 JavaScript 或 CSS 檔案,瀏覽器必須先下載、剖析及執行這類檔案,才能顯示網頁。目標是只執行必要的核心 CSS 和 JavaScript 程式碼,以便正確顯示網頁。

第一項工作是找出不需在網頁載入時執行的程式碼。

  1. 按一下「排除會妨礙顯示的資源」,即可查看會妨礙顯示的資源:lodash.jsjquery.js

    進一步瞭解「減少會妨礙顯示的資源」改善機會。

  2. 根據作業系統版本,請按下以下鍵開啟指令選單

    • 在 Mac 上,請按下 Command + Shift + P
    • 在 Windows、Linux 或 ChromeOS 中,按下 Control + Shift + P
  3. 開始輸入 Coverage,然後選取「顯示涵蓋範圍」

    從 Lighthouse 面板開啟指令選單。

    「涵蓋率」分頁會在側欄中開啟。

    「涵蓋範圍」分頁。

  4. 按一下「重新整理」。「涵蓋率」分頁概略說明 bundle.jsjquery.jslodash.js 中在網頁載入時會執行多少程式碼。

    涵蓋範圍報表。

    這個螢幕截圖顯示,jQuery 和 Lodash 檔案分別有 74% 和 30% 未使用。

  5. 按一下 jquery.js 資料列。開發人員工具會在「來源」面板中開啟檔案。如果程式碼旁邊有綠色長條,表示該程式碼已執行。如果程式碼旁有紅色長條,表示該程式碼未執行,且在網頁載入時並非必要。

    在「來源」面板中查看 jQuery 檔案。

  6. 捲動 jQuery 程式碼。部分「執行」的程式碼行其實只是註解。如要縮減這個檔案的大小,透過能夠移除註解的壓縮器執行此程式碼,是另一種縮減檔案大小的方式。

簡而言之,當您使用自己的程式碼時,「Coverage」分頁可協助您分析程式碼、逐行分析,並僅傳送載入網頁所需的程式碼。

是否需要 jquery.jslodash.js 檔案才能載入頁面?「Request Blocking」(要求封鎖) 分頁會顯示無法使用資源時會發生的情況。

  1. 按一下「Network」分頁,然後再次開啟「Command Menu」
  2. 開始輸入 blocking,然後選取「顯示要求封鎖功能」。系統會開啟「要求封鎖」分頁。

    「要求封鎖」分頁。

  3. 按一下 加入訂單「新增圖案」,在文字方塊中輸入 /libs/*,然後按下 Enter 鍵確認。

    新增模式,封鎖對「libs」目錄的所有要求。

  4. 重新載入頁面。jQuery 和 Lodash 要求以紅色標示,表示已遭到封鎖。網頁仍會載入並可供互動,因此這些資源似乎並非必要!

    「Network」面板顯示要求已遭封鎖。

  5. 按一下 。「移除所有模式」,即可刪除 /libs/* 封鎖模式。

一般而言,「Request Blocking」(要求封鎖) 分頁可用來模擬頁面在沒有可用的資源時的行為。

現在,請從程式碼中移除這些檔案的參照,然後再次稽核頁面:

  1. 返回編輯器分頁,開啟 template.html
  2. 刪除對應的 <script> 標記:

    <head>
        ...
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <script src="/libs/lodash.js"></script>
        <script src="/libs/jquery.js"></script>
        <title>Tony's Favorite Foods</title>
    </head>
    
  3. 等待網站重新建構並重新部署。

  4. 透過 Lighthouse 面板再次稽核網頁。整體分數應該又會有所提升。

    移除會妨礙顯示的資源後,Lighthouse 報表。

在實際情況下最佳化重要算繪路徑

「關鍵轉譯路徑」是指載入網頁時所需的程式碼。一般來說,您可以只在網頁載入期間傳送重要程式碼,然後延後載入所有其他內容,藉此加快網頁載入速度。

  • 您不太可能找到可立即移除的指令碼,但您可能會發現在網頁載入期間,許多指令碼不需要同時提出要求,改採非同步方式提出要求。請參閱「使用 async 或 defer」。
  • 如果您使用的是架構,請檢查該架構是否有正式版模式。這個模式可能會使用 樹狀圖抖動等功能,以便移除阻斷關鍵算繪作業的不必要程式碼。

減少主執行緒的工作

最新的報告顯示「商機」部分有幾項可節省的細節,但如果您向下捲動至「診斷」部分,會發現主要的瓶頸是主執行緒活動過多。

瀏覽器在顯示頁面所需的大部分工作 (例如剖析及執行 HTML、CSS 和 JavaScript) 時就是主要執行緒。

目標是使用「Performance」面板分析主要執行緒在網頁載入期間執行的工作,並找出延後或移除不必要工作的方法。

  1. 依序開啟「效能」>「。 擷取設定」,然後將「網路」設為「緩慢 3G」,並將「CPU」設為「6 倍減速」

    在「效能」面板中設定 CPU 和網路節流

    行動裝置的硬體限制通常比筆電或電腦還多,因此您可以透過這些設定,體驗使用效能較低的裝置載入網頁的情形。

  2. 按一下「重新整理」。開發人員工具會重新載入網頁,然後產生視覺化圖表,顯示載入網頁時所需執行的所有作業。這項圖表會稱為「追蹤記錄」

    效能面板的網頁載入追蹤記錄。

這項追蹤記錄會按照時間順序,由左至右顯示活動。頂端的 FPS、CPU 和 NET 圖表可讓您概略瞭解每秒影格數、CPU 活動和網路活動。

追蹤記錄的「總覽」部分。

「Overview」(總覽) 部分顯示的黃色牆表示 CPU 正忙於編寫指令碼活動。這樣一來,您或許就能減少 JavaScript 工作量,進而加快網頁載入速度。

請調查追蹤記錄,找出減少 JavaScript 工作量的方法:

  1. 按一下「時機」部分將其展開。

    「時間」專區。

    React 的「User Timing」有許多測量指標,似乎是 Tony 的應用程式正在使用 React 的開發模式。切換至 React 的正式版模式,可能會帶來一些簡單的效能優化。

  2. 再次按一下「時間」即可收合該部分。

  3. 瀏覽「Main」部分。本節會從左至右顯示主執行緒活動的時間順序記錄。y 軸 (由上至下) 會顯示事件發生的原因。

    「Main」部分。

    在這個範例中,Evaluate Script 事件會導致 (anonymous) 函式執行,進而導致 __webpack__require__ 執行,進而導致 ./src/index.jsx 執行,依此類推。

  4. 向下捲動至「Main」(主要) 部分底部。使用架構時,大多數的上層活動是由架構所造成,而架構通常是無法控制的。應用程式造成的活動通常位於底部。

    mineBitcoin 活動。

    在這個應用程式中,名為 App 的函式似乎會導致大量呼叫 mineBitcoin 函式。聽起來阿尼可能使用粉絲的裝置來採集加密貨幣...

  5. 開啟底部的「自下而上」分頁。這個分頁會列出耗費最多時間的活動。如果「Bottom-Up」部分沒有任何內容,請按一下「Main」部分的標籤。

    「由下往上」分頁。

    「由下而上」部分只會顯示目前所選活動或活動群組的相關資訊。舉例來說,如果您點選其中一個 mineBitcoin 活動,自下而上部分只會顯示該活動的資訊。

    「自我時間」欄會顯示直接花費在各項活動的時間。在本例中,約 82% 的主執行緒時間用於 mineBitcoin 函式。

接下來,我們要看看是否能透過使用正式版模式和減少 JavaScript 活動,加快網頁載入速度。從實際工作環境模式開始:

  1. 在「編輯器」分頁中開啟 webpack.config.js
  2. "mode":"development" 變更為 "mode":"production"
  3. 等待新的建構作業部署完畢。
  4. 再次檢查網頁。

    設定 webpack 以使用正式版模式後的 Lighthouse 報表。

移除對 mineBitcoin 的呼叫,減少 JavaScript 活動:

  1. 在「編輯器」分頁中開啟 src/App.jsx
  2. constructor 中將對 this.mineBitcoin(1500) 的呼叫註解掉。
  3. 等待新版本部署。
  4. 再次稽核網頁。

移除不必要的 JavaScript 工作後,Lighthouse 報表。

如常,您仍需採取一些行動,例如降低最大內容繪製累積版面配置轉移指標。

在實際情況中減少主執行緒的工作

一般來說,如要瞭解網站在載入時執行的動作,並尋找移除非必要活動的方法,最常見的方式就是「Performance」面板。

如果您偏好類似 console.log() 的做法,則可以使用 User Timing API 任意標記應用程式生命週期的特定階段,以便追蹤各個階段所需的時間。

摘要

  • 每次著手改善網站的載入效能時,請務必從稽核著手。這項稽核作業會建立基準,並提供改善訣竅。
  • 請一次進行一項變更,並在每次變更後稽核頁面,以便瞭解這項獨立變更對效能的影響。

後續步驟

在自家網站上執行稽核!如果您需要協助解讀報表,或想瞭解如何改善載入效能,請參閱以下所有方式,從開發人員工具社群尋求協助:

  • developer.chrome.com 存放區中回報此文件的錯誤。
  • Chromium 錯誤中,透過開發人員工具提交錯誤報告。
  • 郵寄清單中討論功能和異動。請勿使用郵寄清單發問。請改用 Stack Overflow。
  • 如需有關如何使用開發人員工具的一般說明,請前往 Stack Overflow。如要提報錯誤要求,請一律使用 Chromium Bugs。
  • 前往 @ChromeDevTools 透過推文與我們聯絡。