除了避免下載不必要的資源,提升載入網頁速度的最佳做法,就是最佳化及壓縮其餘資源,盡可能縮減整體下載大小。
資料壓縮入門
設定網站避免下載任何未使用的資源後,下一步是壓縮瀏覽器必須下載的所有剩餘合格資源。視資源類型 (文字、圖片、字型等) 而定,有許多不同的技術可供選擇:可在網路伺服器上啟用的通用工具、特定內容類型的預先處理最佳化,以及需要開發人員輸入的資源專屬最佳化。
如要達到最佳效能,必須結合下列所有技術:
- 壓縮是指使用較少位元對資訊編碼的程序。
- 消除不必要的資料,一律能獲得最佳結果。
- 壓縮技術和演算法有很多種。
- 您需要使用多種技術,才能達到最佳壓縮效果。
縮減資料大小的程序稱為資料壓縮。許多人貢獻了演算法、技術和最佳化方法,以提高壓縮率、壓縮速度,以及各種壓縮演算法所需的記憶體。
資料壓縮的完整討論已超出本指南的範圍。不過,您必須大致瞭解壓縮的運作方式,以及如何運用相關技術縮減網頁所需各種素材資源的大小。
為說明這些技術的核心原則,請考慮最佳化簡單簡訊格式的程序,該格式是專為本範例而發明:
# Below is a secret message, which consists of a set of headers in
# key-value format followed by a newline and the encrypted message.
format: secret-cipher
date: 08/25/16
AAAZZBBBBEEEMMM EEETTTAAA
- 訊息可能包含任意註解 (有時稱為「註解」),並以「#」前置字元表示。註解不會影響訊息的意義或行為。
- 訊息可能包含「標頭」,也就是出現在訊息開頭的鍵/值組合 (在上述範例中以
":"分隔)。 - 訊息會攜帶文字酬載。
如何縮減前一則訊息的大小 (從 200 個字元開始)?
- 這則註解很有趣,但不會影響訊息的意思。傳送訊息時,請消除這類內容。
- 有一些技術可以有效率地編碼標頭。舉例來說,如果您知道所有訊息都有「format」和「date」,可以將這些訊息轉換為短整數 ID,然後只傳送這些 ID。不過,這可能不是真的,所以最好先不要管它。
- 酬載僅限文字。雖然我們不知道內容究竟是什麼 (顯然是使用
"secret-cipher"),但光看文字就知道其中有很多冗餘。或許您可以計算重複字母的數量,並以更有效率的方式編碼,而不是傳送重複的字母。舉例來說,"AAA"會變成"3A",代表三個 A 的序列。
結合這些技術後,會產生以下結果:
format: secret-cipher
date: 08/25/16
3A2Z4B3E3M 3E3T3A
新訊息長度為 56 個字元,表示您已將原始訊息壓縮 72%。這項降幅相當可觀!
這個範例說明壓縮演算法如何有效減少文字資源的傳輸大小。在實務上,壓縮演算法比上述範例複雜得多,在網路上,壓縮演算法可用來大幅縮短資源下載時間。對文字型素材資源套用壓縮功能後,網頁載入資源的時間就會縮短,使用者也能更快看到這些資源的效果。
壓縮:預先處理和特定情境最佳化
這裡討論的第一種技術是壓縮。雖然壓縮並非嚴格的壓縮演算法,但可以移除原始碼中不必要和多餘的字元,讓使用者更容易閱讀資源。不過,在正式版網站上,原始碼的功能不需具備可讀性,而且可讀性可能會延遲網頁資源的載入。
壓縮是一種內容專屬的最佳化作業,可大幅縮減傳送資源的大小,最好在建構和部署程序中套用。舉例來說,套裝軟體是常用的軟體類型,可在將新的正式版程式碼部署至網站之前,自動壓縮資源。
壓縮多餘或不必要資料的最佳方法是將其刪除。不過,您無法任意刪除資料。不過,在某些情況下,如果我們對資料格式及其屬性有特定內容的知識,就有可能大幅縮減酬載的大小,而不會影響其實際意義或功能。
<html>
<head>
<style>
/* awesome-container is only used on the landing page */
.awesome-container {
font-size: 120%;
}
.awesome-container {
width: 50%;
}
</style>
</head>
<body>
<!-- awesome container content: START -->
<div>
This is my awesome container, and it is <em>so</em> awesome.
</div>
<!-- awesome container content: END -->
<script>
awesomeAnalytics(); // Beacon conversion metrics
</script>
</body>
</html>
請參考先前的 HTML 程式碼片段,以及其中包含的三種不同內容類型:
- HTML 標記。
- CSS:自訂網頁呈現方式。
- JavaScript:用於支援互動和其他進階網頁功能。
每種內容類型都有不同的規則,用來定義有效內容、指定註解等。不過,接下來的問題是「如何縮減這個網頁的大小?」
- 程式碼註解是開發人員的好幫手,但瀏覽器不需要!移除 CSS (
/* ... */)、HTML (<!-- ... -->) 和 JavaScript (// ...) 註解,可減少網頁及其子資源的總傳輸大小。 - 「智慧型」CSS 壓縮器可能會注意到我們使用低效率的方式定義
.awesome-container的規則,並將兩個宣告合併為一個,而不影響任何其他樣式,進而節省更多位元組。在大量 CSS 規則中,移除這類冗餘內容可以累積,但可能無法積極套用,因為選取器通常必須在不同情境中重複,例如在媒體查詢中。 - 空格和 Tab 鍵是開發人員在 HTML、CSS 和 JavaScript 中使用的便利工具。額外的壓縮器可以去除所有分頁和空格。與其他簡化技術不同,只要這類空格或定位點並非網頁呈現所必需,這類最佳化作業可以相當積極地套用,例如,您會想要保留 HTML 文件中文字執行中的空格,因為它們可確保使用者實際看到的內容可讀性。
<html><head><style>.awesome-container{font-size:120%;width:50%}</style></head><body><div>This is my awesome container, and it is <em>so</em> awesome.</div><script>awesomeAnalytics()</script></body></html>
套用上述步驟後,網頁字元數從 516 減少到 204,約減少 60%。雖然可讀性不高,但只要能用就行。現代開發做法也允許您將格式良好且可讀的原始碼版本,與您提供給實際工作環境的最佳化程式碼分開。搭配來源對應 (提供可讀取的轉換後正式版程式碼,讓您更輕鬆地排解正式版中的錯誤),您就能享有良好的開發人員體驗,同時最佳化效能,提升使用者體驗。
上述範例說明瞭一個重要觀點:通用壓縮器 (例如專為壓縮任意文字而設計的壓縮器) 在壓縮上述範例中的網頁時,可能會有相當不錯的表現,但它永遠不會知道要移除註解、收合 CSS 規則,或進行其他數十種內容專屬的最佳化。因此,預先處理、壓縮和其他內容感知最佳化功能非常重要。
同樣地,上述技術也可以延伸到文字以外的素材資源。圖片、影片和其他內容類型都包含各自形式的中繼資料和各種酬載。舉例來說,每當您使用相機拍照時,相片檔案通常會嵌入許多額外資訊,例如相機設定、位置等。視應用程式而定,這類資料可能非常重要 (例如相片分享網站),也可能完全無用。請考慮是否值得移除。實際上,每張圖片的中繼資料最多可達數十 KB。
簡而言之,如要最佳化素材資源效率,第一步是建立不同內容類型的清單,並考慮可套用哪些內容專屬的最佳化設定,以縮減其大小。接著,在找出這些最佳化項目後,將其新增至建構和發布步驟,以自動執行這些最佳化項目,確保每次發布至正式版時都能一致套用最佳化項目。
使用壓縮演算法壓縮文字
縮減文字素材資源大小的下一步,是對這些素材資源套用壓縮演算法。這項技術更進一步,在將文字型酬載傳送給使用者之前,會積極搜尋可重複的模式,並在酬載到達使用者瀏覽器時解壓縮。結果是進一步大幅減少這些資源,並縮短下載時間。
- gzip 和 Brotli 是常用的壓縮演算法,最適合用於文字型素材資源:CSS、JavaScript、HTML。
- 所有新式瀏覽器都支援 gzip 和 Brotli 壓縮,並會在
Accept-EncodingHTTP 要求標頭中,宣告支援這兩種壓縮方式。 - 伺服器必須設為啟用壓縮功能。網路伺服器軟體通常會預設啟用模組,壓縮文字型資源。
- gzip 和 Brotli 都可以微調,透過調整壓縮等級來提高壓縮率。如果是 gzip,壓縮設定範圍為 1 到 9,9 為最佳。Brotli 的範圍是 0 到 11,11 為最佳。不過,壓縮設定越高,所需時間越長。對於動態壓縮的資源 (即在要求時壓縮),中等範圍的設定通常能在壓縮率和速度之間取得最佳平衡。不過,您可以使用靜態壓縮,也就是預先壓縮回應,因此可以針對每種壓縮演算法,使用最積極的壓縮設定。
- 內容傳遞網路 (CDN) 通常會自動壓縮符合條件的資源。CDN 也能為您管理動態和靜態壓縮,讓您少一項需要擔心的壓縮問題。
gzip 和 Brotli 是常見的壓縮工具,可套用至任何位元組串流。在幕後,它們會記住先前檢查過的檔案內容,然後嘗試以有效率的方式尋找並取代重複的資料片段。
在實務上,gzip 和 Brotli 在文字內容上的成效最佳,大型檔案的壓縮率通常可達 70% 至 90%。不過,如果對已使用其他演算法壓縮的素材資源 (例如大多數使用無損或有損壓縮技術的圖片格式) 執行這些演算法,則幾乎不會有任何改善。
所有新式瀏覽器都會在 Accept-Encoding HTTP 要求標頭中,宣傳對 gzip 和 Brotli 的支援。不過,代管服務供應商有責任確保網路伺服器設定正確,以便在用戶端要求時提供壓縮資源。
| 檔案 | 演算法 | 未壓縮時的大小 | 壓縮後的大小 | 壓縮比 |
|---|---|---|---|---|
| angular-1.8.3.js | Brotli | 1,346 KiB | 256 KiB | 81% |
| angular-1.8.3.js | gzip | 1,346 KiB | 329 KiB | 76% |
| angular-1.8.3.min.js | Brotli | 173 KiB | 53 KiB | 69% |
| angular-1.8.3.min.js | gzip | 173 KiB | 60 KiB | 65% |
| jquery-3.7.1.js | Brotli | 302 KiB | 69 KiB | 77% |
| jquery-3.7.1.js | gzip | 302 KiB | 83 KiB | 73% |
| jquery-3.7.1.min.js | Brotli | 85 KiB | 27 KiB | 68% |
| jquery-3.7.1.min.js | gzip | 85 KiB | 30 KiB | 65% |
| lodash-4.17.21.js | Brotli | 531 KiB | 73 KiB | 86% |
| lodash-4.17.21.js | gzip | 531 KiB | 94 KiB | 82% |
| lodash-4.17.21.min.js | Brotli | 71 KiB | 23 KiB | 68% |
| lodash-4.17.21.min.js | gzip | 71 KiB | 25 KiB | 65% |
上表顯示 Brotli 和 gzip 壓縮技術可為幾個知名 JavaScript 程式庫節省的空間。節省幅度介於 65% 到 86% 之間,具體取決於檔案和演算法。供參考:Brotli 和 gzip 的每個檔案都套用了最大壓縮等級。盡可能優先使用 Brotli,而非 gzip。
啟用壓縮功能是最簡單有效的最佳化做法之一。如果網站未善用這項功能,就等於錯失提升使用者體驗的大好機會。幸好,許多網路伺服器都提供預設設定,可啟用這項重要最佳化功能,尤其是 CDN,在實作這項功能時,能有效平衡壓縮速度和比率。
如要快速查看壓縮功能,請開啟 Chrome 開發人員工具,開啟「Network」(網路) 面板,載入您選擇的頁面,然後觀察網路面板的最底部。
如上圖所示,您應該會看到以下項目的細目:
- 要求數量,也就是為網頁載入的資源數量。
- 所有要求的傳輸大小。這反映了對網頁資源套用壓縮的效果。
- 所有要求的資源大小。這反映了網頁資源解壓縮「後」的大小。
對 Core Web Vitals 的影響
除非有指標能反映成效提升,否則無法評估成效提升。Core Web Vitals 計畫旨在建立並提升對反映實際使用者體驗指標的認識。這與簡單的網頁載入時間等指標不同,後者無法清楚反映使用者體驗品質。
當您按照本指南所述,對網站資源進行最佳化調整時,Core Web Vitals 的成效可能會因最佳化資源和涉及的指標而異。不過,在某些情況下,套用這些最佳化設定可以改善網站的 Core Web Vitals:
- HTML 資源經過縮減和壓縮後,可加快 HTML 載入速度,並提高子資源的曝光度,進而加快載入速度。這有助於提升網頁的最大內容繪製 (LCP)。雖然
rel="preload"等資源提示可用來影響資源的曝光度,但使用過多提示可能會導致頻寬爭用問題。確保導覽要求的 HTML 回應經過壓縮,預先載入掃描器就能盡快發現其中的資源。 - 部分 LCP 候選元素也可以透過壓縮技術加快載入速度。舉例來說,如果 SVG 圖片是 LCP 候選項目,可以透過文字壓縮減少資源載入時間。這與您對其他圖片類型進行的最佳化不同,其他圖片類型本質上是透過其他壓縮方法壓縮,例如 JPEG 圖片使用有損壓縮。
- 此外,文字節點也可能是 LCP 候選項目。本指南所述技術的使用方式,取決於您是否在網頁上使用網頁字型。如果您使用的是網路字型,則適用網路字型最佳化最佳做法。不過,如果您「不」使用網頁字型,而是使用系統字型,則顯示時不會產生任何資源載入時間,因此縮減及壓縮 CSS 可縮短這段時間,這表示潛在 LCP 文字節點的算繪作業可以更快完成。
結論
如何最佳化文字型素材資源的編碼和傳輸,是基本的效能概念,但影響很大。請務必盡可能確保符合縮減和壓縮資格的資源,都能從這些最佳化作業中受益。
更重要的是,請務必自動化這些程序。如要壓縮,請使用套件組合器,將壓縮套用至符合資格的資源。請確認網路伺服器設定支援壓縮功能,並使用最有效的壓縮方式。為了盡可能簡化這項作業,請使用 CDN 自動壓縮,因為 CDN 不僅能為您壓縮資源,而且速度非常快。
將這些基準效能概念融入網站架構,可確保效能最佳化工作有良好基礎,後續最佳化作業也能以良好的基準做法為基礎。