PageSpeed 100 分又怎樣?全綠也可能在 SEO 排名輸給慢網站
有在追蹤使用者體驗的各種心理學研究,應該都有聽過網頁開啟速度的 X 秒原則,從西元二零零幾年到現在,在各種文獻都有不同的 X 數值,總之網頁開啟速度盡量越快越好。Google 也曾說過載入速度會當作SEO排名因素之一(Official Google Webmaster Central Blog: Using page speed in mobile search ranking)。
網站好不容易導流得到曝光,先不論內容好不好,卻敗在開啟速度,有點可惜,所以花時間調校,對於網站經營還是能有一丁點幫助的。
什麼叫讓網站變快?
網站變快不是把 PageSpeed 分數拉高就算完成,而是先找出使用者到底在等什麼。慢的可能是伺服器查資料、網路傳輸、圖片與程式下載、瀏覽器算繪,或上傳檔案本身、系統資源用盡;每一種問題的處理方式都不同,找錯原因,再努力優化也只是在浪費工時。
以下幾件事通通是在瀏覽網站時發生,但是慢的原因是完全不一樣的!
- 在網站觀看線上視訊直播時,荷官和玩家......呃!老師和學生…之間的動作會有10秒以上的延遲
- 瀏覽供應商的產品資料網站,依SQL語法從70萬筆資料中篩選出對應的規格選項,要很久才能跑出結果
- 在論壇網站瀏覽別人的美食遊記,一篇文章有50張照片,開網頁開了老半天,文章都看完了,照片還沒跑完
- 瀏覽海外地區網站,點擊選單換頁,要過很長一段時間,畫面才會開始顯示內容
- 在網頁瀏覽器開啟雲端硬碟,上傳4K的行車紀錄器影片時,要等非常久才能傳完一個檔案
如果搞不懂哪些部份歸伺服器(後端)、哪些部分歸前端(使用者的瀏覽器)、哪些部分歸傳輸線路,就像騎 Gogoro 去加油站問說怎麼開油箱蓋、大鬧要加滿 92 汽油一樣,叫加油站的主管出來面對也沒用,是無法解決問題的。
舉個例子,像遇過有一次網頁打不開,但 ping domain, ip, 圖片等靜態檔案載入都正常,就是有連到資料庫的後端程式都爆幹慢,某國內主機商匯X的回覆竟然是劈頭先丟 PageSpeed 跑分,叫人把網頁裡的圖片壓縮,外行的領導者還真的叫設計師開始壓圖片,實在是黑人問號。
這種情況光壓圖片當然無法解決問題,最後解決方式仍是伺服器重開機治百病。從此以後遇到這類問題,就是另外提供一些單純重現問題的小程式,以免又被一些前後端搞不清楚的人,叫去壓縮網頁圖片。
本文純討論網頁開啟速度,現在最流行的就是使用 Google 出的 PageSpeed Insight, GTmetrix, Lighthouse, web.dev 之類的跑分檢測工具,光是修這些跑分工具列出來的項目,就可以讓大家忙很久。
PageSpeed Insight 的評分機制
想提升 PageSpeed Insight 的跑分,要先大致知道它怎麼算分:
1.滿分 100、採督導制,被它認定是缺失的項目就一路掉分,但不是每個項目都同分,不是每個項目都一樣重要,而是有不同的大類權重占比,會隨著 Lighthouse V幾的版本更新來調整分數比例分配。

Lighthouse performance scoring
因為是權重,所以如果看到 PageSpeed Insight 的報告裡面有一大堆打著紅色三角型的警告項目,費盡千辛萬苦把他修掉,然後分數還是毫無提升,反而下降了,純屬正常現象。
會有這種脫鉤現象,因為那個分數是整體評量的結果,而警告項目是系統根據網頁上的一些規則列出來的。例如網頁上放了 Google 廣告導致網頁載入很慢,分數是計算後實實在在扣在那些評分比重上的,但警告項目當然不會叫我們把 Google 廣告拿掉...
2.分數還分成兩塊,一個是「瞭解實際使用者體驗」,這是實地資料(真實訪客累積出來的綠/黃/紅燈)。
另一個是「診斷效能問題」是實驗室資料,當場用低階手機+慢網路模擬,跑出來在明顯位置的那個 0–100 分圓環圖表。

這兩塊資料可能同時得出完全不同的結論:上面的真實使用者體驗全部綠燈,下面用慢速手機當場跑出來的分數卻不及格。明明代表多數訪客實際使用沒有大問題,但畫面正中央卻偏偏放著一個醒目的低分圓圈,最後大家通常不會問真實使用者感覺如何,只會問「為什麼還不是 100 分?」
3.Google Seach Console 的使用體驗核心指標(Page Experience 報表裡的 Core Web Vitals)也是實地資料,會根據真實訪客的瀏覽器、裝置、網路狀況來評量 LCP、FID 與 CLS 的綠/黃/紅燈。

如果在 Google Search Console 拉報表時看到一堆警告,基本上也可以參考 PageSpeed Insight 的報告裡面對應的項目,來找出可能的問題點。
網頁調整之後,Google Search Console 的核心體驗報告這邊不會馬上看到變更,要等一陣子,Google 蒐集訪客資料後才會更新。
從這段講解可能發現有點不對勁了,他不是單純修改一行程式碼就可以增加幾分的關係,整套計分背後一堆反直覺、會讓人懷疑人生的眉角,留到最後的「PageSpeed Insight 的靈異現象」那一段再討論。
以下提供幾個小小的 PageSpeed 分數提升秘訣,以及把 Core Web Vitals 玩壞的各種相關測試。
Web Font 怎麼載入才不會拖慢 LCP、還造成 CLS 問題
現代能上網的裝置這麼多,光是 iOS, Android, Windows 的黑體字都會長得不一樣,為了跨瀏覽器字型接近統一,或是有時候想讓網頁上的文字多些花樣,但又不想做成圖片,會用 Google Fonts 上的雲端字型,免費嘛!
Google Fonts 提供的嵌入碼,是用 link tag 呼叫 css,本例在一個內文有上萬字的網頁裡直接直接引用思源黑體(noto sans),然後把這個極端環境的測試網頁1,直接丟去測 PageSpeed…厲害了,不到10分...

不要聽從 Google Fonts 官方的嵌入碼指示,另外做一頁改用 Web Font Loader 來載入雲端字型,在這個只有文字網頁,分數就能達到80分以上。

那一個上萬字的網頁,只是放個 Web Font 而已,為什麼沒有 100 分? 因為網頁工程師就是該死啊!
但對分數的影響還是有限,因為這還是字型的部分,在整體分數占比不大。甚至直接把 webfont 拿掉,試試只使用系統預設字體,如果這樣也只有 70 分,就能知道有這個頁面在有 webfont 的情況,無論再怎麼優化,也不可能超過這分數,就要繼續找其他部分的戰犯。
字型怎麼載入才不會拖慢、又不位移?
在之前的文章中文 Web Font 踩雷記事本有探討過 FOUT 和 FOIT 的問題,在 PageSpeed Insight 的評分裡,也會看到一些關於「字型顯示」的評分項目。
關鍵是讓字先顯示、縮小字型檔,再讓替代字型與正式字型的尺寸接近,而不是把整包中文字型塞進 preload 就算完成,這句話不是一件事,而是好幾件事。
首先讓字先顯示,可以在 CSS 加入 font-display: swap 可以避免字型下載期間整段文字空白。
再來縮小字型檔,只保留網站實際會用到的字元並輸出成額外的字體檔案。實作方式在之前的文章有探討過 用 FontForge 做 tree-shaking 減少網頁字型檔案大小
如果是雲端字體(webfont),最好選擇中文字型有做 subset 動態子集的,像 Google Fonts 的思源黑體和 Cloudflare Fonts 都有這種把字體分片切成小檔案的設計。

在之前的文章 Google Fonts 遭指用免費字型追蹤使用者? 研究各家 web font 的實作方式和隱私條款有探討過各家 web font 的實作方式,會發現像 Bunny Fonts 之類的某些 webfont 服務,雖然產品主打隱私、GDPR 合規之類的是很好,但是在網頁前端效能的議題上是 0 分,會把所有字元都放在單一個字體檔案裡,讓使用者端的裝置多浪費頻寬下載檔案,這也會導致分數下降。
如果替代字型與正式字型的字寬、行高差很多,則可用 size-adjust、ascent-override 等描述值微調,降低換字型時的 CLS。
@font-face {
font-family: "MyFont";
src: url("/fonts/myfont-subset.woff2") format("woff2");
font-display: swap;
}
@font-face {
font-family: "MyFont Fallback";
src: local("Arial");
size-adjust: 105%;
ascent-override: 90%;
}
body {
font-family: "MyFont", "MyFont Fallback", sans-serif;
}
現實專案狀況
剛剛講了一堆,還沒講到字重的情況,如果頁面上的文字需要多種不同的字體粗細,那載入的檔案數量就會成倍增加,對分數的影響也會更大。理想情況是設計端先確認需要哪些字重,前端只輸出用得到的檔案。
現實卻常遇到品牌規範一次指定五、六種字重,CMS 內文又可能出現任何中文字,沒辦法做預先壓縮或激進的subset。萬一少放一個粗細度,就會導致網頁文字的字重顯示異常,可能大標題字變得超細。
反向優化翻車
只加 font-display: swap,但替代字型和正式字型差太多,字型換上去時整段文字重新換行,CLS 反而增加。
另一種常見翻車是把完整思源黑體與多種字重全部 preload,網頁載入時,瀏覽器把下載字型當成最高優先任務,真正的 LCP 圖片或其他重要的檔案反而被延後載入,讓網頁開啟載入速度變得更慢,分數更難看。
延後載入第三方 JS,拯救 INP
從前 Flash 跟無名小站部落格的時代,部落格上常常掛一堆第三方套件,例如可愛日曆、部落格寵物、計數器,還有廣告之類的,最可怕的是網頁一打開還會自動播放音樂。
現在十幾年過去了:
- 裝置的硬體效能提升了好幾倍
- 有線和無線網路的最大理論速度也提升了
- 家用或各種場所內的網通設備也自然淘汰換新幾輪了
- 網頁瀏覽器也吃了更多的記憶體
- 網頁瀏覽器對自動播放影音做了很多管制
但奇怪的是,網頁開起來一樣常常慢到靠北,其一是因為網站可能仍然用低階伺服器和頻寬的省錢運作法,其二是電信公司的集縮比過高,整個系統在承受它不該承受的用量,其三是跟本文主題比較有關,網站上有一些有的沒的第三方套件、廣告代碼、追蹤程式。
第三方 JavaScript 不只會拖慢網頁首次顯示,也可能讓 INP 變差。因為廣告、追蹤碼、客服與社群套件執行時,會占用瀏覽器的主執行緒。這時候如果使用者剛好點擊按鈕、展開選單或輸入文字,就得等這些程式跑完,畫面才有反應,容易給人網頁很慢很卡的感覺。
因此,把非必要的第三方程式延後到使用者捲動、點擊或同意 Cookie 後再載入,不只可以減少首屏負擔,也能降低第三方程式阻塞操作的機會,改善 INP。不過,程式載入後仍可能產生長工作,所以「延後載入」只是減少發生機會,不能保證 INP 一定變好。
在本例的測試網頁,把台灣常見的「社群四天王」套件通通加好加滿
- Line 分享按鈕與即時分享數
- Facebook 分享按讚按鈕與分享數(Like Plugin)
- Facebook 網頁內訊息聊天視窗(Customer Chat Plugin)
- Facebook 粉絲專頁按讚區塊(Page Plugin)
除了四天王,常見的網頁嵌入還有 Google 地圖,Youtube影片、Facebook 留言板(Facebook Embedded Comments plugins)、Youtube 頻道訂閱按鈕(YouTube Subscribe Button)之類的,族繁不及備載…

