狠狠撸

狠狠撸Share a Scribd company logo
按?下以編輯?片標題樣式
按?下以編輯?片?標題樣式
我是趙勗博
Shubo
歐姆雷特 資深前端?程師
FB: Shubo 寫個 Code
Find me at
shubochao@gmail.com
按?下以編輯?片標題樣式
按?下以編輯?片?標題樣式
Shubo
你的 JS 該減肥了!
5 个提升网?载入速度的技巧
你的 JS 該減肥了!5個提升網?載入
速度的技巧
我的 JS 很肥會怎樣嗎?
瀏覽器運作原理 / Code Splitting
拆分出 Vendor Bundle
運? webpack-bundle-analyzer 作分析
優化網?載入速度
為何要優化 / 測速?具 / 如何決定優先順序
你的 JS 該減肥了!5個提升網?載入
速度的技巧
Tree Shaking
移除沒?到的程式碼 / ESM import export
其他有??技巧
使? CDN 版本 / 使? preset-env 減少 polyfill 體積
Dynamic Loading
根據路徑 / 對肥?套件作 Dynamic Loading
你的 JS 該減肥了!5個提升網?載入
速度的技巧
我的 JS 很肥會怎樣嗎?
瀏覽器運作原理 / Code Splitting
拆分出 Vendor Bundle
運? webpack-bundle-analyzer 作分析
優化網?載入速度
為何要優化 / 測速?具 / 如何決定優先順序
為何要優化網?載入速度
? 載入速度=使?者體驗
? 根據 Amazon 內部統計,慢100ms = 營收減少 1%
? SEO
Introduction
? 歐姆雷特
? Omlet Arcade
? ?機遊戲直播社群
? React.js + Webpack
? JS bundle 體積 -43%
? 載入速度 -30%
優化載入速度的第?步:善?測速?具
? Google PageSpeed Insight
如何決定優化的優先順序?
? 修正以後改善最多的項?
? 業務範圍中最容易改動的部分
? 先做出成果,得到主管信任,爭取更多優化空間
? 例:優化圖片尺?,涉及 app 上傳 / 後端處理
? 例:優化 JavaScript bundle 體積,前端可??修改 build 設定
你的 JS 該減肥了!5個提升網?載入
速度的技巧
我的 JS 很肥會怎樣嗎?
瀏覽器運作原理 / Code Splitting
拆分出 Vendor Bundle
運? webpack-bundle-analyzer 作分析
優化網?載入速度
為何要優化 / 測速?具 / 如何決定優先順序
我的 JS 很肥,會怎樣嗎?
? 結論:JS Bundle 越?,網?載入越慢
? 瀏覽器:解析 HTML -> 建立 DOM tree -> 渲染畫?
? JS “blocks” DOM tree 的建立過程
? 下載 + 執? JS 越慢,block 越久,越慢渲染畫?
Code Splitting
? 將單? JS 檔案拆分成許多?塊 (chunk)
? 平?載入
? 有需要時才載入
? 各?可被快取
你的 JS 該減肥了!5個提升網?載入
速度的技巧
我的 JS 很肥會怎樣嗎?
瀏覽器運作原理 / Code Splitting
拆分出 Vendor Bundle
運? webpack-bundle-analyzer 作分析
優化網?載入速度
為何要優化 / 測速?具 / 如何決定優先順序
拆分出 Vendor bundle
? Webpack runtime and manifest: 負責模組之間互動,體積可忽略
不計
? Application Bundle: UI / 商業邏輯,經常變動
? Vendor Bundle: 第三?套件 / node_modules,不太變動
Why Vendor Bundle?
? 通常變動不頻繁
? 可被快取
? 此配置在有 cache 情況下載入更快
未優化前 Bundle 規劃
桌機版 ?機版 說明
arcade.js 585KB 426KB 商業邏輯
omlib.js 205KB 205KB
內部 lib / API
規格
vendor.js 366KB 366KB 第三?套件
Sum 1156KB 997KB
運??具分析配置是否合理
? 運? webpack-bundle-analyzer 作視覺化分析
? application bundle
? 裡?有 node_modules
? 併入 vendor bundle 更好
取出 Vendor bundle
? 將 node_modules 統?打包成 vendor.js
抽出 Vendor Bundle:結果
桌機版 ?機版 說明
arcade.js 585KB 310KB 426KB 218KB 商業邏輯
omlib.js 205KB 205KB
內部 lib / API
規格
vendor.js 366KB 632KB 366KB 632KB 第三?套件
Sum 1156KB 997KB 1055KB*
效果:減少 application bundle 的??,加快再訪者載入速度
你的 JS 該減肥了!5個提升網?載入
速度的技巧
Tree Shaking
移除沒?到的程式碼 / ESM import export
其他有??技巧
使? CDN 版本 / 使? preset-env 減少 polyfill 體積
Dynamic Import
根據路徑 / 對肥?套件作 Dynamic Loading
Dynamic Import
? 對新????,網站整體??不變
? 如何減少整體下載量?動態下載需要的模組
? Dynamic Import: 需要?到某段程式碼的時候才透過網路下載 JS
bundle
ESM import()
? Webpack ?援 ESM import() 語法實現 dynamic import
根據路徑作 Dynamic Import
? 為何要根據路徑?
? GA數據顯?使?者?多停留在熱???,換?次數少
? react-router ?援 dynamic import
根據路徑作 Dynamic Import:結果
桌機版 ?機版 說明
arcade.js 310KB 235KB 218KB 189KB 商業邏輯
omlib.js 205KB 205KB 第三?套件
vendor.js 632KB 632KB
內部 lib / API
規格
Sum 1156KB 1072KB* 1055KB 1026KB*
* 體積最?的?
?~20KB
效果:減少 application bundle 下載量
對肥?套件作 Dynamic Import
對肥?套件作 Dynamic Import
? 哪些套件適合 dynamic import?
? 很肥?
? 使?頻率低
? 範例: JSZip (27KB)
肥?的第三?套件們
? hls.js: 77KB
? moment.js: 64KB
? JSZip: 27KB
? request: 70KB (本來專案是跨平台 web / node.js)
對肥?套件作 Dynamic Import:結果
桌機版 ?機版 說明
arcade.js 235KB 189KB 商業邏輯
omlib.js 205KB 205KB
內部 lib / API
規格
vendor.js 632KB 267KB 632KB 267KB 第三?套件
Sum 1072KB 784KB* 1026KB 707KB*
*以使?頻率最
?的??為例
效果:?幅減少整體下載量
你的 JS 該減肥了!5個提升網?載入
速度的技巧
Tree Shaking
移除沒?到的程式碼 / ESM import export
其他有??技巧
使? CDN 版本 / 使? preset-env 減少 polyfill 體積
Dynamic Import
根據路徑 / 對肥?套件作 Dynamic Import
Tree-Shaking
? 將沒?到的程式碼從 JS bundle 中移除
? 必須使? ESM import/export (靜態結構)
如何設定 Tree-shaking
? 將專案中 CommonJS 的 require/module.exports 語法改寫成
ES Module 的 import/export 語法
? 在 package.json 中標?具有 side effects 的模組 (例如 CSS)
Tree Shaking:結果
桌機版 ?機版 說明
arcade.js 235KB 189KB 商業邏輯
omlib.js 205KB 87KB 205KB 87KB
內部 lib / API
規格
vendor.js 267KB 267KB 第三?套件
Sum 784KB 666KB 707KB 589KB
效果:?幅減少整體下載量
你的 JS 該減肥了!5個提升網?載入
速度的技巧
Tree Shaking
移除沒?到的程式碼 / ESM import export
其他有??技巧
使? CDN 版本 / 使? preset-env 減少 polyfill 體積
Dynamic Import
根據路徑 / 對肥?套件作 Dynamic Import
第三?套件使? CDN 版本
? 經常被使?的第三?套件如 React / jQuery
? 容易被快取
? react-dom: 36KB
使? preset-env 減少 Polyfill 體積
? Polyfill: 讓舊的瀏覽器也能?援新的 API
? preset-env: preset-2015 的加強版
? preset: babel-loader 的語法 plugin 集合
? 根據?援瀏覽器清單,?動引入 polyfill
? 結果:31KB 18KB
最終結果
桌機版 ?機版 說明
arcade.js 585KB 235KB 426KB 189KB 商業邏輯
omlib.js 205KB 87KB 205KB 87KB
內部 lib / API
規格
vendor.js 366KB 267KB 366KB 267KB 第三?套件
Sum
1156KB 666KB
(-43%)
997KB 589KB
(-41%)
? 根據 GA 數據,平均載入所需時間減少 30%
結論
? 拆分出 vendor bundle
? 根據路徑做 dynamic import
? 對肥?第三?套件作 dynamic import
? 使? tree shaking 移除沒?到的程式碼
? 熱?第三?套件使? CDN 版本
? 使? preset-env 減少 Polyfill 體積
按?下以編輯?片標題樣式
按?下以編輯?片?標題樣式
Find me at
shubochao@gmail.com
我是趙勗博
Shubo
歐姆雷特 資深前端?程師
FB: Shubo 寫個 Code
Ad

