【高效能網站建設進階指南】讀書筆記
ofollow,noindex" target="_blank">高效能網站建設進階指南
無阻塞載入指令碼
無阻塞載入外鏈指令碼的方法有:
- XHR Eval,xhr 載入後 eval。
- XHR 注入,xhr 載入後,建立 script 元素 scriptEle,然後把載入到的內容寫進 scriptEle 的 text 屬性來執行。
- Script in Iframe,通過
frames/contentWindow
以及parent/top
等來在父子視窗間相互呼叫。 - Script DOM Element,動態建立 script 元素,然後設定
src
屬性來載入外部指令碼。 - Script Defer,延遲執行,但執行順序和宣告 defer 的順序一致,阻塞
DOMContentLoaded
事件。 - document.write Script Tag,多個指令碼並行下載,但依然阻塞其它型別資源,
document.write("<script src='a.js'><\/script>")
。
整合非同步指令碼
非同步指令碼保持執行順序的方法有:
- 硬編碼回撥,外部指令碼呼叫 行內指令碼 的函式,從而讓函式內的內容在外部指令碼後執行
- Window Onload, 監聽
onload
事件,觸發執行指定內容。需要外部指令碼載入方式能阻塞onload
事件 - 定時器,定時檢查依賴的外部指令碼是否已載入(通過指定的暴露點),載入後才執行。
- Script Onload
可伸縮的 Comet
Comet 是一個表示由服務端來控制資料流動的方案的概括術語,包括了輪詢(Polling)、長輪詢(Long Polling)、永久幀(Forever Frame)、XHR 流(XHR Streaming)以及 Socket/">WebSocket。
輪詢,用 ajax 來主動發起輪詢,收到響應結果後繼續發起下一次請求。
長輪詢,則是客戶端首先和服務端建立起連線,服務端直到有資料時才返回給瀏覽器並關閉當前連線,然後瀏覽器發起下一次連線,這樣,後續連線的發起是由服務端返回資料來驅動的,而不是瀏覽器主動輪詢實現。其中,可以結合定時器來做心跳,服務端也可以做超時控制。
永久幀,用一個一直在輸出內容不結束的 iframe 來父子通訊,如服務端一個 while
迴圈。
XHR 流,利用 xhr 在 readyState 變為 4 之前接收到資料流來不斷更新。
以上原基於 Ajax 的實現,可為了跨域需要而改為基於 JSONP 的實現。
API/WebSocket" rel="nofollow,noindex" target="_blank">WebSocket ,在這本書出版的時候,WebSocket 還沒廣泛支援,在 2018 年主流瀏覽器都支援了其基礎功能,服務端推送的需求應首選該方案。
超越 Gzip 壓縮
防毒軟體以及代理軟體等客戶端或 Web 代理可能會修改請求頭,如移除或修改 Accept-Encoding
,從而導致雖然絕大部分客戶端(瀏覽器)都支援 Gzip,結果卻返回未壓縮的內容。
影象優化
這裡關注的是無失真壓縮
優化 PNG 格式的影象: pngcrush 、 PNGOUT 、 OptiPNG 、 PngOptimizer 。
剝離 JPEG 元資料(註釋、APP 自定義資訊、EXIF 等): jpegtran 。
把 GIF 轉換為 PNG: ImageMagick 。
優化 GIF 動畫: Gifsicle 。
高效 CSS 選擇符的關鍵
樣式系統從最右邊的選擇符開始向左匹配規則。只要當前選擇符的左邊還有其他選擇符,樣式系統就會繼續向左移動,知道找到和規則匹配的元素,或者因為不匹配而退出。
- 避免使用通配規則
- 不要限定 ID 選擇符
- 不要限定類選擇符
- 避免使用後代選擇器
- 避免使用標籤——子選擇器
- 質疑子選擇符的所有用途
- 依靠繼承
響應時間規則
- 0.1s,可以感知到和系統有互動,只需要展示結果而不需要額外的反饋
- 1s,可以感知到互動有延遲,0.2s ~ 1s 間應展示適當的反饋來提示系統正在工作
- 10s,使用者保持專注的極限,超過這個極限應該給出預期完成時間或百分比等反饋。