把測試頁3拿去跑分之後,會發現現在只是擺了一些社群分享數按鈕、FB粉專套件,完全依照社群網站的原廠指示放置嵌入碼,結果一個根本沒內容的空網頁就已經讓 PageSpeed 分數不及格了。
而這些外部嵌入的東西,通通都是那些科技巨頭網站上的程式,裡面的程式碼怎麼寫的,我們又管不著、動不了?
這時候要寫報告,由於社群行銷工具導致網頁開啟速度變慢,降低SEO的排名因素,看是這些社群套件要移除,還是行銷部門要裁…..當然不可能有這種事,最後還是該死的技術人員要處理。
讓這些第三方套件真的開始瀏覽時再觸發
一樣不要聽從官方的嵌入碼,自己把那些 Facebook, LINE 嵌入碼改寫掉,例如先改寫成 lazyload 之類的機制,網頁開始捲動後,才載入這些社群網站套件。

一個幾乎沒內容的空網頁測試頁4,也能回到比較正常的分數了。但因為目前 PageSpeed 主要是測網頁首次顯示的首屏,如果改天增加一種評量方式,會把網頁從頭捲動到尾,那這種奧步又失效了。
這些社群套件各有不同的雷,例如:
- FB Customer Chat 在 LINE 瀏覽器上,會有登入之後,還會再叫人登入,偶發無法成功紀錄登入狀態的問題
- 有時候在 Android 行動裝置上的瀏覽器,那些套件會讓網頁畫面卡住無法捲動
- Page Plugin 會遇到封面圖跑不出來(hide_cover參數是false),但是換一張粉專封面圖就又可以…之類千奇百怪的問題。
為了安全起見,盡量能改用自己做圖片+超連結,不要顯示即時資料的就好了。否則喜歡三不五時沒事找事做、幫自己改不到的網站 debug 的,就歡迎多多使用這些社群外掛套件的「原廠」嵌入碼。
讓這些第三方套件真的開始操作時再觸發
例如 YouTube、地圖、聊天視窗與社群外掛可以先顯示靜態門面,等使用者點擊後再換成真正的 iframe 或 SDK。
這些第三方套件如果不是一打開網頁就要用,先別急著載入;等使用者真的看到或點擊時再載入,通常最有效。
<button class="video-facade" type="button" data-video-id="abc123">
<img src="/img/video-cover.jpg" alt="播放影片" width="640" height="360">
<span>播放影片</span>
</button>
<script>
document.querySelector(".video-facade").addEventListener("click", function () {
const iframe = document.createElement("iframe");
iframe.src = `https://www.youtube.com/embed/${this.dataset.videoId}?autoplay=1`;
iframe.width = "640";
iframe.height = "360";
iframe.allow = "autoplay; encrypted-media";
this.replaceWith(iframe);
});
</script>
使用 Web Worker 搬移第三方套件的程式碼
追蹤碼或廣告程式也有人用 Partytown 搬到 Web Worker。Web Worker 就像瀏覽器另外開一條背景工作線,讓部分 JavaScript 不必和畫面更新、按鈕操作擠在同一條主執行緒上,降低網頁卡頓。
實作方式是在專案內安裝 Partytown 的程式,然後把那些廣告追蹤程式碼改成<script type="text/partytown">..,但這只適合經過驗證、能在 Web Worker 環境運作的腳本。
但這玩意會用到很多瀏覽器機制,前端老韭菜都知道肯定有瀏覽器相容性問題,像是其中一個 JavaScript built-in: Atomics 需要 iOS Safari 15.2 才支援。
實務問題是行銷部門可能要求 GA、廣告轉換、客服與 A/B test 全部在第一時間啟動,這樣數字才會比較好看。甚至有些供應商條款不允許我們這樣擅自偷改嵌入碼。
反向優化翻車
這種點擊後換成 iframe 或真正其他內容的技巧,若內容毫無規律,萬一前後設定的高度不同,容易製造 CLS,影響使用者體驗。
另一種翻車是把所有 script 一律加 defer、搬進 Worker,結果相依順序被打亂,或 SDK 需要直接操作 document 而整個失效;分數可能變好,網頁上的 JS 程式、表單、廣告或轉換追蹤卻壞掉。
用 picture 和 srcset 讓 RWD 只載需要的圖片,節省頻寬、加速 LCP
在 RWD 網站上的輪播廣告圖、圖文介紹之類的內容,視覺設計上可能需要針對大螢幕設計一套圖,手機小螢幕又設計另一套圖,最後再控制小螢幕顯示哪張圖,大螢幕顯示哪張圖、顯示位置之類的。
但是如果大小螢幕各要顯示哪張圖,只用純 CSS 的 display:none 去控制,這只是在視覺上做表面功夫。
打開瀏覽器的 Network 面板,觀察打開網頁載入的資源,就會發現瀏覽器仍然會下載 display:none 的內容,就算用手機開網頁,實際上還是下載網頁電腦版+手機版全部的圖片。
這些都在消耗使用者端的網路下載流量、伺服器端的流量,相當浪費,很不環保。所以為了節省使用者和伺服器機房的網路頻寬,我們要繼續調整網頁,改成浪費網頁設計人員的時間和青春、辦公室的冷氣、電力、網路。
比較簡易的方法,改用 HTML5 的 picture 和 srcset,如 picture tag 的使用範例,
<picture>
<source media="(min-width: 1023px)" srcset="/uploads/lcp-rank.jpg" />
<source media="(min-width: 300px)" srcset="/uploads/lcp-rank-254x300.jpg" />
<img src="/uploads/lcp-rank.jpg" alt="Sample" />
</picture>
這樣修改後,在小螢幕上就只會載入 lcp-rank-254×300 那張圖。
本來放圖片只要寫一行程式碼,現在多了好幾行,我們看到這個改動讓 PageSpeed Insight 大幅提升了… 1分

