前端P.15:優化 通訊模組 下載
🥜 前情提要
在上一回中,我們介紹了工具單元測試,這次來討論有什麼優化方案可以優化前端下載速度。
通訊模組:
首先所有人要上網,一定會使用通訊模組,常見的有OSI 7層模型
而7層太複雜,所以有人把它簡化,改成TCP/IP 四層。所以任何人要上網就必須使用TCP/IP四層,那這邊來介紹是哪四層。
當你輸入網址後會經過什麼動作?
- 透過應用層,DNS解析後你會獲得IP
- 透用應用層,也就是Chrome自動拼裝網路封包
- 透過協議層,也就是瀏覽器選擇幫你拼裝HTTP的封包
- 透過IP層,瀏覽器在封包上寫好要傳到哪裡(類似收件人)
- 透過實體層,瀏覽器把這封包傳到網卡,網卡透過無/有線網路傳到對方那。
而上述過程中就是一個基本網路封包的組成,而在這過程中我們可以進行優化。
應用層
這一層主要就是應用程式的所在地,Win10、Html、Chrome、Safari ..etc
所以封包最終會進入到應用層,而應用層就是你的軟體,所以這邊可以進行
圖片有損壓縮
利用人眼缺陷原理進行壓縮,在數位圖片中,當你要顯示一張圖你可以看成:將這張圖切割成數個正方形格子,而每個格子都有各自的顏色,而這些格子就是畫素,就像是拼圖遊戲,你必須將很多五顏六色拼圖碎片拚再一起,我們人眼才能是別這個「圖」
在上圖中我們可以我們將拱橋放大再放大,可以知道它是由一堆各種綠色和白色的格子組成,而一個數位圖片的畫質我們可以用多少個畫素來表示,越多畫素,畫面越精緻,畫素格子越小,解析度也越高。
而TinyPng該網站提供了壓縮圖片的服務,主要是將相近的24個畫素改用8個畫素來表達,並且移除不必要的數據(作者、拍攝時間、聯絡方式等等),所以是有損壓縮,而值得一提的是,市面上將PNG24轉成PNG8的工具不少,但是Tiny的演算法可以讓使用者在畫質和容量進行平衡。
選擇更小的編碼格式
其實前端的各種資源很有多種編碼方式,不是萬年不變的png和mp3,以下推薦的編碼格式都是比較新的格式並且擁有不俗的品質和壓縮比。
- 全版圖片:JPEG 2000,請注意並不是單純的JPEG,副檔名為 .jp2,目前僅 Safari支援
- 透明圖片:WebP,除了Safari其他主流瀏覽器皆支援
- 音訊檔案:AAC,這是非常優秀的編碼格式,就連AppleMusic也都採用該方案。
注意!上述的編碼格式都是比較新的編碼技術,所以不見得所有瀏覽器都支援,但起碼主流瀏覽器都支援,並且也支援許久,但還是要根據自身客群決定。
HTTP Header的壓縮方案
基本上網頁使用的協定都是Http協定,而Http協定規定了你要有個叫做Header的東西,用於描述封包的資訊。
而Header中定義很多資訊,其中在「請求的Header」中有一個叫做Accept-Encoding
這是告訴接收到這封包的人,我支援這些解壓縮方案,你等下回應給我的封包可以透過這些方案壓縮。
而Server收到這請求可以從中選一個壓縮方案,這邊推薦使用br
全名也就是Brotli
,這是比Zip
、GZip
…etc 更猛的壓縮方案。可以讓資源便更小。
當Server選擇了br
,於是在「回應的Header」中有一個叫做Content-Encoding
用於告訴Client(也就是瀏覽器),你可以採用該方案解壓縮就能拿到正確資源。
brotli 壓縮率比 gzip 還要高(檔案更小)
但是壓縮時間比 gzip 略長 (Concurrency 低時還沒感覺)
HTTP Header的快取方案
基本上這是第二次造訪網頁才會生效的優化方案,在HTTP Header中定義了Cache-Control
,這是快取控制。
如果Cache-Control中包含no-store指令,則瀏覽器會忽略該資源的快取。如果Cache-Control中包含max-age指令,則瀏覽器會根據指定的時間來判斷資源的快取是否已過期,並決定是否應該使用快取。
這邊建議,除了index.html,其餘檔案全部一律進行快取,可以的話永久快取。而更新問題可以採用雜湊檢查碼解決。
檔案合併
其實這種優化方案是有限的,合併要解決的問題就是減少請求,但是在現今針對請求的問題已經被優化非常多,因為HTTP的新版本,所以只要不是使用舊版本的話,基本上效益算是有限,但還是稍微有點用的方案。
傳輸層
基本上瀏覽器上接收封包都一律使用HTTP協議,基本上沒有辦法做任何修改,但是我們可以選擇協議版本
- HTTP 1.1
- HTTP 2.0
- HTTP 3.0
基本上這邊推薦 3.0,如果不行才推薦2.0,絕對不推薦1.1。
3.0 相比 1.1,改善非常多像是
- 使用UDP而不是TCP,也就不會有3次交握4次揮手這耗能的步驟
- 壓縮Header,首先封包=Header+內容,所組成。而在1.1只能壓縮內容,不能壓縮Header,3.0改善了這問題
- 多路多重傳輸,改善了同時下載多個檔案的效率問題
還有很多功能這邊不列舉,而 3.0 版本已經支援各大主流瀏覽器中了,但還是有其他小廠商的瀏覽器不支援,但通常能向下相容。
所以如果要支援1.1版本的瀏覽器,建議還是要進行 1.1的優化,也就是檔案合併的功能。
網路層
假設如果有個美國客戶他要下載我們的資源,那他就必須造訪台灣機房才能拿到資料,這樣速度非常的慢,所以有個優化方案能讓,美國客戶就在美國節點拿到資源。
這個節點我們稱為 CDN節點,CDN節點的覆蓋範圍決定了你的客戶範圍在哪。
你可以自己建置美國節點,也可以購買CDN廠商的服務,廠商會把你的資源部屬到他手上有的節點,這樣就可以讓美國用戶拿到美國節點。
連結層
基本上客戶的硬體我們是無法優化的,但是我們可以優化自己的硬體,讓自己Server能夠更快速的反應給客戶,而這邊會推薦設定一些功能實現提高傳輸效率
- Zero Copy,讓資源複製更快,減少CPU壓力
- 緩存,應用層提到Accept-Encoding的功能,壓縮會導致CPU壓力提升,所以建議快取壓縮結果。
- keepalive_timeout,如果是Http 2.0 或 1.1 建議根據實際情況做調整。