渲染阻塞由哪些原因引起?
- 网络: 请求过多或网络延迟大, 外部文件加载缓慢;
- CSS 与 JS 解析: 遇到
link/style/script 时引入外部文件; JS 阻塞 HTML 解析, CSS 阻塞渲染树生成; 二者执行时间过长都会阻塞渲染;
- JS 长时间任务: 阻塞主线程事件循环;
- 垃圾回收: 同样阻塞主线程事件循环;
- GPU: 某帧渲染操作过多, 无法在 16ms 内完成;
如何减少 JS 与 CSS 造成的阻塞?
- JS:
- 避免耗时操作, 用 Web Worker 或分片执行 (
setTimeout / requestAnimationFrame);
- 把
script 标签放到 body 底部;
- 用
defer/async 延迟或异步加载;
- CSS:
- 关键 CSS 内联进 HTML;
- 大体积 CSS 放到
body 底部;
- 用 JS 动态加载;
- GPU: 分片渲染;
如何监控帧率?
- 开发环境: 开发者工具 → more tools → rendering → frame rendering stats;
- 生产环境: 用
requestAnimationFrame 统计帧间隔;