就算 HTML 包法變得這麼複雜,但要控制圖片的位置、透明度的時候,CSS 一樣還是寫在 img 上面就好了。
以前還要顧慮 IE11 不支援 picture 和 srcset 顯示。但 IE 已於 2022/6 正式退場,picture/srcset 現在全主流瀏覽器都通吃,可以放心用了。
圖片除了壓縮,還能怎麼再加速?
最大的原則,首屏主圖要優先下載,畫面外的圖片才延遲載入,並用 AVIF、WebP 與 JPG 提供逐級相容的格式。
<picture>
<source type="image/avif" srcset="/img/hero.avif">
<source type="image/webp" srcset="/img/hero.webp">
<img
src="/img/hero.jpg"
alt="主視覺"
width="1200"
height="600"
fetchpriority="high">
</picture>
AVIF 通常比 WebP 更小,但不代表每張圖都一定更清楚或更省。
照片、透明圖、帶有大量文字的廣告圖,每種圖片適合的格式與壓縮參數都不同。專案若有十幾年舊圖、多人上稿與多個外部通路,不一定能一次把整套圖片流程換掉,可以先處理首頁主視覺、商品首圖與流量最高的文章。
反向優化翻車
不小心把首屏 LCP 圖也加上 loading="lazy",會讓瀏覽器延後下載最重要的圖片,反而造成 LCP 被扣分。
沒有設定好 CSS min-height、aspect-ratio,與真實圖片比例不同,圖片載入後還會把內容擠開,讓 CLS 項目被扣分,得分更差。
preconnect 讓瀏覽器提前連線重要資源,LCP 能快多少
一些跨網域資源適合 preconnect,它可以提早完成 DNS、TCP 與 TLS 連線,但不會讓一個本來就很肥的第三方 SDK 自動瘦身。
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="dns-prefetch" href="//www.googletagmanager.com">
理想上應從 Network 面板確認首屏真正會用到哪些網域,再挑一至三個最重要的優先連線。
現實常遇到廣告平台每次會轉向不同網域、同意管理平台又動態加入更多供應商,前端無法預知所有目的地。考慮先不要把報告出現的每個網域都塞進 <head>,先處理穩定且高頻的資源即可。
反向優化翻車
一次對十幾個網域 preconnect,會提前建立大量可能根本用不到的連線,搶走頻寬、CPU 與連線額度。
原本想加速字型或主圖,結果先把資源分給不重要的追蹤程式碼、廣告代碼,LCP 反而更慢。
首屏開頭塞太多東西,LCP 最先被拖垮
先找出真正的 LCP 元素,還有首屏必要資源,再用 fetchpriority="high" 或少量 preload 提高優先權;重點不是全部提早,而是讓最重要的東西先到。
<link
rel="preload"
as="image"
href="/img/hero-1280.webp"
imagesrcset="/img/hero-640.webp 640w, /img/hero-1280.webp 1280w"
imagesizes="100vw">
<img
src="/img/hero-1280.webp"
srcset="/img/hero-640.webp 640w, /img/hero-1280.webp 1280w"
sizes="100vw"
alt="首頁主視覺"
width="1280"
height="640"
fetchpriority="high">
前端無法穩定預載正確圖片時,應先限制上傳尺寸、產生縮圖,或讓第一張主圖有明確欄位。
有個情況要注意,查看 PageSpeed Insight 的報告,有時候會發現 LCP 的元素不是圖片,而是第一個畫面中的其他元素,而且還每次測試都是不一樣的,根本無法優先指定預載。
反向優化翻車
把輪播每一張、所有字型與數支 JavaScript 全部 preload,只是把原本排隊下載的資源改成一起搶頻寬。尤其預載了錯誤尺寸的圖片,瀏覽器之後仍可能再下載真正需要的版本,造成重複流量。
系統允許編輯人員直接上傳 300 dpi、數 MB 的原始照片,一旦把這種超級大圖設定 fetchpriority=high 之類的,載入網頁時直接卡在下載這些大圖。
預留版面空間,降低 CLS 扣分
圖片、文字、廣告都可能讓畫面亂跳,CLS 怎麼防? 盡力不要讓第一個畫面的有任何元素從 0 高度,在載入完成後突然長到 280px 之類的,長越高扣分越多。
對圖片、廣告、iframe 與非同步內容,先保留接近實際大小的空間,可以避免內容載入後把整頁往下推。
.hero {
aspect-ratio: 2 / 1;
}
.ad-slot {
min-height: 250px;
}
.video {
aspect-ratio: 16 / 9;
}
這種固定比例的加法,適合已知尺寸的一大張圖片與影片,不適合隨著螢幕寬度而換行的文字段落,也不適合內部太多寬度或特殊定位的元素,不然固定高度可能留下大塊空白或畫面被裁切。
反向優化翻車
aspect-ratio 不是隨便填個 16 / 9 就會自動正確,如果為了消除 CLS 而亂加 CSS,但卻沒有依照實際內容調整,把每個區塊都寫死成過大的高度,雖然指標可能改善,手機畫面卻充滿空白。
反過來,如果比例寫錯,圖片載入後仍會重排;或是讓內容被裁切。
哪些圖片和 iframe 該延遲載入?
只有首屏外、使用者需要捲動才會看到的內容適合 loading="lazy";首屏主圖、Logo 與第一個可見影片封面通常不該延遲。
<img
src="/img/article-figure.webp"
alt="文章示意圖"
width="960"
height="540"
loading="lazy"
decoding="async">
<iframe
src="https://www.youtube.com/embed/abc123"
title="操作示範"
width="560"
height="315"
loading="lazy"></iframe>
長文章很適合延遲載入內文圖片,但某些特殊的版面設計,在桌機不是第一螢幕畫面、換到手機卻可能變成第一螢幕畫面,不能只憑 HTML 出現順序判斷。
舊版瀏覽器或特殊 WebView 也可能有不同表現,重要頁面仍要用真機與慢網路測試。
反向優化翻車
全站搜尋取代,把每個 img 都加上 lazy loading,連 LCP 元素的圖片也一起延遲;或是圖片沒有尺寸,雖然晚點才載入,載入時照樣造成 CLS。延遲載入只能延後請求,不能取代尺寸設定與圖片壓縮。
畫面外內容的 content-visibility 能改善 Speed Index 嗎?
有一個 CSS 屬性 content-visibility: auto 可以讓瀏覽器先略過畫面外區塊的版面計算與繪製,對很長、結構複雜的頁面比較有機會改善初始算繪。
.article-section {
content-visibility: auto;
contain-intrinsic-size: auto 800px;
}
它不是所有長文章的萬靈丹。例如本文前面的例子,上萬字純文字測試頁,DOM 結構單純,瓶頸主要卡在字型下載,加入這個屬性可能完全沒差。
若專案有錨點跳轉、頁內搜尋、列印樣式或依元素尺寸計算的 JavaScript,也要逐項確認,因為尚未算繪的區塊可能影響舊程式判斷。
另外要特別注意 position: fixed。content-visibility: auto 會讓這個區塊建立新的 containing block,放在裡面的 fixed 元素可能不再以瀏覽器視窗定位,而是改成相對這個區塊定位,於是出現浮動按鈕跟著內容捲走、位置偏掉、被裁切或突然消失等問題。
例如全站客服按鈕、回到頁首、固定導覽列或蓋版視窗,不要放在套用 content-visibility 的區塊裡。比較保險的做法,是只對一般文章內容使用這個屬性,把需要固定在視窗上的元素移到區塊外層。
反向優化翻車
沒有搭配 contain-intrinsic-size 提供合理預估高度,捲到該區塊時頁面總高度才突然改變,捲軸位置與內容一起跳。預估值若和實際高度差太遠,也只是把 CLS 從載入時延後到捲動時發生,也許只是改善分數,但實際使用者瀏覽網頁時非常不舒服。
另一種翻車,是直接把 content-visibility: auto 加在包住整頁內容的大容器,連裡面的 position: fixed 元素也一起受到影響。跑分可能只改善一點,原本固定在右下角的客服按鈕或回到頁首按鈕卻開始亂跑。
只用幾個圖示,不值得載入一整包 Icon Font
只需要用幾個圖示時,inline SVG 通常比載入整套 Font Awesome 或 Bootstrap icon font 更直接,也少一次 CSS/JS 相關的字型請求。
<svg class="icon" viewBox="0 0 24 24" aria-hidden="true">
<path d="M12 2 3 9v13h6v-7h6v7h6V9z"></path>
</svg>
.icon {
width: 1.25rem;
height: 1.25rem;
fill: currentColor;
}
反向優化翻車
成熟專案可能已經在幾百個地方使用 icon font class,直接全面改成 SVG 的工時與風險都很高,一不小心就有 icon 沒換掉、SVG 字串被 AI coding agent 亂改,顏色不對等各種問題。
然後每個 inline SVG 都有一大段重複路徑,最後 HTML 體積可能比原本字型還大。
另一種問題是 SVG 沒有處理 aria-hidden、title 或可讀標籤,跑分變快了,無障礙反而退步。
換頁體驗還有哪些能優化?
以下幾個技術都跟「換頁感覺更快或更順」有關,但先說清楚:這些基本上不影響 PageSpeed 跑分或 CWV 數值,PageSpeed 測的是單頁載入,不是頁與頁之間的導航。
如果在其他地方看到這幾個關鍵字,以為導入後分數會大幅提升? 不是,本節先打個預防針。
Speculation Rules:讓下一頁預先載入
Speculation Rules 讓瀏覽器在背景先 prefetch 或 prerender 使用者可能會去的下一頁,點過去時 LCP 幾乎瞬間完成。
<script type="speculationrules">
{
"prerender": [{
"where": { "href_matches": "/products/*" },
"eagerness": "moderate"
}]
}
</script>
對使用者感受有效,但跑分不動的原因是:PageSpeed 是「當場空手去跑」,不是「已經 prerender 完的狀態」,所以分數不受影響。另外無差別 prerender 整個網站會白耗使用者流量與伺服器資源,分析工具還可能收到根本沒人真正看過的 pageview。
WordPress 這邊有一段時期,官方跟不少協力主機商、擴充套件,都在主打「Speculative Loading」功能,把預取/預渲染包裝成一鍵開啟的設定。
但實際用起來問題不少:部分主題或外掛在 prerender 狀態下會出現 JS 錯誤、購物車狀態異常、或分析數據重複計算;Firefox 跟 Safari 的瀏覽器相容性沒有全面到位。裝了外掛把它開下去不代表沒問題。
我們可以看到 Kinsta 是如何介紹這個神奇技術跟裡面的坑: How Speculative Loading can boost your WordPress site’s page speed。
bfcache:上一頁/下一頁瞬間回復
Back/Forward Cache 不需要特別寫程式,只要頁面沒有主動阻止它,瀏覽器就能在使用者按上一頁/下一頁時從記憶體直接還原整個頁面,速度幾乎是瞬間的。
常見會破壞 bfcache 的寫法:
- 頁面掛了
unload事件監聽器 - 對所有頁面設定
Cache-Control: no-store - 開了 SharedArrayBuffer 卻沒設對 COOP/COEP header
bfcache 只對「按上一頁/下一頁」有幫助,PageSpeed 不量這個場景。
View Transitions:換頁不閃白
View Transitions API 讓頁面切換時可以加入平滑過渡動畫,避免傳統換頁的白屏閃爍感。
document.startViewTransition(() => {
updateDOM(); // 更新內容或觸發導航
});
這不需要特別用什麼前端框架,純 CSS&JS 就能做,但目前以 Chrome/Edge 為主,Safari 部分支援,Firefox 尚未支援。這是純視覺體驗優化,對任何 CWV 指標都沒有直接影響。
現實上,兩個頁面的 DOM 結構差異越大,動畫效果越難控制——從文章列表頁跳到完全不同版型的內頁,畫面可能一片混亂,甚至比原本的白屏閃爍更難看。
頁面如果有大量固定定位元素、Sticky header 或複雜的 Grid 版型,也容易在過渡動畫期間位置亂跳。適合用在版型接近、內容平滑切換的場景(如商品列表換頁、編排相似的子頁面),不適合強行套在整個網站的所有換頁上,還有每次換頁的動畫如果過於華麗,看了兩三頁之後就開始視覺疲乏。
FID 換成 INP 後怎麼改善?
改善 INP 的核心是縮短主執行緒上的長工作(long task),讓瀏覽器能在使用者互動後盡快更新畫面。
2024 年 3 月起,Core Web Vitals 的互動指標已由 FID 改成 INP,不能只顧第一次點擊。
可以看 web.dev 的公告Interaction to Next Paint is officially a Core Web Vital,PageSpeed 的警告項目中也會出現「長時間在主執行緒上執行的工作」的相關項目。
例如使用者按下「篩選商品」後,程式一次同步處理幾千筆資料。在運算完成以前,按鈕連「處理中」都顯示不出來,使用者看起來就像按了沒反應,這段等待時間會反映在 INP。
// 反例:一次做完整批運算,畫面要等全部完成才有反應
filterButton.addEventListener("click", () => {
filterButton.textContent = "處理中";
const results = products
.filter(matchesConditions)
.sort(compareProducts)
.map(formatProduct);
renderResults(results);
filterButton.textContent = "篩選完成";
});
可以先讓瀏覽器更新按鈕,再把大量資料拆成小批次處理。每完成一批就暫時讓出主執行緒,瀏覽器才有機會更新畫面、處理捲動與其他操作。
filterButton.addEventListener("click", async () => {
filterButton.textContent = "處理中";
filterButton.disabled = true;
// 先讓「處理中」顯示出來
await yieldToBrowser();
const results = [];
for (let i = 0; i < products.length; i += 100) {
const batch = products.slice(i, i + 100);
results.push(...batch.filter(matchesConditions));
// 每處理 100 筆,就讓瀏覽器有機會回應使用者
await yieldToBrowser();
}
renderResults(results.sort(compareProducts).map(formatProduct));
filterButton.textContent = "篩選完成";
filterButton.disabled = false;
});
function yieldToBrowser() {
if ("scheduler" in window && "yield" in scheduler) {
return scheduler.yield();
}
return new Promise((resolve) => setTimeout(resolve, 0));
}
理想作法是拆分運算、減少 DOM 操作與未使用 JavaScript,用嘴巴講都很簡單,但網頁上的大型表格、編輯器、太舊的 jQuery 外掛與第三方追蹤碼,都可能產生 long task。還有商務系統常綁著不能升級的套件,或一個按鈕必須同步完成驗證資料、計算、檢查權限與追蹤等各種業務邏輯需求。
要讓團隊重寫這些運作得好好的系統功能,重新測試所有條件,為了...某種 SEO 的跑分?
可以考慮先用 Devtools 的 Performance 面板找出主執行緒最長的工作,從最常用的互動逐步拆,不必為了追求理論上的完美一次重寫整套系統。
反向優化翻車
為了減少 request 數,把全站 JavaScript 合併成一支肥大的 bundle,下載後還要長時間解析與執行,TBT、INP 反而更差。
另一種翻車是把工作拆成大量 setTimeout,讓功能完成時間拉得很長,或造成狀態競爭與重複送出。
CSS 怎麼載入,才不會拖慢 FCP、Speed Index 和 LCP?
CSS 還沒下載、解析完成以前,瀏覽器通常不會開始 rendering 畫面,因此 render-blocking CSS 主要會拖慢 First Contentful Paint、Speed Index 與 Largest Contentful Paint。
改善方式是只把首屏必要的 critical CSS 放進 HTML,其餘樣式延後載入,並移除確定沒用到的規則,又不能讓畫面先裸奔。
<style>
/* 只放首屏必要樣式 */
.site-header { min-height: 64px; }
</style>
<link
rel="preload"
href="/css/site.css"
as="style"
onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="/css/site.css"></noscript>
舊專案常有多套佈景、外掛與後台編輯器共用同一份 CSS,工具判定「本頁沒用到」的 class,可能在彈窗開啟、會員登入或其他語系才會出現。刪除前要有頁面清單與視覺回歸測試;無法確認時,可先從明確不再使用的套件、重複框架與頁面專屬 CSS 下手。
反向優化翻車
critical CSS 抽得不完整,頁面會先出現未套樣式內容,再突然變成正式版面,形成 FOUC 與位移。自動清除 unused CSS 若沒有掃到動態 class,還可能把選單展開、驗證錯誤或後台產生的樣式刪掉,直到使用者操作才發現功能跑版。
使用 WebP 一定會變快嗎?
網頁裡有圖片,通常都會遇到 PageSpeed 有一條「提供 next-gen 格式的圖片(JPEG 2000、JPEG XR 和 WebP 等圖片格式的壓縮效果通常優於 PNG 或 JPEG,因此能提高下載速度並節省使用者的數據用量。)」的建議。
WebP 是 Google 開發的一種圖片格式,可以達成看起來跟 JPG 一樣的畫質,也可以做到跟 PNG 一樣背景透明,但是檔案可以更小,這神奇的格式號稱下一代的圖片格式,但是…
網站所有的圖片上傳程式都要做調整
例如上傳 JPG, PNG,自動轉檔成 WebP 的格式,前台的圖片顯示 html 碼也要做調整,為了瀏覽器相容性,建議改成 picture>source+img 的那種方式,CSS 裡的背景圖則要多掛一段偵測是否支援 webp 的 js code (可以用 modernizer),又是一項非常大的工程,直到近代 IE11 結束了,大部分瀏覽器也都支援了,才能放心使用。
也有些 CDN 服務或圖床服務可以把圖片輸出成 webp 需求
上一點提到的那些舊網站功能修改,報價很貴? 那可以考慮使用一些 CDN 服務,使用者瀏覽網站時,會自動看到被轉成 WebP 的圖片,例如 CloudFlare Pro 的 Polish WebP conversion、EWWW Image Optimizer、阿里雲的圖片處理服務等等,
但都是要依圖片數量、網站訪客流量情形等條件持續繳費。
占用更多伺服器磁碟容量
早年 WebP 的圖片無法在 IE 上顯示,所以為了 IE11 能看到網頁上的圖片,視覺設計做好1張圖傳上去,系統還是要轉檔成 JPG 小縮圖、JPG大圖、webP小縮圖、webP大縮圖等等,占用更多伺服器磁碟空間。
有些虛擬主機的伺服器有檔案數/Inode 的限制
上傳1張圖,系統要自動產生4張圖片,檔案數/Inode 更容易滿了,又到了付錢升級主機的時候了。
伺服器設定
有些主機放 webp 圖片還要調整 MIME 設定 <mimeMap fileExtension=".webp" mimeType="image/webp" />,不然 webp 的圖片根本顯示不出來,如果自己沒有相關系統權限,又是很麻煩的一件事。
繪圖軟體不支援
有時候要修改圖,又沒有留原始編輯檔,就不得不直接抓網站上的圖,但 WebP 無法直接下載後拉到 Photoshop 內做編輯,又要再自己轉檔成 JPG。有些通訊軟體(例如LINE)直接傳 webp 人家也看不到圖片,還被人以為是傳病毒。
(2022/2更新:Photoshop 版本 23.2 起支援 WebP 圖片格式)。
或是有些電商類會有同一套圖要上架N個網站的作業情形,直接從網站下載 WebP 圖片,再上傳別的網站? 別的網站也不見得接受 WebP 的圖片,又要再轉檔一次。網頁改成放 WebP 的圖片,讓一些稀鬆平常的視覺設計作業流程變得困難重重。
Pagespeed 的圖片實驗
照慣例做個實驗,以一個放在台灣機房的購物網站的商品內頁為例,網頁最上方有兩大張滿版 banner,第一個畫面還有商品圖輪播圖效果,網頁上還有放 YouTube 跟 FB customchat 等上述提到會讓網頁載入變慢的一些社群天王。
為求公平,都把他轉成 html,就不需考慮 SQL 查詢太久之類的 server side 問題。原網頁裡大小圖共計 25 張,jpg 跟 png 都有,實驗組則是把網頁上所有圖都換成 webp。

