欸,最近在想一個東西... 關鍵 CSS
嗯...最近在看一個東西,叫做「關鍵 CSS」(Critical CSS)。 聽起來很技術,但其實概念蠻簡單的。你想想,開網頁的時候,是不是很討厭看到一片空白、等很久?
關鍵 CSS 就是為了解決這個問題。簡單說,就是先把使用者第一眼會看到的畫面(也就是「首屏」或 "above-the-fold")需要的樣式(CSS)抓出來,直接塞進網頁的 HTML 裡。 這樣瀏覽器一拿到 HTML,就能馬上畫出上半部的樣子,使用者會感覺「哇,好快!」,剩下的東西再慢慢載入就好。 這對使用者體驗跟 SEO 都蠻重要的,特別是 Google 一直在講的 Core Web Vitals(核心網路生命體徵)。
先說結論:為什麼這東西重要?
一句話:它可以直接改善 LCP(最大內容繪製),這是 Core Web Vitals 的一個核心指標,會影響你的 SEO 排名。 頁面感覺變快,使用者比較不會跳走,Google 也會給你比較好的分數。 算是一舉兩得吧。🤔
實際上是怎麼做的?
概念不難,但實作起來有點瑣碎。大致上就是三個步驟:
- 找出關鍵 CSS:你要先確定哪些 CSS 是渲染首屏內容「絕對必要」的。這通常包括 header、導覽列、主視覺或標題的樣式。
- 內嵌到 HTML:把找出來的這些 CSS,直接用
標籤包起來,放在 HTML 的裡面。 這樣瀏覽器就不用再另外發一個請求去要 CSS 檔案。 - 非同步載入剩下的 CSS:至於那些不那麼緊急的 CSS(例如頁尾、彈出視窗、或是要往下捲動才看得到的內容),就讓它們晚點再載入,而且不要擋到頁面渲染。 常見的作法是用
這種小技巧。
這個流程...老實說,手動做很痛苦。所以現在大部分都是用自動化工具來處理了。
手動 vs. 自動化工具,哪個好?
這就要看你的專案規模跟龜毛程度了。我自己是覺得...能自動就自動吧,時間很寶貴的。😅
| 方法 | 優點 | 缺點 |
|---|---|---|
| 手動整理 | 控制力最強,可以做到最極致的優化,每一行 CSS 都是你親手挑的。 | 超花時間...而且網站一改版就要重做一次。很容易出錯或漏掉。 |
| 自動化工具 | 速度快,整合到開發流程裡就可以不管它了。 有很多現成的工具可以用,比如 `critical` 這個 npm 套件。 | 有時候工具會判斷錯誤,可能會把太多或太少的 CSS 抓進來。 需要再手動檢查、微調一下設定。 |
會不會有什麼問題?要注意的點
當然有。這不是什麼萬靈丹,沒弄好反而會更糟。我覺得有幾個坑要特別注意:
- 關鍵 CSS 不能太大:Google 的 web.dev 文件有建議,最好把內嵌的 CSS 控制在 14KB 以下(壓縮後)。 如果太大,反而會拖慢 HTML 本身的下載,那就本末倒置了。
- 小心 FOUC (Flash of Unstyled Content):這是一個很經典的問題,就是「閃爍的未樣式化內容」。 如果你的關鍵 CSS 沒抓完整,使用者可能會先看到一瞬間的「裸奔」HTML,然後樣式才套上去。很醜,體驗很差。
- 維護的成本:就像前面說的,網站的樣式會一直變。你必須確保每次部署前,關鍵 CSS 都是最新的。 如果你用的是自動化工具,這點會比較輕鬆。
- 不同裝置的差異:桌機跟手機的首屏範圍不一樣大。 所以最理想的狀況,是要針對不同的 viewport 產生不同的關鍵 CSS。有些工具(像是 `critical`)可以設定 `dimensions` 參數來處理這個問題。
跟我們在台灣看到的狀況有什麼不同?
我看了 Google 官方的 web.dev 指南,他們比較強調原理跟最佳實踐,像是 14KB 的建議大小,還有跟 Core Web Vitals 的連結。 而在台灣的一些技術部落格或論壇(像 CSDN 或一些 SEO 公司分享),大家更關心「具體怎麼做」。 比如會有很多 WordPress 外掛的推薦,或是直接給出程式碼範例教你怎麼延遲載入 CSS。
這也蠻合理的,國外的官方文件重觀念,在地的開發者社群重實作。我覺得兩邊都要看,先從 web.dev 建立正確的觀念,再去參考本地的案例,看看別人是怎麼在 WordPress 或其他平台上解決 LCP 問題的。 像是有些台灣的分享會特別提到圖片優化對 LCP 的影響,這點也很重要。
所以,到底要不要用?
嗯...我的想法是,如果你的網站很在意效能,特別是 LCP 分數一直不好看,那絕對值得花時間研究一下。 對於內容網站、電商網站來說,幾秒的延遲可能就流失一個客戶了。
但如果你的網站很單純,或者你覺得目前的載入速度還能接受,那也不用為了做而做。 畢竟這東西還是有維護成本的。 先用 PageSpeed Insights 之類的工具跑分看看,如果報告建議你「排除禁止轉譯的資源」,那通常就是指這個了。
好了,大概就是這樣。不知道你們有沒有玩過這個?用的是什麼工具?可以在下面留言分享一下經驗。👇
