介紹
壓縮是提升網站性能的關鍵手段之一。對于某些類型的文件,最大可減少 70% 的大小,從而大幅降低帶寬需求。隨著時間的推移,壓縮算法不斷得到優化,新的高效算法也逐漸被客戶端和服務器所支持。
在實際應用中,Web 開發人員通常不需要親自實現壓縮機制,因為現代瀏覽器和服務器已經內置了這些功能,只需做一些配置即可。
通過合理利用這些壓縮機制,網站性能能夠得到顯著提升,用戶的訪問速度和帶寬利用效率也會大幅改善。
文件壓縮
每種數據類型都包含一定程度的冗余,這意味著有一些空間是被浪費的。
例如,文本數據通常有多達 60% 的冗余,而音頻和視頻等其他媒體格式的冗余比例可能更高。
與文本不同,音頻和視頻等媒體格式在存儲數據時占用了大量空間,因此優化存儲和回收空間的需求在早期就已經顯現出來。為了滿足這一需求,工程師們設計了專門用于這些數據類型的優化壓縮算法。根據壓縮的特性,文件格式使用的壓縮算法可以大致分為兩類:
- 無損壓縮(Lossless Compression):在無損壓縮中,壓縮和解壓縮過程不會改變數據,解壓后的數據與原始數據完全一致(字節對字節的匹配)。常見的無損壓縮格式包括 GIF 和 PNG 圖像格式。
- 有損壓縮(Lossy Compression):有損壓縮會在壓縮過程中丟棄一些數據,這些丟失的數據對于用戶來說通常是不可察覺的。Web 上的許多視頻格式以及 JPEG 圖像格式都屬于有損壓縮。
對于有損壓縮,通常可以根據需要調整壓縮的程度,壓縮越多,質量可能越差,反之則質量更高。
為了優化網站的性能,理想的做法是盡可能多地壓縮文件,同時保持在可接受的質量范圍內。
通常情況下,有損壓縮算法比無損壓縮算法更高效,能夠在不明顯影響用戶體驗的情況下大幅減小文件大小。
端到端壓縮
端到端壓縮指的是由服務器完成的消息正文壓縮,這一過程在數據從服務器到達客戶端的整個傳輸過程中保持不變。無論經過多少個中間節點,數據的主體部分都不會被解壓,直到最終到達客戶端。
現代瀏覽器和服務器都支持端到端壓縮,唯一需要協商的就是使用哪種壓縮算法。目前,最常用的兩種壓縮算法是 gzip 和 br(即 Brotli )。
瀏覽器和服務器通過主動內容協商來選擇使用的壓縮算法。瀏覽器會發送一個 Accept-Encoding 頭,標明其支持的算法及優先級順序,服務器根據該信息選擇一種算法,用于壓縮響應體,并通過 Content-Encoding 頭部告訴瀏覽器選用的壓縮算法。
同時,為了支持緩存機制,服務器在響應中必須同時包含 Vary 頭,至少包含 Accept-Encoding,以確保緩存能夠區分不同編碼方式的資源表示。
上圖來自?Compression in HTTP - HTTP | MDN
參考
Compression in HTTP - HTTP | MDN