渲染优化
1. 什么是关键渲染路径(Critical Rendering Path)?如何优化?
答案:关键渲染路径是浏览器将HTML、CSS和JavaScript转换为屏幕上的像素所经历的步骤。优化方法:
- 最小化关键资源数量
- 最小化关键字节数
- 最小化关键路径长度
- 优化CSS加载(内联关键CSS,异步加载非关键CSS)
- 延迟加载JavaScript
- 避免长时间运行的JavaScript
2. 什么是重绘(repaint)和重排(reflow)?如何减少它们?
答案:
- 重绘:元素外观改变,但不影响布局
- 重排:元素的位置或大小改变,需要重新计算布局
减少方法:
- 批量修改DOM
- 使用CSS类替代多个样式修改
- 使用transform和opacity进行动画
- 将频繁重排或重绘的元素设置为图层
- 使用绝对定位使元素脱离文档流
3. 什么是GPU加速?如何使用CSS触发GPU加速?
答案:GPU加速是利用图形处理器来加速渲染过程。触发GPU加速的CSS属性:
- transform
- opacity
- filter
- will-change
示例:
css
.accelerated {
transform: translateZ(0);
will-change: transform;
}
4. 如何优化JavaScript执行效率以提高渲染性能?
答案:优化JavaScript执行效率:
- 避免长时间运行的JavaScript
- 使用Web Workers处理复杂计算
- 使用requestAnimationFrame进行视觉更新
- 将大任务分解为小任务,分散执行
- 使用防抖(debounce)和节流(throttle)
- 避免频繁的垃圾回收
5. 什么是渲染阻塞资源?如何处理?
答案:渲染阻塞资源是阻止页面首次渲染的资源,主要是CSS和JavaScript。处理方法:
- 将CSS放在头部,JavaScript放在底部
- 使用async或defer属性加载非关键JavaScript
- 内联关键CSS
- 延迟加载非关键CSS
- 最小化和压缩CSS和JavaScript文件
6. 如何使用Performance API分析页面性能?
答案:使用Performance API分析性能:
- 使用performance.mark()标记关键点
- 使用performance.measure()测量时间段
- 使用performance.getEntriesByType()获取性能数据
- 使用PerformanceObserver监听性能事件
示例:
javascript
performance.mark('start');
// 执行一些操作
performance.mark('end');
performance.measure('操作耗时', 'start', 'end');
const measures = performance.getEntriesByType('measure');
console.log(measures);
7. 什么是RAIL性能模型?
答案:RAIL是一个以用户为中心的性能模型,代表:
- Response:事件处理应在50ms内完成
- Animation:每帧应在16ms内完成
- Idle:利用空闲时间完成延迟的工作
- Load:页面应在1000ms内呈现内容
优化策略应围绕这四个方面展开。
8. 如何优化首次内容绘制(First Contentful Paint, FCP)?
答案:优化FCP的方法:
- 最小化关键资源
- 减少服务器响应时间
- 消除渲染阻塞资源
- 内联关键CSS
- 预连接到所需的源
- 避免多个页面重定向
- 使用服务器端渲染
- 使用缓存策略
9. 什么是代码分割(Code Splitting)?它如何提高渲染性能?
答案:代码分割是将代码分解成小块,按需加载的技术。它提高渲染性能因为:
- 减少主包大小,加快首次加载
- 允许按需或并行加载代码
- 可以更好地利用缓存
实现方法:
- 使用动态import()
- 使用React.lazy和Suspense(React)
- 使用路由级别的代码分割
10. 如何优化长列表渲染?
答案:优化长列表渲染的方法:
- 虚拟滚动:只渲染可见区域的项
- 分页加载:每次只加载一部分数据
- 无限滚动:滚动到底部时加载更多
- 使用key属性帮助React优化更新
- 使用PureComponent或React.memo减少不必要的渲染
- 使用Web Workers处理大量数据
示例(使用react-window实现虚拟滚动):
jsx
import { FixedSizeList } from 'react-window';
const Row = ({ index, style }) => (
<div style={style}>Row {index}</div>
);
const List = () => (
<FixedSizeList
height={400}
width={300}
itemSize={35}
itemCount={10000}
>
{Row}
</FixedSizeList>
);