Recommended

性能优化
性能优化
Lu Wei
?
04.web sphere培训 应用websphere优化
04.web sphere培训 应用websphere优化
littlecong
?
美团前端架构介绍
美团前端架构介绍
pan weizeng
?
百度前端性能监控与优化实践
百度前端性能监控与优化实践
Welefen Lee
?
快速搭建高性能服务端
快速搭建高性能服务端
moonbingbing
?
Component in fe
Component in fe
sking l
?
谈谈模块化
谈谈模块化
衡锋 阳
?
广告投放代码和创意代码持续优化
广告投放代码和创意代码持续优化
taobao.com
?
服务器基准测试-叶金荣蔼颁驰翱鲍-20121130
服务器基准测试-叶金荣蔼颁驰翱鲍-20121130
Jinrong Ye
?
Truck js 高性能移动web开发解决方案
Truck js 高性能移动web开发解决方案
美团技术团队
?
前端&补尘辫;服务器
前端&补尘辫;服务器
fangdeng
?
淘宝开放产物前端实践
淘宝开放产物前端实践
taobao.com
?
前端性能优化&补尘辫;测试
前端性能优化&补尘辫;测试
tbmallf2e
?
如何针对业务做顿叠优化
如何针对业务做顿叠优化
Jinrong Ye
?
Modern php ch8 ch9 guide 導讀
Modern php ch8 ch9 guide 導讀
Chen Cheng-Wei
?
第叁方内容开发最佳实践
第叁方内容开发最佳实践
taobao.com
?
闯补尘别蝉-版本控制
闯补尘别蝉-版本控制
Study4TW
?
构建基于尝补尘辫的中型网站架构
构建基于尝补尘辫的中型网站架构
HonestQiao
?
游戏专题重构实践
游戏专题重构实践
f2er
?
02.web sphere培训 应用websphere
02.web sphere培训 应用websphere
littlecong
?
05.飞濒蝉调优
05.飞濒蝉调优
Meng He
?
Berserk js
Berserk js
taobao.com
?
UCloud
UCloud
De-Wu Zeng
?
Q con shanghai2013-[刘海锋]-[京东文件系统介绍]
Q con shanghai2013-[刘海锋]-[京东文件系统介绍]
Michael Zhang
?
Web coding principle
Web coding principle
ZongYing Lyu
?
D baa s_in_xiaomi
D baa s_in_xiaomi
hdksky
?
豆瓣数据架构实践
豆瓣数据架构实践
Xupeng Yun
?
谈谈缓存
谈谈缓存
Weng Wei
?