換了 webp 之後,20幾張圖片的總大小從 3.5MB 縮小到只剩 1MB,圖片也出現了肉眼輕易可見的畫質損失(因為圖片上有壓字,邊緣不銳利很容易看出來)。
提供 next-gen 格式的圖片、圖片編碼有效率之類的建議改善項目,確實都完成了! PageSpeed 跑分也增加了幾分! 但是 Google Search Console 裡面會列的 LCP 那些還是一樣紅燈啊! 而且 LCP 時間還拉更長了!
做網站,其實有很多調校是表面上「看不出來」的,大費周章調整一堆東西,但可能還是一場空。
直接改用現代前端框架(Next.js, TanStack Start 之類)
本文中有很多前端技巧,像是什麼拆分首屏必要的 critical CSS,其餘樣式延後載入,圖片 lazy load,還有一些優化 JavaScript 程式碼的技巧,這些在傳統的網站開發都有點麻煩,CSS 就是哪邊要改樣式就又多加行規則,有什麼套件就又多一堆 CSS,頂多用一些工具做簡單的壓縮、合併。vanilla JS/jQuery 也有自己的歷史遺毒。
但是在一些現代前端 libraries, frameworks 的生態裡,這些優化技巧已經被 framework 本身內建了,開發者只要專注在寫業務邏輯,框架工具的黑箱作業就會把 CSS、JS 做拆分、優化、延後載入,圖片也有一些優化的方案,甚至是預設就會 lazy load 了。
新技術的帶來新問題
當然這個黑箱背後的技術實作、dependencies 和各種未經過時間考驗的機制,常常也是各種資安漏洞、全球前端大 bug 的來源,還有一些不太好 debug 的問題,需要理解某個功能的歷史發展。
但如果不想花時間在優化細節上,直接改用現代前端框架,確實是個快速提升 PageSpeed 分數的捷徑。
但不是用了就分數一定會變漂亮,不是分數漂亮就一定 SEO 排第一名,有些框架是為了解決前端開發問題而生,不是為了解決 SEO 問題,要把 SEO 做好做滿比以前還麻煩。有幾個大坑要先搞清楚,不然改完反而更慘,可能網站直接從搜尋引擎消失,最常見的就是 CSR 問題跟路由問題。
不要覺得這些技術在 2026 年是基本常識,有一個 vibe coding 的人很愛用的快速架站工具廠商 Lovable,他們到了 2026 年中才宣布 Building apps using TanStack Start,更換新專案的技術架構,從之前的 CSR 換成 SSR。
就因為一些純 CSR(client-side rendering) 的 SPA(早期常見的 React / Vue 純前端),首屏在 PageSpeed 上就是一片空白,HTML 幾乎是空的 <div id="app"></div>,要等一大包 JS 下載、執行、再打 API,才有網頁內容。SEO 爬蟲也不一定抓得到內容。
解法是改走 SSR / SSG:伺服器先吐出有內容的 HTML,首屏馬上看得到。可以選的框架很多:
- TanStack Start:建在 TanStack Router + Vite 上的全端 React 框架,支援 SSR、streaming、server functions,路由是 type-safe 的。
- Astro:內容型網站(部落格、官網、活動頁)很合,islands 架構預設幾乎不出 JS。
- Next.js / Nuxt / SvelteKit:各自生態成熟,SSR/SSG/ISR 都有。
- Qwik:主打 resumability,把 hydration 成本壓到極低。
Lovable 就舉了一些實證,像是架構更新後,爬蟲檢索速度變快、自然搜尋流量變多、從AEO(ChatGPT, Perplexity 等工具)來的流量增加了 98.5%,不再是那個網頁看似很漂亮,網站在搜尋引擎都找不到的 AI 玩具。
解決了 SEO 爬蟲問題,還有更多問題
但別以為換框架、有用 SSR 就一勞永逸,還有接連不斷的坑:
SSR 吐了 HTML 之後,前端還要 hydration,這包 JS 一樣要下載執行。如果整頁都要 hydrate,TBT / INP 反而可能比舊的多頁式網站還差。
hydration mismatch:伺服器跟瀏覽器渲染結果對不起來,畫面會閃一下甚至報錯。盡量縮小首屏要 hydrate 的範圍(islands / 部分 hydration / RSC),能靜態就靜態。要是設定錯誤,退化成「SSR 殼 + 整頁 CSR」,等於兩邊的缺點都吃到。
當使用者使用網頁翻譯套件,或是一些瀏覽器小工具,這些套件通常是直接改 DOM 的,容易破壞 React/Vue/Svelte 等框架的虛擬 DOM 差異比對機制,導致 hydration error,畫面閃爍、畫面全白、甚至功能異常。
這種情況下,使用者根本不知道發生什麼事,難道要告訴使用者「請關掉翻譯套件」?
路由的坑
- 要用框架的 client-side 路由 + 預先
prefetch,換頁才會快;別不小心做成每次點都整頁重載(full reload),那就白用框架了。 - 每一條路由要各自設好
<title>、meta、OG、canonical,不然 SSR 出來每頁的 head 都長一樣,SEO 直接扣分。 - deeplink、直接打某個內頁、404 都要 server 端能正確回應對應的 HTML(SSR),不然分享連結進來是空白或 soft 404。
// TanStack Start:在 server 端先抓資料、設好每頁的 head
// (API 仍在演進,實際以官方文件為準)
import { createFileRoute } from '@tanstack/react-router'
export const Route = createFileRoute('/products/$id')({
head: ({ params }) => ({ meta: [{ title: `商品 ${params.id}` }] }),
loader: ({ params }) => fetchProduct(params.id), // 首屏就有內容,不靠前端再打一次 API
component: ProductPage,
})
平心而論:把一個好好的多頁式網站整個改寫成現代框架,是一筆可觀的工,改完跑分可能也才多個幾分。到底划不划算,又是另一個要跟老闆解釋很久的故事了。
如果只是內容型網站,沒有什麼會員登入或購物車,與其上重量級框架,先評估 SSG 純靜態的方案,往往 CP 值更高。
用 LiteSpeed Web Server 會讓 PageSpeed 分數提高嗎?
這個部落格為了省錢或實驗性質,歷經多次搬家,最近一次也轉換到用 LiteSpeed Web Server 的虛擬主機,那這樣 PageSpeed Insight 分數有變高嗎?畢竟 LiteSpeed Web Server 的宣傳說明都把 PageSpeed 當成賣點,例如使用 LiteSpeed Web Server 可以提升網站速度,降低 TTFB(Time To First Byte),進而提升 PageSpeed 分數。
其實分數也沒差多少,而且自己會寫 JS 跟 CSS,用不著為了排版裝一堆 Elementor 之類的編輯器,套件能不裝的就盡量不裝,畢竟只是個單純的部落格而已,只差沒用 WordPress REST API 來自己做前台而已。
換了 LiteSpeed 之後,TTFB 跟之前的差不多,但前後台瀏覽的體感速度有變順,但扣分主要是在:
- Google AdSense 廣告的 JavaScript 拉大了 render blocking 時間
- AdSense 載入的廣告圖片,造成許多項目被扣分,如靜態資源相關的快取時間、可節省圖片尺寸部份等等
- 最上方自動置入內容的廣告版位區,引發畫面位移,導致CLS暴增(CLS是好幾個區塊累積計算的),Google Search Console 的 Page Experience 裡面沒有半個良好的網址。
但是 AdSense 有規範不可以自己變更廣告程式,所以以上三點基本上是無解的,除非設定只顯示純文字廣告,或是最上面不要放廣告。
所以在這種情況時,扣分數跟網站本身用哪一家主機商、啥伺服器架構沒關係。
這回到一開始騎 Gogoro 去加油站問說怎麼開油箱蓋的問題一樣,如果不了解慢的是哪些部份,例如用一年幾千塊的虛擬主機硬放了 N 個 WordPress 網站還裝了 WooCommerce 之類的肥外掛,導致網站速度慢,卻叫人要優化 CSS 跟 JS?
操作後台經常執行到 timeout 或 5xx 當機,卻叫人壓縮圖片?
那就繼續做夢,等哪一天網站真的會變快吧。
用本地主機可以提升 SEO?
網頁開啟速度是一回事,但 SEO 排名還有內容品質、搜尋意圖與地區相關性等許多因素。假設使用者搜尋「淡水急件印刷」,真正想找的是能在指定時間內完成、方便取件的印刷店。網站需要說明可承接的品項、最快交件時間、取件地點、檔案格式與急件費用。即使網站使用台灣本地主機、開啟速度飛快,卻沒有這些資訊,也不會只因主機放在台灣就排名靠前。
反過來說,主機放在國外的網站,只要內容更符合需求、商家資訊完整,速度也沒有慢到影響使用,排名仍可能比較好。所以使用本地主機可以縮短部分台灣訪客的網路往返時間,但不要直接推論成「主機離使用者越近,SEO 排名就一定越高」。
剛剛提到,PageSpeed Insight 的圖表有一塊是實地測的數據,另一塊是用低階手機+慢網路模擬(有圓環圖和大的分數),如果我們不鳥那個大分數,就是想讓台灣的使用者在台灣的設備上開網站,能有更快的速度,那可以怎麼做?
在 Lighthouse V10 已經把 TTFB 的 audit 比重中拿掉了,但從實地資料那塊可以看到圖表上有 TTFB 的指標,資料來自過去 28 天的真實 Chrome 使用者。TTFB 計算的是使用者發出網頁請求後,到收到伺服器第一個 byte 所等待的時間,裡面可能包含網路延遲、DNS、TLS 連線、CDN、伺服器運算與資料庫查詢。
Google 目前把 TTFB 800 毫秒以下列為良好,超過 1.8 秒列為不良。TTFB 雖然不是 Core Web Vitals,也不會直接在 Lighthouse 分數裡占幾%,但它發生在 FCP、LCP 之前;伺服器晚一秒回應,後面的 HTML、CSS、圖片就全部晚一秒開始下載。因此 TTFB 太長,通常也會連帶拖慢 FCP 與 LCP。
所以,本地主機真正可能改善的,只是台灣使用者連線到伺服器的部分網路延遲。TTFB 還會受到伺服器效能、資料庫速度、頻寬、磁碟 IO 與程式品質影響,這些都是用錢和時間持續堆起來的。光是把主機放在台灣,並不能保證 PageSpeed 100 分,更不能保證 SEO 排名上升。

