Voyz's Studio.

前端常见性能优化方案总结

字数统计: 1.6k阅读时长: 5 min
2021/05/02 Share

前端常见性能优化方案总结

指标:

* TTFP(Time To First Paint):指的是从网页 HTTP 请求发出,到用户可以看到第一个有意义的内容渲染出来的时间差
* TTI(Time To Interactive):指的是从网页 HTTP 请求发出,到用户可以对网页内容进行交互的时间

我的项目中的优化

- RN
    * 场景转换时预加载
    * 地图输出图片优化
    * memo,SCU减少渲染次数优化
    * sectionList代替scrollView渲染长列表
    * 动画使用硬件加速,部分使用setNativeProps代替
- Nfes
    * 服务端渲染
    * react常用优化方式

性能优化原则

* 多使用内存、缓存或其他方法
* 减少CPU计算量、减少网络加载耗时
* (适用于所有编程的性能优化 —— 空间换时间)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
页面的加载过程主要分为【下载、解析、渲染】三个步骤,整体可以从两个角度来考虑:

** 网页的资源请求与加载阶段 **
1、划分子域
Chrome 浏览器只允许每个源拥有 6 个 TCP 连接,因此可以通过划分子域的方式,将多个资源分布在不同子域上用来减少请求队列的等待时间。
2、DNS 预解析
DNS 解析也是需要时间的,可以通过预解析的方式来预先获得域名所对应的IP,这个过程是并行的,不会阻塞页面渲染。
<link rel="dns-prefetch" href="https://www.google.com”>
3、预加载
有些资源不需要马上用到,但是希望尽早获取,这时候就可以使用预加载。预加载其实是声明式的 fetch,强制浏览器请求资源,并且不会阻塞 onload 事件。预加载可以一定程度上降低首屏的加载时间,因为可以将一些不影响首屏但重要的文件延后加载,唯一缺点就是兼容性不好。
<link rel="preload" href="http://example.com”>
4、CND 加速
webpack中output、url-loader中加publicPath属性
5、设置缓存
对于大部分的场景都可以使用强缓存配合协商缓存解决,但是在一些特殊的地方可能需要选择特殊的缓存策略
* 对于某些不需要缓存的资源,可以使用Cache-control: no-store,表示该资源不需要缓存
* 对于频繁变动的资源,可以使用Cache-Control: no-cache并配合ETag使用,表示该资源已被缓存,但是每次都会发送请求询问资源是否更新。
* 对于代码文件来说,通常使用Cache-Control: max-age=31536000并配合策略缓存使用,然后对文件进行指纹处理,一旦文件名变动就会立刻下载新的文件。
6、使用 HTTP / 2.0
引入了多路复用,能够让多个请求使用同一个 TCP 链接,极大的加快了网页的加载速度。并且还支持 Header 压缩,进一步的减少了请求的数据大小。
7、图片和文件压缩
* 打包和逆向拆分chunk
* css合并
* 选择正确的图片格式:对于能够显示 WebP 格式的浏览器尽量使用 WebP 格式;小图使用 PNG;图标使用SVG;照片使用 JPEG
* 小图使用 base64 格式
* 资源合并:雪碧图

** 网页渲染阶段 **
1、标签位置
script 标签放在 body 标签底部,或者添加 defer 或者 async 属性。
CSS放在head
2、懒加载
3、预加载
4、减少回流与重绘:当 页面布局和几何属性改变时,就会触发【回流】。当 需要更新的只是元素的某些外观时,就会触发【重绘】。
* 用 translate 替代 top 属性:top 会触发 reflow,但 translate 不会
* 不要一条一条地修改 DOM 的样式,预先定义好 class,然后修改 DOM 的 className
* 把 DOM 离线后修改,比如:先把 DOM 给 display:none(有一次 reflow),然后你修改 100 次,然后再把它显示出来
* 不要把 DOM 节点的属性值放在一个循环里当成循环的变量
* offsetHeight、offsetWidth 每次都要刷新缓冲区,缓冲机制被破坏,先用变量存储下来
* 不要使用 table 布局,可能很小的一个小改动会造成整个 table 的重新布局
* 动画实现的速度的选择:选择合适的动画速度
* 启用 gpu 硬件加速(并行运算),gpu 加速意味着数据需要从 cpu 走总线到 gpu 传输,需要考虑传输损耗.
* transform:translateZ(0)
* transform:translate3D(0)
5、编写高效率的 CSS
使用 CSS 预处理器时注意不要有过多的嵌套,嵌套层次过深会影响浏览器查找选择器的速度,且一定程度上会产生出很多冗余的字节
6、减少 DOM 元素数量、减少 DOM 的操作
减少 DOM 元素数量,合理利用 :after、:before 等伪类,避免页面过深的层级嵌套;
减少 DOM 操作次数(或集中操作),如数据分页、首屏直出、按需加载等
7、函数节流
节流、防抖函数
8、事件代理

react优化

* 单个组件的优化
    SCU、memo
* 减少函数bind this的次数,在constructor() 里做 this 绑定
    在每次 render 过程中, 再调用bind都会新建一个新的函数,浪费资源.
* 基于路由的代码分割
    使用React.lazy和React Router来配置基于路由的代码分割
* 渲染列表时加key
* 自定义事件、DOM事件及时销毁
* 合理使用异步组件
* 使用SSR
* 长列表使用虚拟列表
* 使用prop-types

webpack打包优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
优化产出代码(产品性能):1.体积更小 2.合理分包,不重复加载 3.速度更快、内存使用更小
* 小图片base64编码
* bundle加hash:根据文件内容算hash,利用缓存提升效率
* 懒加载:异步加载
* 提取公共代码:分包
* IgnorePlugin:减小bundle体积
* 使用CDN加速:output、url-loader中加publicPath属性
* mode:’production’
- 会自动开启压缩代码
- 自动删掉调试代码
- 启动Tree-Shaking:没有用到的函数会自动删掉
* Scope Hosting
- 多个函数合并成一个函数
- 代码体积更小
- 创建函数作用域更少
- 代码可读性更好
CATALOG
  1. 1. 前端常见性能优化方案总结
    1. 1.1. 指标:
    2. 1.2. 我的项目中的优化
    3. 1.3. 性能优化原则
    4. 1.4. react优化
    5. 1.5. webpack打包优化