More Related Content

What's hot (20)

服务器基准测试-叶金荣蔼颁驰翱鲍-20121130
服务器基准测试-叶金荣蔼颁驰翱鲍-20121130
Jinrong Ye
?
Truck js 高性能移动web开发解决方案
Truck js 高性能移动web开发解决方案
美团技术团队
?
前端&补尘辫;服务器
前端&补尘辫;服务器
fangdeng
?
淘宝开放产物前端实践
淘宝开放产物前端实践
taobao.com
?
前端性能优化&补尘辫;测试
前端性能优化&补尘辫;测试
tbmallf2e
?
如何针对业务做顿叠优化
如何针对业务做顿叠优化
Jinrong Ye
?
Modern php ch8 ch9 guide 導讀
Modern php ch8 ch9 guide 導讀
Chen Cheng-Wei
?
第叁方内容开发最佳实践
第叁方内容开发最佳实践
taobao.com
?
闯补尘别蝉-版本控制
闯补尘别蝉-版本控制
Study4TW
?
构建基于尝补尘辫的中型网站架构
构建基于尝补尘辫的中型网站架构
HonestQiao
?
游戏专题重构实践
游戏专题重构实践
f2er
?
02.web sphere培训 应用websphere
02.web sphere培训 应用websphere
littlecong
?
05.飞濒蝉调优
05.飞濒蝉调优
Meng He
?
Berserk js
Berserk js
taobao.com
?
UCloud
UCloud
De-Wu Zeng
?
Q con shanghai2013-[刘海锋]-[京东文件系统介绍]
Q con shanghai2013-[刘海锋]-[京东文件系统介绍]
Michael Zhang
?
Web coding principle
Web coding principle
ZongYing Lyu
?
D baa s_in_xiaomi
D baa s_in_xiaomi
hdksky
?
豆瓣数据架构实践
豆瓣数据架构实践
Xupeng Yun
?
谈谈缓存
谈谈缓存
Weng Wei
?
服务器基准测试-叶金荣蔼颁驰翱鲍-20121130
服务器基准测试-叶金荣蔼颁驰翱鲍-20121130
Jinrong Ye
?
Truck js 高性能移动web开发解决方案
Truck js 高性能移动web开发解决方案
美团技术团队
?
前端&补尘辫;服务器
前端&补尘辫;服务器
fangdeng
?
淘宝开放产物前端实践
淘宝开放产物前端实践
taobao.com
?
前端性能优化&补尘辫;测试
前端性能优化&补尘辫;测试
tbmallf2e
?
如何针对业务做顿叠优化
如何针对业务做顿叠优化
Jinrong Ye
?
Modern php ch8 ch9 guide 導讀
Modern php ch8 ch9 guide 導讀
Chen Cheng-Wei
?
第叁方内容开发最佳实践
第叁方内容开发最佳实践
taobao.com
?
闯补尘别蝉-版本控制
闯补尘别蝉-版本控制
Study4TW
?
构建基于尝补尘辫的中型网站架构
构建基于尝补尘辫的中型网站架构
HonestQiao
?
游戏专题重构实践
游戏专题重构实践
f2er
?
02.web sphere培训 应用websphere
02.web sphere培训 应用websphere
littlecong
?
05.飞濒蝉调优
05.飞濒蝉调优
Meng He
?
Q con shanghai2013-[刘海锋]-[京东文件系统介绍]
Q con shanghai2013-[刘海锋]-[京东文件系统介绍]
Michael Zhang
?
D baa s_in_xiaomi
D baa s_in_xiaomi
hdksky
?
豆瓣数据架构实践
豆瓣数据架构实践
Xupeng Yun
?

你的 JS 該減肥了!5個提升網頁載入速度的技巧 - Modern Web 2020