聽起來還是雲裡霧裡,主機商的網頁不是都已經落落長寫一大段主機規格了嗎? 問題是帳面規格不等於實際表現。同樣寫著幾核心 CPU、NVMe SSD,還會受到同機使用者數量、資源超賣、尖峰時段負載、線路品質與頻寬限制影響。這些通常不會完整寫在銷售頁面上,只能在設備開通後實際測量。
我們在雲端開新設備時,通常會用各種測試腳本去檢查上下行速度、延遲、IO速度、網路丟包率等等:

如果沒有搞清楚網站慢的瓶頸卡在哪,如果卡在磁碟IO很慢、頻寬很小、系統效能不足,那主機放在哪裡都是一樣的問題。不會因為主機放在台灣,就一定比放在國外快。
那有些人可能聽出來了,有沒有可能上下行速度很低、設備很差,網站跑起來就是很慢,銷售時卻一直強調「台灣機房」?當然有,而且還有很多類似話術:
- 只強調機房在台灣,卻不公布 CPU、記憶體、磁碟 IO、頻寬與同機網站數量。
- 用機房內部或離峰時間的測速結果,假裝所有訪客隨時都能跑出相同速度。
- 寫「超大頻寬」,但那是整台主機或整個機櫃共用,不是每個網站獨享,只要同一條線路有一個「好鄰居」,網站效能就大受影響。
- 宣稱使用 SSD 或 NVMe,卻不說儲存設備被多少客戶共用,IO 早已塞滿。
- 標榜 LiteSpeed、HTTP/3、CDN 等名詞,卻把網站放在超賣嚴重的低階主機上。
- 展示一個簡單測試頁的 PageSpeed 100 分,實際網站裝上 WordPress、WooCommerce 後,完全是另一回事。
- 用快取後的首頁測試速度,避開第一次載入、後台操作、搜尋與結帳等真正吃效能的功能。
- 把 CDN 節點回傳靜態檔案的速度,包裝成後端程式與資料庫也同樣快速。
- 保證「提升 SEO」,卻不說主機位置只是眾多效能與搜尋因素之一。
這些話術不能說是造假,有時候只是挑最好看的條件來講,反正再講下去就擋到人家財路了。在很多預算有限的情況下,放在台灣網站的速度,可能不如放在國外的主機,反而會拖慢 SEO 排名。
就算我們好不容易找到真的效能和網路環境都非常好,價格也負擔得起的,但商業上沒事不要拿「快」當成賣點和承諾,因為這個賣點可以輕鬆被摧毀。
今天使用者網路環境的某個地區路由異常、某個海纜斷掉時流量全部湧入其他線路、某個 CDN 或任何一層基礎服務故障、機房設備故障、某個第三方服務的 API 斷線,甚至廠商多接幾個客戶後變成一堆人瓜分資源,這些都可能讓網站速度變慢,分數變差,甚至是網站完全無法使用。
主流架站平台的 PageSpeed 優化有限
使用 Blogger、Medium、WordPress.com(不是 WordPress.org)、Wix、Squarespace 等主流部落格/網站建置平台時,PageSpeed Insights 分數的優化空間會大幅受限。
因為這些平台的核心基礎設備(伺服器、CDN、快取機制、HTTP 標頭設定)都由廠商掌控,你幾乎無法介入調整關鍵的伺服器相關設定和網站程式碼。
除了硬體與後端無法掌控外,各大平台還各自設有不同的規則與限制:
- Medium:系統會判斷無價值文章。自動加上 noindex 標籤,導致無法被 Google 索引,PageSpeed 分數再高也沒意義。
The overwhelming majority of content that Medium will no longer be allowing to be indexed is what most people would consider spam, and the net effect will be more traffic to quality content long-term.
- Blogger(Blogspot):雖然同屬 Google 生態,但能自訂的範圍非常有限。無法輕鬆加入自訂快取規則、HTTP/2 優先順序、或移除 Google 自身的臃腫腳本,行動版分數常常卡在 60–75 分之間。
- WordPress.com(不是 WordPress.org自架站):有些方案無法安裝 CDN 類或各種系統參數調整類的效能優化外掛,也無法修改 .htaccess 或 nginx 設定,影像壓縮與延遲載入的控制權大幅降低。
- Wix / Squarespace:採用拖拉式編輯器,雖然容易上手,但會自動產生大量不必要的巢狀 DIV、內聯樣式與 JavaScript,導致 DOM 結構過於複雜,Largest Contentful Paint(LCP)與 Total Blocking Time(TBT)很難優化。即使你努力壓縮圖片,平台仍會額外注入自己的分析與各種工具程式碼。
當真正想把購物網站或有後台的網站的 PageSpeed Insights 推到 95 分以上,甚至綠燈全亮時,擁有完整掌控權的自架站幾乎是唯一解。有每個月投入幾十到幾百美金的心理準備,自己掌控伺服器、CDN、快取策略與程式碼,才能針對每一項 Core Web Vitals 指標進行精準微調。
2020/05 Update: Core Web Vitals (CWV)的使用者體驗指標新挑戰
PageSpeed 是個很老的工具,2010 年就已經推出了,中間歷經多次改版。本篇文章發出不到兩個月,2020/5月底的時候,Google 又發布了新的指標Official Google Webmaster Central Blog: Evaluating page experience for a better web,雖然說明年可能會實施(The ranking changes described in this post will not happen before next year,),但是現在從 Search Console 已經可以看到 LCP, CLS 相關的跑分出來靠腰了。
在這個 Web Vitals 計畫中,這次 Google 提出三大核心指標 Core Web Vitals
- LCP(Largest Contentful Paint, 最大內容繪製)
- FID(First Input Delay, 可互動時間)
- CLS(Cumulative Layout Shift, 累計版面配置轉移)
這三大指標的意義在於企圖用機器軟體程式算法,來模擬評斷人類的「感覺」和 UX ,在 Lighthouse V6 版的計分比重 佔了頗大的比重,這下好了,就算網站放一堆沒人想看的內容,不針對目標使用者使用的搜尋意圖好好建置內容,反正只要有 SEO 問題就又可以推給工程師了。
更新:Google 在 2024/3 把互動指標從 FID 換成 INP(Interaction to Next Paint, 互動到下一次繪製),比 FID 嚴格很多——FID 只量「第一次互動的輸入延遲」,INP 量的是整個互動到畫面更新的延遲,而且取整個瀏覽期間最差的那幾次。後面會再講怎麼救 INP。
這些評分標準會不會又限制創意,讓現代網頁的首屏畫面越長越像呢?客人可以接受「因為這個特效會拉高 LCP 時間,所以不要用」「貴公司的設計人員上傳圖片時,沒有 SEO 跟 CLS 的觀念」諸如此類的說法嗎??
本文後續將會繼續尋找玩弄 PageSpeed 機器的手法,以及哪些設計卻會讓這三個指標超低分的實驗。
2021/04 update: Google Search Console 增加新版的網頁體驗報表
在 2021/4/19 時,Google Search Console 對於網頁體驗 (Page Experience) 的項目做了改版,把本來零散的一些報表整合起來,裡面有著非常直白的訊息「你的網站有沒有任何網址提供優質網頁體驗」

