生產環境中的可變字型:沒有人告訴你的取捨
可變字型可以簡化你的字型堆疊並提升設計彈性,但它們不會自動帶來效能收益。
目錄
- 可變字型不是神奇的字型壓縮
- 顯而易見的優點:更少檔案、更有表現力的字體
- 第一個隱藏取捨:一個檔案可能比你實際需要的檔案更大
- 案例 A:使用多種字重的行銷網站
- 案例 B:只使用 regular 與 bold 的產品應用程式
- 第二個取捨:子集化變得更重要,而不是更不重要
- 第三個取捨:CSS 可能變得太聰明
- 第四個取捨:算繪差異仍然存在
- 第五個取捨:快取可能有利也可能不利
- 第六個取捨:Lighthouse 不會解釋完整故事
- 實用的生產環境檢查清單
- 1. 它取代了哪些靜態檔案?
- 2. 你會暴露哪些軸線?
- 3. 你能安全地子集化嗎?
- 4. 後備 metrics 是否已設定?
- 5. `font-display` 是否有意識地設定?
- 6. 你測試過低階裝置嗎?
- 7. 是否有回復計畫?
- 何時可變字型是好的生產環境選擇
- 生產環境的經驗法則
可變字型不是神奇的字型壓縮
可變字型經常被介紹成網頁排版的俐落解法:一個檔案、多種字重、更少請求、更順暢的設計系統。這個說法大方向正確,但並不完整。
在生產環境中,可變字型不像是用一個檔案取代六個檔案,比較像是導入一套新的排版執行環境。你會取得對字重、寬度、傾斜、光學尺寸,甚至有時是自訂軸線的表現控制權。同時,你也會承接關於檔案大小、瀏覽器算繪、後備行為、設計治理與效能量測的新決策。
結果可能非常出色。也可能比它所取代的靜態設定更糟。
如果你目前的網站送出同一字族的五種字重,經過良好子集化的可變字型可能會減少請求並簡化 CSS。如果你的網站只送出一個 regular 字重與一個 bold 字重,可變字型可能會為了使用者永遠用不到的彈性而增加位元組。這就是大家常常略過的生產環境取捨。
若想建立更完整的字型載入策略基礎,我們關於為什麼 web fonts are still the easiest performance win on most sites 的指南會是有用的延伸閱讀。可變字型不會改變基本原則:送出更少位元組、降低算繪延遲,並讓後備文字可以被接受。
顯而易見的優點:更少檔案、更有表現力的字體
傳統的靜態字型設定通常長這樣:
- Regular 400
- Italic 400
- Medium 500
- Semibold 600
- Bold 700
- 也許還有一個獨立的 display 字體
每個檔案都會被獨立下載、快取與算繪。如果頁面在首屏使用多種字重,請求很快就會堆疊起來。
可變字型可以把其中幾種字重收斂成一個檔案。你不再載入 Inter-Regular.woff2、Inter-Medium.woff2 與 Inter-Bold.woff2,而是載入一個可變字型檔案,並在連續範圍內使用 font-weight: 400 700。
這會解鎖真正的好處:
- 需要管理的字型檔案更少
- 字重之間的插值更一致
- 更細緻的響應式排版
- 更容易建立主題系統
- 更好的 design token 對齊
對設計系統來說,這種控制尤其有用。按鈕標籤可以使用 580,而不必被迫落在 500 或 600。狹窄卡片標題可以在字型支援時使用稍微壓縮的寬度軸。Display headline 可以在可用時使用光學尺寸。
但這些控制存在,並不代表你應該全部使用。
第一個隱藏取捨:一個檔案可能比你實際需要的檔案更大
可變字型包含設計空間的插值資料。這個設計空間是有成本的。單一可變字型檔案可能比一兩個靜態字型檔案更大。
當它取代許多檔案時,這不是問題。當它取代的是一套克制的字型堆疊時,這就是問題。
請看兩個常見情境:
案例 A:使用多種字重的行銷網站
網站在各頁面使用 300、400、500、600、700 與 italics。經過仔細子集化的可變字型很可能有幫助。它會降低請求開銷,並簡化未來維護。
案例 B:只使用 regular 與 bold 的產品應用程式
介面使用 400 與 700,並以系統字型作為後備。可變字型可能會增加不必要的位元組。這種彈性在 Figma 裡很美好,但在瀏覽器中不一定有用。
錯誤在於拿「一個可變字型檔案」去比較「許多理論上的靜態檔案」,而不是拿它去比較你的真實頁面目前實際使用的檔案。
量測關鍵版型實際載入的字型位元組。然後用相同的字元子集與相同的 preload 策略測試可變字型版本。不要假設可變字型版本一定會贏。
第二個取捨:子集化變得更重要,而不是更不重要
可變字型讓子集化更有價值,因為基礎檔案可能包含大量內容:字形、語言支援、OpenType 功能、多個軸線與 metadata。
多數生產網站不需要字型中的每個字形。如果你只提供英文內容,可能不需要完整的泛歐覆蓋、西里爾文、希臘文、越南文與每個符號區塊。如果你確實提供多語內容,也可能仍然會想使用語言特定子集,而不是一個通用檔案。
實務做法通常是:
- 為多數使用者保留核心 Latin 子集。
- 只在內容需要時加入延伸子集。
- 使用
unicode-range讓瀏覽器選擇正確檔案。 - 如有需要,為少見文字系統保留靜態後備。
這也是可變字型可能變得棘手的地方。有些字型流程可以輕鬆子集化靜態字型,卻會錯誤處理可變軸、hinting 或 metadata。務必確認輸出的字型在你計畫使用的整個軸線範圍內仍能正確運作。
壞掉的子集比大型字型更糟。它會安靜地失敗:奇怪的算繪、缺少字形、不一致的字重,或只在特定語系中出現的版面變化。
第三個取捨:CSS 可能變得太聰明
可變字型透過 CSS 暴露軸線。字重與寬度等標準軸可以乾淨地對應到 font-weight 與 font-stretch 這類屬性。自訂軸通常使用 font-variation-settings。
這種能力會誘惑團隊變得太聰明:
.card-title {
font-variation-settings: "wght" 623, "wdth" 92;
}
這在技術上可能有效,但很少是好的設計系統介面。任意軸線值散落在 CSS 中,難以審查、難以重構,也很容易誤用。
優先使用 design token 或具名 utility:
:root {
--font-weight-body: 400;
--font-weight-heading: 680;
--font-width-compact: 94;
}
.card-title {
font-weight: var(--font-weight-heading);
font-stretch: var(--font-width-compact);
}
盡可能使用標準 CSS 屬性。將 font-variation-settings 保留給沒有較高階屬性的軸線。
也要小心動畫。為字重或寬度做動畫,在少量使用時可以很有品味,但也可能造成 reflow、視覺不穩定,以及在低功耗裝置上產生不必要的工作。不要只因為字型允許,就讓排版變成動態效果遊樂場。
第四個取捨:算繪差異仍然存在
現代瀏覽器對可變字型的支援已經很強,但算繪並非到處都一樣。作業系統文字光柵化器、瀏覽器引擎、反鋸齒與字型 hinting 都會影響結果。
同一字族中,可變字型的 500 字重不一定看起來完全像靜態 500 檔案。在某些字族裡,靜態實例經過手動調校,而插值產生的可變實例是以數學方式生成。在小尺寸下,這種差異可能很重要。
這對內文、導覽、密集表格與 UI 標籤尤其相關。你的介面文字越多,就越應該測試真實閱讀情境,而不只是測試 hero typography。
如果你在轉向可變字型時也重新檢視文字系統,請從可讀性而不是新奇感出發。我們的 practical guide to readable type on the modern web 涵蓋了不華麗但通常更重要的選擇——行長、尺寸、對比、間距——它們往往比擁有 1,000 種可用字重更關鍵。
第五個取捨:快取可能有利也可能不利
單一可變字型檔案可以被快取一次,並在多個頁面重複使用。這很好。
但如果檔案很大且阻塞算繪,首次造訪就必須先支付完整成本。靜態字型有時可以更有選擇性地載入:先載入內文 regular、稍後載入 bold,只在需要的頁面載入 display。
沒有通用答案。正確設定取決於流量模式:
- 使用者每個工作階段會瀏覽許多頁面嗎?共享可變字型檔案可能划算。
- 使用者會停在一篇文章後離開嗎?較小的靜態檔案可能更好。
- 首頁只需要一種字重嗎?不要為未來頁面 preload 大型設計空間。
- 應用程式在登入後使用,且有頻繁重訪嗎?快取重用會變得更有價值。
Preload 也需要克制。Preload 首屏文字所需的字型,而不是每個可能的字型。Preload 是一種優先權宣告。太多優先權宣告會變成雜訊。
第六個取捨:Lighthouse 不會解釋完整故事
效能工具可以顯示未使用的字型位元組、阻塞算繪的請求、版面位移與網路成本。它們無法告訴你視覺彈性是否值得這些 payload。
可變字型遷移應該用多個訊號判斷:
- 首次檢視的總傳輸字型位元組
- 字型請求數量
- 對 Largest Contentful Paint 的影響
- 字型交換造成的 Cumulative Layout Shift
- 重複檢視的快取行為
- 與已核准設計的視覺匹配
- 常見尺寸下的可讀性
如果字型遷移後報告變紅,不要驚慌。問題可能是 preload 順序、後備字型 metrics,或子集不匹配,而不是可變字型本身。我們關於 how to read a Lighthouse report without panicking 的指南在這裡很相關:把實驗室分數視為診斷線索,而不是判決。
實用的生產環境檢查清單
在發布可變字型前,請回答這些問題:
1. 它取代了哪些靜態檔案?
列出生產環境實際使用的檔案,而不是設計系統理論上支援的內容。包含字重、樣式、字元集與頁面版型。
2. 你會暴露哪些軸線?
多數團隊應該暴露字重,也許還有寬度,很少需要更多。若字型良好支援光學尺寸,它可能很有用,但要測試。自訂軸應該有明確的產品目的。
3. 你能安全地子集化嗎?
子集化後執行視覺回歸檢查。測試重音字元、標點、貨幣符號、包含在內的圖示,以及所有支援語言。
4. 後備 metrics 是否已設定?
在適當情況下使用 size-adjust、ascent-override、descent-override 與 line-gap-override 等現代 CSS 工具。良好的後備 metrics 可減少字型載入期間的版面位移。
5. font-display 是否有意識地設定?
font-display: swap 很常見,但不一定永遠完美。它改善文字可見性,但如果後備 metrics 不佳,可能會產生明顯的切換。對非關鍵字型而言,若避免干擾比保證品牌排版更重要,optional 可能適用。
6. 你測試過低階裝置嗎?
在開發者筆電上感覺順暢的字型,可能在平價 Android 硬體上算繪緩慢。至少測試一台低功耗裝置或節流設定檔。
7. 是否有回復計畫?
字型變更會影響每個頁面。保留舊的靜態設定一段足夠長的時間,以便在出現算繪、本地化或效能問題時快速回復。
何時可變字型是好的生產環境選擇
在以下情況下,可變字型通常值得考慮:
- 你使用同一字族的三種或更多字重。
- 你維護橫跨多種版型的設計系統。
- 你需要具備寬度或光學尺寸控制的響應式排版。
- 使用者常在每個工作階段瀏覽多個頁面。
- 你可以正確地子集化並測試字型流程。
在以下情況下,它們的吸引力較低:
- 你只需要 regular 與 bold。
- 可變字型檔案比目前設定大很多。
- 該字型在文字尺寸下的插值品質不佳。
- 你的團隊會在 CSS 中散布任意軸線值。
- 你無法測試本地化與後備行為。
清醒的看法是:可變字型是一種能力,不是預設的最佳化。它們會獎勵已經謹慎管理字型的團隊。也會懲罰那些把排版視為裝飾、把字型載入當成事後才想的團隊。
<!-- tool-cta:start -->
💡 試試這個: 在為正式環境對可變字型進行子集化並封裝時,Webfont Generator 會產生附有相符 CSS 的 WOFF2 輸出。
<!-- tool-cta:end -->
生產環境的經驗法則
當可變字型能降低複雜度,或實現明確的設計成果時,就使用它們。不要因為「一個檔案」聽起來更乾淨就使用。
最好的生產環境實作通常很無聊:一個仔細子集化的可變字型、少量經核准的軸線值、合理的後備字型、克制的 preload,以及真實裝置測試。這不如無限排版可能性那麼令人興奮。但它更有可能讓你的網站變得更好。