简介
Amazon发现每100ms延迟导致1%的销量损失
用户更缺少耐心,>3s 加载导致53%的跳出率(bounce rate)
https://developer.mozilla.org/zh-CN/docs/Web/Performance/How_browsers_work
https://developer.mozilla.org/zh-CN/docs/Web/Performance/dns-prefetch
https://developer.mozilla.org/zh-CN/docs/Web/Performance/Optimizing_startup_performance
https://developer.mozilla.org/zh-CN/docs/Web/Performance/Lazy_loading
https://developer.mozilla.org/zh-CN/docs/Web/Performance/Rum-vs-Synthetic
https://developer.mozilla.org/zh-CN/docs/Web/Performance/Critical_rendering_path
https://developer.mozilla.org/zh-CN/docs/Web/Performance
使用FastDom
使用FastDom批量对DOM的读写操作 https://github.com/wilsonpage/fastdom
white循环比递归要快
资源的压缩与合并
- 减少http请求数量
- 减少请求资源的大小
HTML压缩
- 使用在线工具进行压缩
- 使用html-minifier等npm工具 CSS 压缩
- 使用在线工具进行压缩
- 使用 clean-css等npm工具
js压缩与混淆
- 使用在线工具进行压缩
- 使用Webpack对)S在构建时压缩
CSS JS 文件合并
- 若干小文件,maybe……
- 无冲突,服务相同的模块,ok.
- 优化加载,NO!
图片格式优化
https://github.com/imagemin/imagemin https://github.com/imagemin/imagemin-pngquantJPEG/JPG图片
webp图片
png图片
图片的懒加载 lazy loading
- 原生的图片懒加载方案()
- 第三方图片懒加载方案
verlok/lazyload
yallis
Blazy
使用渐进式图片
渐进式图片的解決方案
- progressive-image
- libipeg
- ImageMagick
- jpegtran
- jpeg-recompress
- imagemin
使用响应式图片
- Srcset厲性的使用
- Sizes属性的使用
- picture的使用
字体优化
什么是FOIT和FOUT
- 字体末下载完成时,浏览器隐藏或自动降级,导致字体闪烁
- Flash Of Invisible Text
- Flash Of Unstyled Text
使用font-display
- auto
- swap
- optional
- block
- fallback
使用AJAX + Base64
- 解决兼容性问题
- 缺点:缓存问题
Tree-shaking
- 上下文未用到的代码(dead code)
- 基于ES6 import export
- package.sideEffects:['*.css']
- 注意Babel默认配置的影响
JS压缩
- Webpack 4 后引 uglifyjs-webpack-plugin
- 支持ESG替换为terser-webpack-plugin
作用域提升(自动)
- 代码体积减小
- 提高执行效率
- 同样注意Babel的modules配置
渲染优化
switch 比if快
js 优化
方案一 code splitting 代码拆分,按需加载
Tree shaking 代码减重
减少主线程工作量
- 避免长任务
- 避免超过1kB的行间脚本
- 使用rAF和rIC进行时间调度
Progressive Bootstrapping
- 可见不可交互 vs'最小可交互资源集
v8 编译原理
const {performance, PerformanceObserver} = require ('perf_hooks');
const add = (a, b)=> a+b;
const num1 = 1;
const num2 = 2;
performance.mark('start');
for(let i = 0; i < 10000000; i++) {
add(num1, num2) ;
}
add (num1, 's'); // xx
for(let i = 0; i < 10000000; i++) {
add(num1, num2) ;
}
performance.mark('end');
const observer = new PerformanceObserver((list) => {
console. log(list.getEntries () [0]) ;
})
observer.observe({entryTypes: ['measure']});
performance.measure( '测量11', 'start','end');
// node xxx.js
需要查一下 node --trace-opt --trace-deopt de-opt.js
抽象语法树
- 源码 =>抽象语法树 =>字节码Bytecode =>机器码
- 编译过程会进行优化
- 运行时可能发生反优化
v8优化机制
- 脚本流
- 字节码缓存
- 懒解析
介绍 RAF requetAnimate Frame
要想动画流畅 ,更新频率要 60 帧/s ,即 16.67ms 更新一次视图 setTimeout 要手动控制频率,而 RAF 浏览器会自动控制 后台标签或隐藏 iframe 中,RAF 会暂停,而 setTimeout 依然执行