他的報表邏輯大概是這樣,一個網站要先有在那五塊網頁體驗信號裡面被認定良好的網址,然後這些「良好的網址」有曝光,才會有「良好網址的曝光總數」,不然點進來只能看到大大的鴨蛋,還有非常平坦空曠的圖表。

沒有裝 SSL 數位憑證的網站,就算網站使用體驗核心指標都是綠燈,似乎還是連討論的資格都沒有,一樣是「你的網站有沒有任何網址提供優質網頁體驗」….
Google 官方也公告說會在這些指標將會在今年六月開始影響搜尋引擎排序We’ll begin using page experience as part of our ranking systems beginning in mid-June 2021.,尖叫吧! 怒吼吧!
Apple 重新定義 3C 產品,Google 重新定義網頁體驗。
Google Search Console 的 Page Experience 的廣告體驗報表
剛剛看到上面的圖,可以看到一個「廣告體驗」的東西,這主要會針對網站所使用的廣告方式是否擾人、造成干擾或讓使用者體驗變差,來進行評分。而不是評斷說網站曾經投放 Google Ads 或 FB 廣告,點廣告進來看網站的使用者的瀏覽情況,這個檢測項目跟投放廣告無關,簡單來說就是評量網站內是否有設計一些很擾人的彈跳廣告…之類的東西。
這個廣告體驗報表也不是新玩意,只是多年前舊的東西一起整合進來而已。當時 2019年 Google 號稱要終結網站裡的蓋版廣告…

當時不少媒體也下了聳動的標題…

現在好幾年過去了,各大網站的廣告還是蓋版蓋爽爽,連 Google 自己的 AdSense 也有蓋版廣告跟 Large Sticky Ads,如果你在本部落格多逛幾篇文章就有機會看到。
對於這項評比,Google 的網頁體驗報表說明 有相關的說明:
如果 Google 將某個網站標記為具有不良的廣告體驗,則該網站的所有網頁都會被視為具有不良的廣告體驗。「廣告體驗」評估會影響整個域名,而非只影響單一網頁。
請注意,許多網站並未經過「廣告體驗」測試:如果你的網站並未受到測試,可視為網站已通過「廣告體驗」測試。
(從「廣告體驗」報告的清單上選擇你的資源以查看狀態。如果狀態為「未經審查」,該資源在「網頁體驗」報表中會顯示為具有良好的「廣告體驗」狀態。)
再講一次,Apple 重新定義 3C 產品,Google 重新定義網頁體驗。
PageSpeed Insight 的的靈異現象和整人現象
多半是因為它同時混用「低階設備即時模擬」跟「真實訪客統計」兩套資料,加上很多建議的警告項目跟現實有落差。這一段把最容易讓人誤會(尤其是只看分數的客戶/主管)。
在進到那些現象之前,先把前面提到的計分機制攤開來看,很多怪事其實都是從這幾條規則長出來的:
- 用督導制,滿分100逐步扣下去,有做到的不會讚賞你,它覺得是缺失就扣爆。
- PageSpeed 沒有暫存,一般瀏覽器都有暫存機制,初次瀏覽網頁時要下載一些圖片等靜態資源,但下次瀏覽時,只要沒有超過資料 Response 提供的檔頭資訊 Cache-Control , Etag …之類的有效期,會直接從本機暫存快取載入,第二次瀏覽時就會比較快,但是 PageSpeed 沒有這回事。
- 從 PageSpeed Insight 報告顯示出的伺服器首次回應速度,還有網站預覽圖,發現測試機的網路速度很慢,大概就是 Chrome DevTools 開到 Low-end mobile 的感覺。
- 有分「實地資料」跟「研究資料」,研究資料就是用網速受限和低階設備的 bot 即時去跑的結果(有一個分數),欄位資料則是網站上線一陣子後,Google 蒐集到的真實訪客數據(沒有分數,只會有各項評比是綠燈/黃燈/紅燈),就算欄位資料裡面都綠燈沒問題,但是研究資料沒有 100 分,糟糕了,又是工程團隊的鍋了。
- 網站每一頁的內容都不同,受載入的內容檔案大小與來源、到瀏覽器處理顯示出畫面,這中間的種種技術細節,都會造成不同的跑分,所以基本上沒有「某某網站跑分很低」的說法。
同一頁連測數次,分數也不會是固定值,會有上下浮動的情況,估計是受伺服器傳輸速度影響。那麼分數是要多測幾次取平均值、中位數?還是取最高分?還是取整個網站最高分的那頁?這裡開始就開始有統計爭議點了。
Google Search Console 裡的網頁體驗報表
這報表也很謎,例如我們看到一個 CLS 不良的警示訊息,一層一層點進去看…WTF? PDF 檔案又不是網頁,是要怎麼優化 CLS?

