魯斯前端布魯斯前端

文章中英模式

常見的前端面試題目 - 頁面載入 - Utility First CSS 的好處

深入解析 Utility First CSS 的運作原理、對頁面載入速度的優化效果,以及實際應用場景,包含提升網站性能的關鍵知識及面試常見問題的完整解答。

影片縮圖

懶得看文章?那就來看影片吧

基本概念

Utility First CSS 是一種 CSS 設計方法,通過使用預定義的、單一用途的 CSS 類別來構建用戶界面。每個類別通常只負責一個特定的 CSS 屬性,讓開發者直接在 HTML 中組合這些類別,而不是寫自定義的 CSS 樣式。

最受歡迎的 Utility First CSS 框架當屬 Tailwind CSS,它提供了豐富的預設類別,可以快速構建現代網頁界面。

<!-- 傳統 CSS 方法 -->
<div class="profile-card">
  <img class="profile-image" src="avatar.jpg">
  <div class="profile-content">
    <h2 class="profile-name">布魯斯</h2>
    <p class="profile-bio">前端工程師</p>
  </div>
</div>

<!-- Utility First CSS 方法 (Tailwind) -->
<div class="bg-white rounded-lg shadow-md p-4">
  <img class="w-16 h-16 rounded-full" src="avatar.jpg">
  <div class="ml-4">
    <h2 class="text-xl font-bold text-gray-800">布魯斯</h2>
    <p class="text-gray-600">前端工程師</p>
  </div>
</div>

Utility First CSS 如何優化頁面載入速度

1. 減少 CSS 檔案大小

┌─────────────────────────────────────────────┐
│                                             │
│  傳統 CSS 方式                              │
│                                             │
│  開發中的 CSS: 85KB                         │
│  使用的 CSS: 僅 15KB (82% 未使用)           │
│                                             │
│  Utility First CSS 方式                     │
│                                             │
│  生產環境 CSS: 10KB (只包含使用的類別)       │
│  未使用 CSS: 幾乎為 0                        │
│                                             │
└─────────────────────────────────────────────┘
傳統 CSS 流程:
頁面 A --> 載入 header.css, home.css
頁面 B --> 載入 header.css, about.css  (重複下載 header.css)

Utility CSS 流程:
頁面 A --> 載入 tailwind.css
頁面 B --> 使用緩存的 tailwind.css  (無需重複下載)

2. 避免 CSS 阻塞渲染

頁面載入流程比較:

傳統 CSS:
1. 下載 HTML
2. 解析 HTML 發現多個 CSS 文件
3. 下載所有 CSS 文件  ⟸ 渲染阻塞
4. 解析所有 CSS
5. 渲染頁面

Utility First CSS:
1. 下載 HTML
2. 解析 HTML 發現單一 CSS 文件
3. 下載優化後的小型 CSS ⟸ 阻塞時間短
4. 快速解析簡單的 CSS
5. 更快開始渲染頁面

3. 減少網絡請求

// 分析不同 CSS 方法的網絡請求情況

// 傳統 CSS 方式 (多個請求)
// main.css, components.css, pages.css, etc.
網絡請求: 5CSS 文件
總下載量: 150KB
TTFB (Time to First Byte): 較慢 (多個請求排隊)

// Utility First CSS 方式 (單一請求)
// tailwind.min.css
網絡請求: 1CSS 文件
總下載量: 10KB
TTFB: 更快 (單一小型請求)

4. 範例:多組件共用一個 class

<!-- 傳統 CSS 方法 -->
<style>
  .component-a .width-2 { width: 2rem; }
  .component-b .width-2 { width: 2rem; }
</style>
<div class="component-a">
  <div class="width-2"></div>
</div>
<div class="component-b">
  <div class="width-2"></div>
</div>

<!-- Utility First CSS 方法 (Tailwind) -->
<div class="component-a">
  <div class="w-2"></div>
</div>
<div class="component-b">
  <div class="w-2"></div>
</div>

在這個範例中,Utility First CSS 只需定義一次 w-2 class,減少了重複的 CSS 定義,從而提高了性能。

潛在的缺點及解決方案

1. HTML 可能變得臃腫

<!-- 大量類別可能導致HTML難以閱讀 -->
<button class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded focus:outline-none focus:shadow-outline">
  登入
</button>

解決方案使用組件抽象化或利用框架的抽象機制

// React 組件抽象
function PrimaryButton({ children }) {
  return (
    <button className="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded focus:outline-none focus:shadow-outline">
      {children}
    </button>
  );
}

// 使用時簡潔明了
<PrimaryButton>登入</PrimaryButton>

2. 學習曲線

需要學習大量預定義類別名稱及其對應的效果。

🔥 常見面試題目

(一)Utility First CSS 和傳統 CSS 方法的主要區別是什麼?

解答:

特性傳統 CSSUtility First CSS
組織方式基於組件或頁面創建自定義類別,將樣式集中在 CSS 文件中使用預定義的原子類別,直接在 HTML 中組合應用
可維護性隨著專案增長,CSS 文件會變得複雜,出現重複樣式通過重用類別減少重複樣式,但 HTML 可能會變得冗長
性能通常產生較大的 CSS 文件,包含未使用的樣式生產環境下的 CSS 更小,只包含使用的類別
開發速度需要在 HTML 和 CSS 文件間切換,命名新類別直接在 HTML 中應用樣式,無需創建新 CSS
代碼範例
.btn {
  background: blue;
  color: white;
  padding: 8px 16px;
  border-radius: 4px;
}

<button class="btn">登入</button>
<button class="bg-blue-500 
  text-white py-2 px-4 
  rounded">
  登入
</button>

(二)使用 Utility First CSS 如何影響關鍵渲染路徑 (Critical Rendering Path)?

解答:

Utility First CSS 通過以下方式優化關鍵渲染路徑:

  1. 1. 減少 CSSOM 大小
    • 1. 更小的 CSS 文件 = 更快的 CSSOM 構建
    • 2. 更簡單的選擇器 = 更快的樣式計算
  2. 2. 簡化樣式計算
    • 1. 扁平的選擇器結構(通常只有單一類選擇器)
    • 2. 減少樣式層疊和特異性計算
  3. 3. 更高效的緩存
    • 1. 低 CSS 文件變更頻率,提高緩存命中率
    • 2. 單一 CSS 文件意味著更少的網絡請求
  4. 4. 與內聯關鍵 CSS 配合
    • 1. 僅內聯關鍵路徑上需要的 utility 類
    • 2. 其餘樣式可以異步加載,不阻塞渲染
關鍵渲染路徑比較:

傳統 CSS:
HTML → [複雜的 CSSOM 構建 (慢)] → 渲染樹 → 佈局 → 繪製

Utility First CSS:
HTML → [簡單的 CSSOM 構建 (快)] → 渲染樹 → 佈局 → 繪製