一、网络传输层面优化
-
CDN:内容分发网络
优化方向:首屏加载速度(FCP)
优化原因:提供资源的服务器距离用户更近,延迟更低。源服务器资源分配给CDN减少了负载
CDN原理:(引用文章)
CDN使用场景:
- 开源的项目可以用第三方CDN服务
- 可以将自己网站的静态资源放在CDN上,如js,css,图片等
- 直播传送:CDN支持流媒体,采用主动推送的方式进行
-
http强缓存,协商缓存
-
gzip压缩,减少传输带宽
二、代码逻辑层面,开发时的优化
-
编写JS监听浏览器可视区域,动态加载某些数据
优化方向:首屏加载速度(FCP)
优化原因:滚动屏幕之前,可视化区域之外的数据不会加载。减少服务器压力,也减少浏览器负担。防止加载过 多暂时用不到的数据影响其他资源文件加载
懒加载的应用和实现:
- 图片懒加载:对src赋值图片才开始加载,当图片出现在浏览器可视区域后,拿到图片dom将提前存好地址赋值给src即可。也可以将路径放在data-*属性上(HTML5特性更优雅),然后赋值给src
- 虚拟列表:(1000+长度)监听浏览器可视区域,计算出列表中应该渲染的起始下标和结束下标,css用绝对定位的方式实现每个item的渲染
计算可视区域的关键变量:scrollTop是内容被隐藏的像素数,也就是滚动条滚动的高度,offsetTop相对其offsetParent的顶部内边距的像素,window.innerHeight浏览器视口高度
插曲:预加载
优化原因:和懒加载相反,将所需的资源提前加载到本地,后面在需要用到时候直接从缓存取资源。减少用户等待时间。 2. 防抖节流
优化方向:提高js执行效率,防止一些操作触发过于频繁
优化原因:结合定时器和闭包,在每次事件触发时判断要不要执行业务逻辑
防抖场景:
- 按钮提交,只执行最后一次
- 服务端验证,执行一段连续输入的最后一次(配合联想词搜索功能食用更佳)
节流场景:
- 拖拽场景:一段时间只执行一次,防止频繁触发导致卡顿
- 缩放场景:对浏览器size的监控场景
- 动画场景:一段时间执行一次动画
3. 复杂计算开启web worker多线程计算 4. 使用事件委托
vue框架的优化
- v-for + key
- 路由懒加载
- 第三方插件按需引入
- 使用computed和watch缓存结果
- 组件卸载
react框架的优化
- map + key
- 路由懒加载
- 第三方插件按需引入
- 用useCallback,useMemo,memo缓存组件和函数
三、浏览器渲染层面优化
-
尽量避免回流
优化方向:提高页面加载速度,减少js执行时间,提高页面渲染速度 优化原因:回流(重排)会导致对渲染树的一部分重新布局,性能开销大。重绘不影响在文档流的位置,只针对 元素进行重新绘制。
导致回流的变化场景:浏览器窗口,元素内容,元素尺寸、位置,字体大小,激活CSS伪类,添加删除DOM
优化实践:
- 更改元素样式不要一行一行的改dom,写在新class中,给元素添加class统一更改,将多次回流变为一次
- 将元素先设为display:none改完样式后再显现出来
- DOM多个读写操纵不要穿插,详情了解浏览器渲染队列机制(链接)
- 用定位脱离文档流,减少回流面积
四、图片优化
直接上结论~
- 能用CSS代替就不用图片
- 小图用base64编码,不用引入外部资源依赖少发一次请求(用Webpack构建工具配置使用)
- 将多个图标整合到一个图片中(雪碧图)
- 选择图片格式:浏览器Webp,小图png,照片jpeg
五、打包构建时的优化
-
Loader
优化Babel:Babel将代码生成AST,然后再生成新的代码,转换代码越多效率越低
Webpack配置优化搜索范围: 优化方向:打包速度 优化原因:减少没必要的文件编译
rules:[
{
test: /\.js$/,
loader: 'babel-loader',
// 只在src下查找
include: [resolve('src')],
// 忽略的路径
exclude: /node_modules/
}
]
还可以配置缓存将babel编译过的文件缓存起来
-
Plugins
HappyPack:将Loader同步执行转换为并行
优化方向:打包速度 优化原因:将单线程打包转换为多线程打包,充分利用系统资源,适合大项目优化
loader: [{
……
loader: 'happypack/loader?id=happyBabel'
}]
plugins: [
new HappyPack({
id: 'happyBabel',
loaders: ['babel-loader?cacheDirectory'],
// 开启4个进程
threads: 4
})
]
-
代码压缩
-
Tree Shaking
-
Code Splitting
持续创作中……