我是基於Gemini Flash 2.0 Experimental實現的AI助手,在此網站上負責整理和概括文章

本文探討了如何優化Web字體加載以解決Render Blocking Resources問題。文章指出,直接加載Web字體會阻塞頁面渲染,導致用戶體驗不佳,並被PageSpeed Insights評為性能問題。為了解決這個問題,文章提出使用異步加載CSS的方法,包括使用`media="print" onload="this.media='all'"`實現CSS的異步加載,並結合`preload`預加載資源和`preconnect`預連接字體服務器。此外,文章還建議在字體資源鏈接後添加`&display=swap`參數,使字體本身也異步加載。最終,通過將這些方法組合應用,可以有效提高網頁的加載速度,並讓PageSpeed Insights給出更滿意的評分。

# 小小的公告

本 Blog 部署到 Cloudflare Workers 上了。

之後會發布詳細的文章來詳細地碎碎念的。

# 前情提要

自從發現並遷移到 Shoka,這個過於精致的 Hexo 主題快要讓我的 F5 鍵爛掉了其實是 Cmd+R
這麼漂亮的博客系統,當然要優化到盡善盡美!
那麽,開始吧!

# Render Blocking Resources

相信大家都知道 PageSpeed Insights 吧,不知道的也快去看看。
總之這是一個能測試出你的網站哪里討人厭的工具。
通常來說,如果你使用了 Web 字體(如 Google Font),為了渲染 HTML 元素,會從外部服務器加載 CSS 字體資源。
而這個過程正是導致出現 Render blocking resources 的原因。

因此在加載 Web 字體資源的期間,網頁的文本可能是不可見的。

在 PageSpeed Insights 中顯示,Web 字體資源的加載時間嚴重拖慢了網站性能。
並非常嚴肅給出了移除阻塞渲染的資源的建議。

# 所以要做什麽?移除 Web 字體嗎?

Hell no!
不要那麽容易妥協啊 kora,少男 / 少女。
對待事情要像你的暗戀一樣努力唷。
讓我們看看,怎麽才能夠讓 PageSpeed Insights 滿意吧。

# Async CSS(異步加載 CSS)

非常顯然,這是依靠異步加載的時候了!
將 CSS 文件設定為異步加載可以:

  • 防止阻塞瀏覽器渲染 HTML 元素。
  • 在 Web 字體加載過程中文本可見。
  • 讓你的 PageSpeed Insights 結果變得好看。

# preload & preconnect(預加載和預連接)

preload 是現代瀏覽器絕大部分支持的高優先級預加載。
就如字面意思,它可以對瀏覽器說明加載的優先度,確保資源可以優先加載。

preconnect 可以幫助瀏覽器預先連接文件源(也可以理解為預熱)
考慮到一些字體文件托管在與鏈接文件源不同的情況,
Google 本身在 CSS 字體資源文件的 header 就有 preconnect,然而,如果通過在代碼段添加第一方的 preconnect 實現預連接,可以取得更大的延遲優勢。

# 加入異步加載 CSS

異步加載 CSS 可以通過簡單的方法實現:

<link rel="stylesheet"
      href="$CSS"
      media="print" onload="this.media='all'" />

$CSS 代表 CSS 字體資源鏈接喲。

media="print" 指「在 print 類型時應用」。onload="this.media='all' 指「在加載完畢後,在全平台應用」。

# 加入 preload & preconnect

<link rel="preload"
      as="style"
      href="$CSS" />
<link rel="preconnect"
      href="https://fonts.gstatic.com"
      crossorigin />

# 加入 & display=swap

在 Web 字體資源鏈接後加入 & display=swap,
讓字體文件本身使用異步載入。

# 合體吧!

於是,我們得到了這一串代碼。

<link rel="preconnect"
      href="https://fonts.gstatic.com"
      crossorigin />
<link rel="preload"
      as="style"
      href="$CSS&display=swap" />
<link rel="stylesheet"
      href="$CSS&display=swap"
      media="print" onload="this.media='all'" />

把它們全部丟到 head 去吧!

# 結果

PageSpeed Insights 表示很滿意!

此文章已被阅读次数:正在加载...更新於