Skip to content

渲染优化

1. 什么是关键渲染路径(Critical Rendering Path)?如何优化?

答案:关键渲染路径是浏览器将HTML、CSS和JavaScript转换为屏幕上的像素所经历的步骤。优化方法:

  1. 最小化关键资源数量
  2. 最小化关键字节数
  3. 最小化关键路径长度
  4. 优化CSS加载(内联关键CSS,异步加载非关键CSS)
  5. 延迟加载JavaScript
  6. 避免长时间运行的JavaScript

2. 什么是重绘(repaint)和重排(reflow)?如何减少它们?

答案

  • 重绘:元素外观改变,但不影响布局
  • 重排:元素的位置或大小改变,需要重新计算布局

减少方法:

  1. 批量修改DOM
  2. 使用CSS类替代多个样式修改
  3. 使用transform和opacity进行动画
  4. 将频繁重排或重绘的元素设置为图层
  5. 使用绝对定位使元素脱离文档流

3. 什么是GPU加速?如何使用CSS触发GPU加速?

答案:GPU加速是利用图形处理器来加速渲染过程。触发GPU加速的CSS属性:

  1. transform
  2. opacity
  3. filter
  4. will-change

示例:

css
.accelerated {
    transform: translateZ(0);
    will-change: transform;
}

4. 如何优化JavaScript执行效率以提高渲染性能?

答案:优化JavaScript执行效率:

  1. 避免长时间运行的JavaScript
  2. 使用Web Workers处理复杂计算
  3. 使用requestAnimationFrame进行视觉更新
  4. 将大任务分解为小任务,分散执行
  5. 使用防抖(debounce)和节流(throttle)
  6. 避免频繁的垃圾回收

5. 什么是渲染阻塞资源?如何处理?

答案:渲染阻塞资源是阻止页面首次渲染的资源,主要是CSS和JavaScript。处理方法:

  1. 将CSS放在头部,JavaScript放在底部
  2. 使用async或defer属性加载非关键JavaScript
  3. 内联关键CSS
  4. 延迟加载非关键CSS
  5. 最小化和压缩CSS和JavaScript文件

6. 如何使用Performance API分析页面性能?

答案:使用Performance API分析性能:

  1. 使用performance.mark()标记关键点
  2. 使用performance.measure()测量时间段
  3. 使用performance.getEntriesByType()获取性能数据
  4. 使用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的方法:

  1. 最小化关键资源
  2. 减少服务器响应时间
  3. 消除渲染阻塞资源
  4. 内联关键CSS
  5. 预连接到所需的源
  6. 避免多个页面重定向
  7. 使用服务器端渲染
  8. 使用缓存策略

9. 什么是代码分割(Code Splitting)?它如何提高渲染性能?

答案:代码分割是将代码分解成小块,按需加载的技术。它提高渲染性能因为:

  1. 减少主包大小,加快首次加载
  2. 允许按需或并行加载代码
  3. 可以更好地利用缓存

实现方法:

  1. 使用动态import()
  2. 使用React.lazy和Suspense(React)
  3. 使用路由级别的代码分割

10. 如何优化长列表渲染?

答案:优化长列表渲染的方法:

  1. 虚拟滚动:只渲染可见区域的项
  2. 分页加载:每次只加载一部分数据
  3. 无限滚动:滚动到底部时加载更多
  4. 使用key属性帮助React优化更新
  5. 使用PureComponent或React.memo减少不必要的渲染
  6. 使用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>
);