性能優(yōu)化
查詢緩存 -> 發(fā)送請求 -> 等待響應 -> 頁面解析 -> 下載并處理各類靜態(tài)資源 -> 運行時 -> 預加載
一、緩存
- 本地數(shù)據(jù)存儲
localStorage、sessionStorage、indexedDB - 內(nèi)存緩存
- Cache API
- http緩存
- Push Cache: HTTP/2 的 Push 功能所帶來的
二、發(fā)送請求
- 避免多余重定向
- DNS 預解析
- 預先建立連接
- 使用 CDN
DNS 解析會將 CDN 資源的域名解析到 CDN
服務的負載均衡器上,負載均衡器可以通過請求的信息獲取用戶對應的地理區(qū)域,從而通過負載均衡算法,在背后的諸多服務器中,綜合選擇一臺地理位置近、負載低的機器來提供服務。例如為北京聯(lián)通用戶解析北京的服務器 IP。這樣,用戶在之后訪問 CDN 資源時都是訪問北京服務器,距離近,速度快。
三、服務端響應
四、頁面解析與處理
- 注意資源在頁面文檔中的位置
- 使用 defer 和 async
- 頁面文檔壓縮
五、頁面靜態(tài)資源
1.思路
- 減少不必要的請求
- 減少包體大小
- 使用適合當前資源的壓縮技術;
- 避免再響應包體里“塞入”一些不需要的內(nèi)容
- 降低應用資源時的消耗
- 利用緩存
2.針對各類資源的性能優(yōu)化
2.1 JavaScript 優(yōu)化
- 減少不必要的請求
- 代碼拆分(code split)與按需加載(webpack、路由、 AMD 模塊加載器)
- 代碼合并
- 減少包體積大小
- 代碼壓縮
- Tree Shaking:本質(zhì)是通過檢測源碼中不會被使用到的部分,將其刪除,從而減小代碼的體積
- 優(yōu)化 polyfill 的使用
- 優(yōu)化 polyfill 的使用
- 解析與執(zhí)行
- JavaScript 的解析耗時
- 避免 Long Task
- 是否真的需要框架
- 針對代碼的優(yōu)化
- 緩存
- 發(fā)布與部署:https://www.zhihu.com/question/20790576/answer/32602154
- 將基礎庫代碼打包合并:https://juejin.im/post/6844903602134188046
- 減少 webpack 編譯不當帶來的緩存失效
webpack 會使用自增 ID。這就可能導致一個問題:一些模塊雖然它們的代碼沒有變化,但由于增/刪了新的其他模塊,導致后續(xù)所有的模塊 ID 都變更了,文件 MD5 也就變化了。另一個問題在于,webpack 的入口文件除了包含它的 runtime、業(yè)務模塊代碼,同時還有一個用于異步加載的小型 manifest,任何一個模塊的變化,最后必然會傳導到入口文件。這些都會使得網(wǎng)站發(fā)布后,沒有改動源碼的資源也會緩存失效
1.使用 Hash 來替代自增 ID: HashedModuleIdsPlugin 插件
2.將 runtime chunk 單獨拆分出來
3.使用 records
2.2 CSS 優(yōu)化
- 關鍵 CSS:經(jīng)典的骨架屏
- 優(yōu)化資源請求
- 按需加載
- 合并文件
- 請求的優(yōu)先級排序
- 慎用 @import: 這個是串行,可以改成并行
- 謹慎對待 JavaScript 腳本的位置
- 減少包體大小
- 壓縮
- 選擇合適的兼容性
- 解析與渲染樹構建
- 簡化選擇器
- 避免使用昂貴的屬性
- 使用先進的布局方式
- 利用緩存
2.3 圖片
- 優(yōu)化請求數(shù)
- 雪碧圖
- 懶加載
- CSS 中的圖片懶加載
- 內(nèi)聯(lián) base64
- 減小圖片大小
- 使用合適的圖片格式
- 使用 WebP:
- 使用 SVG 應對矢量圖場景
- 使用 video 替代 GIF
- 漸進式 JPEG:
- 圖片質(zhì)量的權衡:有損 無損
- 使用合適的大小和分辨率
- 刪除冗余的圖片信息
- SVG 壓縮
- 使用合適的圖片格式
- 緩存
2.4 字體
- font-display
@font-face 中設置 font-display: swap,他可以讓 FOIT 的默認行為變?yōu)?FOUT (Flash of Unstyled Text),即先會使用默認字體樣式展示文本,字體加載完畢后再將文本的字體樣式進行替換。
- 內(nèi)聯(lián)字體
- 使用 CSS Font Loading API
- FOFT
2.5 視頻優(yōu)化
- 使用合適的視頻格式
- 視頻壓縮
- 移除不必要的音軌信息
- 使用“流”
- 移除不必要的視頻
六、運行時
1.注意強制同步布局
- 嘗試使用 RAF 避免強制同步布局
- 批量化你的操作
2.長列表優(yōu)化
- 實現(xiàn) Virtual List
- 原生的 Virtual Scroller
3.避免 JavaScript 運行時間過長
- 任務分解
- 延遲執(zhí)行
- 并行計算
4.善用 Composite:https://fed.taobao.org/blog/2016/04/26/performance-composite/
5.滾動事件的性能優(yōu)化:防抖,節(jié)流
6.Passive event listeners ?
七、預加載
1.預加載技術
- Resource Hints
- Prefetch
- Prerender
- Preload
- webpack 中的使用方式
- 基于 JavaScript 的預加載
2.視頻預加載
- 為視頻添加 preload 屬性
- 使用 Preload Link
- 使用 JavaScript 進行自定義的 Buffer 操作
3.預加載的策略
- quicklink
- Guess.js