使用重大問題擷取關鍵 CSS 並內嵌

Milica Mihajlija
Milica Mihajlija

,瞭解如何調查及移除這項存取權。

無論您使用的是 UI 程式庫,還是手動製作樣式,大量 CSS 的運作時間都會延遲,因為瀏覽器必須先下載及剖析 CSS 檔案,才能顯示網頁。

這個回應式冰淇淋藝廊使用 Bootstrap 打造而成。如 Bootstrap 等 UI 程式庫能加快開發速度,但這類程式庫通常會出現混亂且不必要的 CSS,進而降低載入時間。Bootstrap 4 為 187 KB,而另一個 UI 程式庫 Semantic UI 則高達 730 KB (未壓縮)。即使經過精簡和壓縮,Bootstrap 的大小仍會達到 20 KB,遠超過首次來回的 14 KB 門檻

「重要」工具可用於擷取、縮小及內嵌不需捲動位置的 CSS。如此即可盡快顯示不需捲動位置內容,即使網頁其他部分的 CSS 尚未載入亦然。在本程式碼研究室中,您將瞭解如何使用關鍵的 npm 模組。

測量

  • 如要預覽網站,請按下「查看應用程式」。然後按下 全螢幕 全螢幕

如要在這個網站上執行 Lighthouse 稽核,請按照下列步驟操作:

  1. 按下 Control+Shift+J 鍵 (或在 Mac 上為 Command+Option+J 鍵) 開啟開發人員工具。
  2. 按一下「Lighthouse」分頁標籤。
  3. 按一下「行動裝置」
  4. 勾選「效能」核取方塊。
  5. 取消勾選「稽核」部分的其他核取方塊。
  6. 點選「Simulated Fast 3G, 4x CPU Slowdown」
  7. 勾選「清除儲存空間」核取方塊。選取這個選項後,Lighthouse 不會從快取載入資源,從而模擬首次訪客的體驗。
  8. 按一下「執行稽核」

由 Lighthouse 提供支援的 Chrome 開發人員工具稽核面板

在電腦上執行稽核時,實際結果可能會有差異,但在幻燈片檢視畫面中,您會發現在最終轉譯內容之前,應用程式顯示一片空白畫面。這就是最初內容繪製 (FCP) 偏高的原因,以及整體成效分數不佳的原因。

Lighthouse 稽核顯示成效分數為 84、FCP 為 3 秒,以及應用程式載入過程的膠卷檢視畫面

Lighthouse 可協助您修正效能問題,建議前往「商機」專區尋找解決方案。排除禁止轉譯資源的商機會列為商機,而這也是關鍵之處!

Lighthouse 稽核「機會」部分列出「排除會妨礙顯示的資源」

最佳化

  • 按一下「Remix to Edit」,即可編輯專案。

為加快速度,系統已安裝 Critical 元素,且程式碼研究室中包含一個空白的設定檔。

在設定檔案 critical.js 中,新增 Critical 的參照,然後叫用 critical.generate() 函式。這個函式會接受包含設定的物件。

const critical = require('critical');

critical.generate({
    // configuration
},(err, output) => {
  if (err) {
    console.error(err);
  } else if (output) {
    console.log('Generated critical CSS');
  }
});

錯誤處理並非必要,但這是在控制台中評估作業成功與否的簡單方法。

設定 Critical

下表列出一些實用的重要選項。您可以在 GitHub 上查看所有可用選項

選項 類型 說明
base 字串 檔案的基本目錄。
src 字串 HTML 原始碼檔案。
dest 字串 輸出檔案的目標。如果 CSS 內嵌式輸出檔案為 HTML,如果不是,輸出會是 CSS 檔案。
widthheight 數字 可視區域的寬度和高度 (以像素為單位)。
dimensions 陣列 包含具有寬度和高度屬性的物件。這些物件代表您想以頂端 CSS 指定的視區。如果 CSS 中有媒體查詢,就能產生涵蓋多種可視區域大小的重要 CSS。
inline 布林值 如果設為 true,系統會在 HTML 來源檔案中內嵌產生的關鍵 CSS。
minify 布林值 如果設為 true,「重要」會減少產生的重要 CSS。擷取多個解析度的關鍵 CSS 時,可以省略這項參數,因為 Critical 會自動縮減 CSS,避免重複加入規則。

以下是針對多個解析度擷取必要 CSS 的設定範例。將其新增至 critical.js,或試著調整選項。

critical.generate({
  base: 'public/',
  src: './index.html',
  dest: './index.html',
  inline: true,
  dimensions: [
    {
      height: 500,
      width: 300,
    },
    {
      height: 720,
      width: 1280,
    },
  ]
}, (err, output) => {
  if (err) {
    console.error(err);
  } else if (output) {
    console.log('Generated critical CSS');
  }
});

在這個範例中,index.html 既是來源檔案也是目的地檔案,因為 inline 選項已設為 true。關鍵在於讀取 HTML 來源檔案、擷取重要的 CSS,然後以 <head> 中內嵌的重要 CSS 覆寫 index.html

dimensions 陣列指定了兩種可視區域大小:額外小螢幕為 300 x 500,標準筆電螢幕為 1280 x 720。

minify 選項已省略,因為 Critical 會在指定多個可視區域大小時,自動將擷取的 CSS 縮減。

執行重要執行個體

package.json 中的指令碼新增重要問題:

scripts: {
  "start": "node server.js",
  "critical": "node critical.js"
}
  1. 按一下「Terminal」(注意:如果沒有顯示「Terminal」按鈕,您可能需要使用「全螢幕」選項)。

如要產生必要 CSS,請在控制台中執行以下指令:

npm run critical
refresh
成功訊息顯示「Generate 重要 CSS」在控制台中查看
主控台中的成功訊息

現在,在 index.html<head> 標記中,產生的重要 CSS 會內嵌於 <style> 標記之間,接著是指令碼,可透過非同步方式載入 CSS 的其他部分。

內嵌重要 CSS 的 index.html
內嵌重要的 CSS

重新評估

請按照程式碼研究室開頭的步驟,再次執行 Lighthouse 效能審查。結果看起來會像這樣:

Lighthouse 稽核顯示效能分數為 100,FCP 為 0.9 秒,以及改善應用程式載入的膠卷檢視畫面