而且要讓缺失項目消失,從網站使用體驗核心指標報告 – 驗證修正結果的說明來看,如果網站中任何網址在這 28 天內皆未發生問題,問題就會視為已成功修正。不過,只要任一網址出現問題,Google 就會將問題標為未修正。
網頁體驗報表裡另外還有不少神秘的整人地雷,例如:
- RWD網站因應客戶需求做了那種「返回電腦版網站內容」的功能,讓手機小螢幕可以看到電腦版畫面,而不是簡化過的手機板畫面,網站上做了一段切換
meta name=”viewport” content=”width=1170, initial-scale=0.2…的,將會報表中顯示「未將可視區域設為「device-width」」,行動裝置可用性出現一堆紅字了。 - 上面的 PDF 造成 CLS 錯誤的問題,是真的有效連結的 PDF,不是那種檔案 URL 404 會 redirect 到其他網頁的問題,PDF 也沒有設定封鎖。
- 上稿人員在網頁裡放了一堆表格,然後被列一堆行動裝置可用性問題「文字太小,不易閱讀」,以後可能請上稿的人把表格都做成圖片吧,雖然文字更小,更不易閱讀,但這樣就不會被抓缺失了。
- 「網站使用體驗核心指標」有拿到綠勾勾,沒有偵測到任何問題,但是點進去卻有顯示一些CLS 問題:超過 0.25 (行動版),LCP 問題:超過 2.5 秒 (行動版)的不良或需要改善的,但網址數又是0? 網站也沒做任何調整,是有問題的頁面刪掉了嗎? 問題是網站的頁面數一隻手就數得完,根本沒有刪呀
- 已經放在 Google Search Console 裡面 N 年,可以被正常搜尋到網站,報表裡卻各種「這個裝置類型的資料不足。」是網站太少人瀏覽? 可是那網站有下關鍵字廣告,瀏覽數明明就很多呀。
- 各種 LCP, CLS 需要改善、不良,然後點進去,半條網址都沒顯示的。
- 各種 LCP, CLS 需要改善、不良,但是每一條網址丟去 PageSpeed,LCP, CLS 都是「良好」的。
- 各種 LCP, CLS 需要改善、不良,顯示有好幾十頁,但是點進去只看得到類似網址 (最多 20 個),然後測了都是「良好」的。
- 有的有「驗證修正後的項目」按鈕可以按,有的沒有。
跑分跟 SEO 排名的關係
所以現在我可以做一個跑分100分,但是毫無內容的垃圾網頁,在整形等熱門關鍵字衝到第一名,讓大家來跟我買推薦連結嗎?
Core Web Vitals 指標的官方 Q&A 問答集 裡面有提到:
即使頁面體驗的某些方面低於標準,我們也會優先考慮總體上具有最佳信息的頁面。 良好的頁面體驗並不能取代擁有豐富而相關的內容。(機器翻譯)
If you have pages that aren’t measuring “good” on at least one of the Core Web Vitals metrics or not passing the other page experience criteria, we recommend focusing on improvements in those dimensions over time. While all of the components of page experience are important, we will prioritize pages with the best information overall, even if some aspects of page experience are subpar. A good page experience doesn’t override having great, relevant content. However, in cases where there are multiple pages that have similar content, page experience becomes much more important for visibility in Search.
為什麼「瞭解實際使用者體驗」半點資料都沒有?
因為那塊吃的是 CrUX 實地資料,網站訪客太少,Google 根本湊不出足夠樣本。
PageSpeed 上半部那塊「瞭解實際使用者體驗(Discover what your real users are experiencing)」,用的是 CrUX(Chrome 使用者體驗報告)的實地資料,來源是真的用 Chrome 逛過你網站、而且同意回傳統計的使用者。
- 樣本數不夠(流量太少)就湊不出統計,這塊會直接顯示「沒有足夠的實際使用速度資料」。
- 有時候頁面級沒資料,會退而顯示整個來源(origin)級的;連 origin 都不夠,就整片空白。
- 所以這不是你網頁做壞了,是 Google 手上根本沒有你的訪客數據。冷門頁面、剛上線的站、擋國外 IP 的站,幾乎都看不到實地資料。
- 想確認自己的 CrUX 到底有沒有資料,可以查 CrUX API。
換句話說,這塊空白跟網站技術好壞無關,純粹是流量問題。要它有資料,先去衝流量,不是去改 CSS&JS 程式碼。
實地資料全綠,分數為什麼還是很難看?
因為那個分數是 Google 拿一台模擬的慢手機當場跑出來的,跟「實地」真實使用者量到的根本是兩回事。
PageSpeed 同一頁其實同時給你兩種完全不同的東西:
- 上面的 實地資料(CrUX):真實使用者過去 28 天的第 75 百分位(p75)。
- 下面的 實驗室資料(Lighthouse):用一台節流過的「模擬低階手機 + 慢網路」當場跑一次,算出那個 0–100 分數。
這兩者量的東西不一樣,本來就會打架。實地全綠代表你真實使用者的體驗其實是好的;但那個 0–100 分數是模擬一台很慢的手機當場跑的結果,常常很難看。
重點是:Google 排名看的是實地的 Core Web Vitals,不是那個 0–100 分數。 所以實地全綠、分數只有 60 幾分,對 SEO 來說其實沒事——但客戶/主管往往只看得懂那個大大的分數,於是工程師又要開始解釋人生了。
LCP 為什麼每次測都在亂跑?
實驗室那個 LCP 每次測都不一樣,原因大概有三個:
- Lighthouse 的模擬節流本身就有變異。
- 伺服器 TTFB 每次浮動。
- 被判定為 LCP 的元素每次可能不同(前面實驗講過,有時候是 logo、有時候是分隔線的背景圖)。
而實地的 LCP 是 28 天滾動的 p75,會隨最近訪客的裝置/網路慢慢變動,今天改的東西,要過好幾天甚至幾週才反映出來。
所以想抓真正的 LCP 元素,看 PageSpeed 報告裡的「最大內容繪製元素」,或乾脆用 web-vitals.js 在真實環境量。別只測一次就下定論,多測幾次看分佈才準。
缺失整個修掉,分數為什麼一點都沒動?
照著 PageSpeed 建議,把某一項(例如「減少無用的 JavaScript」)整個清乾淨,重測,分數動都沒動、甚至還掉了。原因:
- 那個 0–100 是好幾個指標加權算出來的,你修的那項剛好不是卡分數的瓶頸。
- 報告寫的「預估可省下 XX 毫秒 / KiB」是理論上限,實際不一定省得到。
- 每次測本來就有上下浮動,我們的改善被雜訊蓋過去了。
真正卡分數的通常是 LCP 跟 TBT(總阻塞時間)。一直去修一堆無關痛癢的小項目,分數當然不動。修之前先看清楚瓶頸在哪,不要看到紅字就無腦修。
報告列的那些缺失,到底哪些值得修?
報告裡那一串「預估可省下…」看起來很嚇人,實際上能無腦修又有效的沒幾項,逐項說明:
- 「會阻斷算繪的要求(預估可省下 XXX 毫秒)」:就是 render-blocking 的 CSS/JS。理論上 defer/async 或 inline critical CSS 就好,但那個「XXX 毫秒」是模擬慢網路下的理論值,真實使用者多半有快取、網路也沒那麼慢,根本省不到那麼多。而且很多 render-blocking 是廣告/追蹤碼/框架本身,我們不能動它。
- 「提升圖片傳送效能(預估可省下 87 KiB)」:就是叫你壓圖、上 next-gen 格式、給對的尺寸。87 KiB 在現在的網路根本零點幾秒,為了它把整套上稿流程改成奇特的圖片格是,划不划算自己算。
- 「LCP 要求探索」:抱怨你的 LCP 元素被發現得太晚載入完成——例如它是用 JS / CSS 背景圖載的、或沒 preload。解法在本文中有談到一些,但如果 LCP 元素每次測還會變,這項就很難穩定修掉。
- 「網路依附元件樹狀結構」:列出「A 載完才能載 B,B 載完才能載 C」這種一條龍的相依鏈。理論上要打平、preconnect、preload。但第三方 SDK 的相依鏈是人家寫死的,我們只能看著。
- 「使用有效的快取生命週期(預估可省下 142 KiB)」:嫌靜態檔的 Cache-Control 太短。諷刺的是被點名的常常是 GA、廣告、FB SDK 這些第三方檔案,它們的快取時間是人家設的,你改不了,這項幾乎永遠掛在那裡消不掉。
- 「舊版 JavaScript(預估可省下 12 KiB)」:網站建置打包時可能為了相容舊瀏覽器塞了一堆 polyfill / transpile 出來的舊語法,現代瀏覽器其實不需要。解法是 build 時把輸出 target 設成現代語法(esbuild / Vite 設定一下即可)。12 KiB 不多,但這項確實是該清的技術債。但問題有時候是重要的程式碼,但檢測工具根本無法偵測這段程式碼是不是實際有在使用的。
- 「減少無用的 JavaScript(預估可省下 197 KiB)」:載了卻沒用到的 JS,通常是整包 framework / UI library 只用到幾個元件、或第三方 SDK。解法是 code splitting、tree shaking。但同樣,第三方那一包 tree shake 不掉。
- 「避免長時間在主執行緒上執行的工作」:JS 跑太久卡住主執行緒,導致 INP&TBT 變差。本文有提到一些解法。但元凶常常還是一些改了之後會動搖國本的東西,繞一圈又回到原點。
結論:這份缺失清單,能無腦修又有效的其實沒幾項;剩下的不是第三方的鍋,就是理論值跟現實有落差,修了分數也未必會動。看懂哪些值得修、哪些是噪音,比盲目把紅字清光更重要。
簡單一行 CSS 就能讓 web.dev 的 accessibility 測不出分數
遇到一個網頁,在 web.dev 的 a11y 項目得分跑不出來,不知道是問號還是 0 分,Report 說明裡更是甚麼都沒寫,只有 Background and foreground colors have a sufficient contrast ratio – Error! 黑底白字能有什麼對比度問題?Google 又再整人了嗎?對,就是在整人。

做了個可以重現問題的頁面webdev-a11y-fail,用蒙地卡羅法測了老半天,看看刪除頁面上哪一段 CSS 或 HTML 就能讓分數正常?
最後終於查出來。當要做一種效果:讓一段長度不固定的的文字在任何螢幕寬度都不要斷行,溢位的文字自動變成…,會使用 white-space:wrap 配合 text-overflow: ellipsis,雖然版面用一般瀏覽器看起來正常,但 white-space:wrap 竟然會讓跑分異常,向 web.dev 提交 bug 之後不知道有沒有機會解決。
PageSpeed 真的能算準首屏 LCP 嗎?
LCP 的立意基本上是好的,計算網頁可視區域中,最大的內容元件載入所需要的時間,簡單來說就是使用者要花多久才能看到首屏主視覺。官方的介紹說 web.deb – LCP,會認以下這些元素當成頁面上最大內容。
- img elements
- image elements inside an svg element
- video elements (the poster image is used)
- An element with a background image loaded via the url() function (as opposed to a CSS gradient)
- Block-level elements containing text nodes or other inline-level text elements children.
但判定頁面上最大內容這回事,似乎也有很多莊孝維的地方。
做了一些實驗,發現 LCP 的評量標準似乎有一些可議之處…
上方的範例頁面,只是一個非常簡單的靜態頁面,2張圖片和 html 總共 56.5KB,GA 的檔案大約 52.6KB,在 LightHouse 的機器上面測 LCP 落在 1.9~4秒之間,一個內容跟寫法非常單純的網頁,LCP 評分項目已經差點進入不及格的邊緣了。

現實的網頁當然不可能這麼單純,頁面上有一堆視覺上硬要放上去的雜物,為了RWD多出的CSS樣式碼和行動裝置操作元件,FB專頁按讚等第三方外掛,嵌入 Youtube、放思源黑體雲端字型、還有行銷公司要求追蹤碼一定要放在 head 裡面,還有整大包的 CSS framework, JavaScript framework,主機環境能省則省…等各種因素。
別說 100 分,Google 搜尋排第一頁的大部分的網頁都不及格。軟體開發的現實,絕非按照一些規範準則 optimize lcp 就可以完事的。
規範與實際現場脫鉤,這是各行各業都有的問題,在網頁設計這個小小的行業也不例外。
#### 挑戰把官方沒列出的元素當成 LCP
但是有網頁設計知識的人都知道,HTML TAG 至少有 100 多個,就這幾行,真的能包含所有現實的設計情況?先試一下在網頁上用 YouTube 提供的嵌入語法,放一個 iframe 在網頁上。
網頁上放了一段影片,照理說畫面上最大的內容當然就是這個 YouTube 影片,但是卻測出載入時間 6.5 秒,LCP 算不出來,分數是問號。(下圖上半部)

