前端性能优化
网页生成过程:
- HTML代码转化成DOM
- CSS代码转化成CSSOM(CSS Object Model)
- 结合DOM和CSSOM,生成一棵渲染树(包含每个节点的视觉信息)
- 生成布局(layout),即将所有渲染树的所有节点进行平面合成
- 将布局绘制(paint)在屏幕上
渲染:耗时的第四步(生成布局\flow)和第五步(绘制\paint)
重排(reflow)和重绘(repaint)
- 重绘不一定重排(例如仅改变文字颜色)
- 重排一定重绘(例如改变文字位置)
对于性能的影响
将CSS的读操作和写操作分离
提高性能的九个技巧
- 同上条。不要在两个读操作之间,加入一个写操作。
- 如果某个样式是通过重排得到的,那么最好缓存结果。
- 不要一条条地改变样式,而要通过改变class,或者csstext属性,一次性地改变样式。
- 尽量使用离线DOM,而不是真实的DOM来改变元素样式。
- 例如操作Document Fragment对象,完成后再把这个对象加入DOM。
- 例如使用 cloneNode() 方法,在克隆的节点上进行操作,然后再用克隆的节点替换原始节点。
- 先将元素设为display: none(需要1次重排和重绘),然后对这个节点进行100次操作,最后再恢复显示(需要1次重排和重绘)。这样就用两次重新渲染,取代了可能高达100次的重新渲染。
- position属性为absolute或fixed的元素,重排的开销会比较小,因为不用考虑它对其他元素的影响。
- 只在必要的时候,才将元素的display属性为可见,因为不可见的元素不影响重排和重绘。(visibility : hidden的元素只对重绘有影响,不影响重排。)
- 使用虚拟DOM的脚本库,比如React等。
- 使用 window.requestAnimationFrame()、window.requestIdleCallback() 这两个方法调节重新渲染(详见后文)。
网友评论