在影片下面加了一段文字(上圖下半部),載入時間跟 LCP 卻神奇的降到 0.8 秒,分數65分,在及格邊緣。
同樣的邏輯思維,Google 曾經出了一個 Framework 叫 Flutter,可以做 APP+WEB,Flutter 在 Web 上的具體呈現方式就是把主要網頁內容都包在一個 HTML5 Canvas 裡面,堪稱 Adobe Flash 概念的復辟,那網頁首屏上最大的元素無庸置疑就是 canvas,而 canvas 也跟 iframe 一樣,沒有直接列在上面的元素清單內,那在 Core Web Vitals 檢測時會發生什麼事呢?
抓了幾個 Flutter Samples 上面的頁面去測,神奇的事發生了,卻沒有像 iframe 一樣跑出問號或是數字異常的情況…
Flutter Web 後來也一直在改渲染策略,HTML renderer 已被移除、改以 CanvasKit / 新的 skwasm 為主,整頁包在 canvas 裡對 SEO 跟 CWV 一直都是個尷尬點,這也是為什麼內容型網站幾乎沒人用 Flutter Web。
#### 找出網頁裡的 LCP 元素(最大內容繪製元素)
有時候 LCP 秒數表現不佳,調整時猜測 LCP 是畫面上的某張圖,但怎麼調都沒差? 其實可以看一下 PageSpeed 有沒有出現這兩行「預先載入 LCP 元素所使用的圖片,以縮短 LCP 載入時間。」「最大內容繪製元素」,點擊之後可以看到它究竟把網頁上的哪一塊內容當成 LCP。

最有趣的是,有時候以為 LCP 元素是上面滿版大圖,還是 logo,結果這邊列出的卻是…分隔線的背景圖之類的,也許照數學算法來說面積的確是最大,但是對於人類的預期似乎有點距離。或是同一個網頁連測數次,列出來的 LCP 元素竟然還會變動,有時候是分隔線,有時候是一個表格內的文字,有時候是 logo…可能就跟物理學上的光一樣,一三五用粒子說,二四六用波動說,禮拜天聽神父說。
經過一連串實測與踩雷,LCP 真的能計算網頁可視區域中,最大的內容元件載入所需要的時間? 真想把 Web Vitals 官方網頁的相關敘述印出來,然後壓著 Google 的工程師請他們把字吃下去。

#### 一樣的網頁試圖偽造不同的首屏視覺
上圖為第二個實驗,LCP實驗範例網頁0 和LCP實驗範例網頁1,兩個範例網頁放置的圖文,引用的 webfont, js, css 檔案完全相同,但一個網頁開啟時會先顯示一個提示訊息,要按掉才能繼續看。
首屏主視覺和 UX 完全不一樣的兩個網頁,卻得到相同的得分?LCP真的是叫(Largest Contentful Paint, 最大內容繪製)時間嗎?還是 Lighthouse 的電腦程式假裝知道使用者看到的首屏畫面,但實際上錯誤百出,在不少情況卻會誤殺忠良?
所以如果想透過諸如網頁一打開時先顯示提示訊息、 loading 動畫之類的,來掩護其他真正的首屏視覺,避免因為 LCP 太長而被扣分?看起來沒這麼好作弊,勢必要花更多時間去嘗試。
像 LCP實驗範例網頁2,調整許多地方,讓 LCP 變成綠色的,但也才提升一丁點的 PageSpeed 總分(不到10分),非常適合沒事找事做的企業,或是有人想要去刁難資訊部門的時候使用。

為什麼跑版網頁的 LCP 分數更高?
另一個北爛的實測,我們做了2個實驗對照頁面,裡面有一個使用 Swiper 套件的普通圖片輪播 slideshow 效果,使用 IE11 無法正常顯示的純 ES6 版本(網頁不用掛JQuery),整個網頁含圖片載入 size 約 400 KB。

檢測項目幾乎都是綠燈,只有LCP項目的數值有相當大的落差,最終導致兩者差了快10分,但網頁程式碼就只差了幾個字。
- 分數較低的那個,我們讓輪播廣告內的大圖片在手機上會與螢幕同寬 100% 顯示,等比例縮小,就是正常網站的做法。
- 分數較高的那個,則是完全不限制圖片寬度,在手機上看,圖片是會超出畫面外的,甚至讓網頁產生水平左右卷軸,就是一般人認知的網頁跑版。
測試其他網頁元素,好像只有圖片有此情況,94要讓畫面跑版凸出去,減少畫面 render 時間,讓機器檢測 LCP 變成綠燈,才是高分的網頁體驗。但是測試表格、iframe,卻沒有此情況,讓畫面跑版凸出去,或是符合畫面寬,分數都沒有多大的差異。
這就有趣了,一個跑版的網頁,卻能在網頁體驗的評分項目拿到更高分,機器真的能評斷出網頁體驗,還是實際上常常在搞笑?
讓網站在 PageSpeed 測不出分數
有碰過幾個網站,前人有請主機商設定阻擋國外IP,只限台灣IP瀏覽,我不知道主機商是如何設定的,以及他們是用哪套國家 IP 資料表。總之這些設定阻擋國外訪客的網站,丟去測 PageSpeed 就只會出現以下訊息,跑不出分數。
Lighthouse returned error: FAILED_DOCUMENT_REQUEST. Lighthouse 無法穩定載入你要求的網頁。請確認你的測試網址是否正確,以及伺服器是否正確回應所有要求。(詳細資訊:net::ERR_TIMED_OUT) 結尾訊息有時候是 403 ERROR,有時候是 ERR_TIMED_OUT
限制國外 IP 除了會造成寄信問題、Google Ads 會變成廣告到達網址無效、FB企業平台認證、Google 跟 FB 一堆廣告商品目錄相關功能出現問題,也會造成 PageSpeed 無法檢測的問題(要再開放某些IP設為白名單)。這也開啟了整個跑分的新思維,例如查主機 Log 檔,可以發現 PageSpeed bot 的 UserAgent 字串至少有以下兩種:
- Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36 Chrome-Lighthouse
- Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Mobile Safari/537.36 Chrome-Lighthouse
然後 IP 通常是66.249. 開頭的,所以理論上可以針對 Chrome-Lighthouse 的 UserAgent 字串,或 IP 網段進行阻擋,甚至特別吐出不一樣的內容給 bot 看,來達成造假的目的…
非技術面結論
一些人開口閉口使用者體驗,SEO,排名不好都是網頁系統的問題,彷彿只要改善網頁跑分之後,就可以在 Google 搜尋排名爬到維基百科或產業龍頭頭上。
結果一看網頁…裡面都放些什麼東西哇?
公司成立XX年,中心理念是誠信、勤奮和#$%%&?
老闆的生平事蹟blahblah?
符合搜尋意圖的實用內容都沒有,一堆無意義的東西飛來飛去,這叫使用者體驗?
商品介紹內文全部用圖片,活動檔期過了就刪掉重上換成新網址,積分根本無法累積同一個網址上,這叫有 SEO 觀念?
網頁內容不充實,整天在改文章發布時間,算網頁標題、網頁描述可以塞幾個關鍵字。
現在 Google 搜尋被調教到 meta keyword 不看,還會幫網頁自動改標題和改描述摘要,產業變成這樣,都拜這些 SEO 「專家」把規則玩爛呢。
一般人還是多讀讀官方文件改善網站在 Google 搜尋中的曝光率寫的: 打造富有吸引力的實用網站、瞭解並滿足讀者的需求、提供明確的專業性和權威性吧。
用「最佳」這個詞容易讓人有錯誤的預期
講到「優化」,就牽涉到對於中國用語的問題,我的個人想法,除了一些會讓人聽起來不悅的,哪邊更接近現實、更能讓人理解,就用哪個,例如這邊台灣用語應該要用「最佳化」,但是論網頁開啟速度要達到最佳,應該是把網頁上對於視覺傳達毫無用途的雜物通通移除,所有會造成扣分的東西拿掉、非必要的東西通通不要放,才能叫最佳。
但論現實情況,客人可以接受本來好好的網站整個打掉重寫、內文可能還要一篇篇修改嗎? 客戶可以接受他的網站變得像瀏覽器的閱讀模式一樣簡約清爽嗎? 上稿的人有能力把每一張圖片都要壓縮到勉強不會太模糊的臨界點嗎? 系統使用者能完整掌控整個網站前後端的程式、整天做實驗看看把某個東西拿掉,看看分數會不會變高嗎? 都是只能稍做微調,離最佳還差遠的了。我覺得「最佳」這個詞容易讓人有錯誤的預期。
至於大費周章調整後,然後發現還是有網頁排在你前面,而 PageSpeed 分數卻很低,不禁開始懷疑人生…
技術面結論
衝分數跟搞資安的基本出發點有點像,多加任何一個東西上去,就要考慮會帶來怎樣的問題。
但現實通常都是說加就加,為加而加,基層的技術人員就是該死。
衝分數不只是技術人員的事,編輯人員有沒有網頁插入圖片的正常觀念,製作適當大小的照片、適當的照片格式,用一些奇怪的編輯方式,都會大大的影響評分項目。
網頁一開始壓預算壓時程隨便寫,日後調整將會曠日費時、動搖國本、禍延子孫,創造更多的工作機會和商機。
網站前後端各自有許多可以調整的項目,但如果改善後讓 PageSpeed 分數提升,但實際體感並沒有變快,甚至有時反而變更慢?純屬正常現象。
至於如果是亂裝了一堆套件和佈景主題的 WordPress 網站,掛 AdSense 又設動態相關廣告的啦,甚至還是一整頁落落長的一頁式網站…也想要衝分數?沒錢沒時間就不要想太多了。
相關連結
- Core Web Vitals 指標的官方 Q&A 問答集
- SERP Speed – Compare your page speed at keyword level with the rest 可以用此工具輸入某關鍵字做查詢,看看「PageSpeed 分數都很高才能排在第一頁」的論點是不是成立。
- PageSpeed Insights 的分數不等於速度