React:渲染帧和事件循环是什么关系

React为减缓浏览器单帧渲染压力做了时间切片处理,然后通过宏任务进行调度,其底层基于浏览器的渲染 和事件循环 的原理。浏览器中的渲染帧 和事件循环是紧密协作但职责分明的两个核心机制,它们的关系可以通过以下要点清晰呈现:


1. 层级关系

plaintext 复制代码
事件循环(Event Loop)
├─ 宏任务队列(Task Queue)
├─ 微任务队列(Microtask Queue)
└─ 渲染帧(Frame)
   ├─ 样式计算(Style)
   ├─ 布局(Layout)
   └─ 绘制(Paint)

2. 协作流程

在 react/packages/scheduler/src/forks/Scheduler.js 中体现的协作逻辑:

javascript 复制代码
function performWorkUntilDeadline() {
  // 阶段1:执行宏任务(如React调度任务)
  flushWork(); 
  
  // 阶段2:清空微任务队列(浏览器内部行为)
  
  // 阶段3:执行渲染管线(浏览器内部行为)
  if(needsPaint) requestPaint(); 
}

标准事件循环迭代:

  1. 从宏任务队列取出一个任务执行
  2. 执行所有微任务(直到队列清空)
  3. 执行渲染管线(如果需要)
  4. 进入下一轮循环

3. 关键差异

特性 事件循环 渲染帧
触发频率 持续运行 按屏幕刷新率触发(如60Hz)
核心职责 任务调度与执行 视觉更新计算
可中断性 不可中断(必须执行到微任务清空) 可跳过部分阶段
性能影响 长任务导致事件循环卡顿 复杂样式导致渲染耗时

4. React的协调策略

React调度器通过时间切片主动适配两者:

javascript 复制代码
function workLoop() {
  while (task && !shouldYield()) {
    process(task); // 每次执行不超过5ms
  }
  // 主动让出控制权给浏览器
  if (hasMoreWork) schedulePerformWorkUntilDeadline();
}

这样设计使得:

  1. 事件循环不会被长时间阻塞
  2. 渲染帧能获得稳定的执行机会
  3. 高优先级更新能及时反映到视图

5. 实际案例对比

原生事件循环:

javascript 复制代码
// 案例1:阻塞型微任务
Promise.resolve().then(() => {
  heavyTask(50ms); // 直接导致3帧丢失
});

React调度:

javascript 复制代码
// 案例2:时间切片
function task() {
  chunkedWork(5ms); // 分块执行
  if (remainingWork) {
    scheduleTask(task); // 下一宏任务继续
  }
}

总结关系图

plaintext 复制代码
[事件循环] ← 控制权交替 → [渲染帧]
   ↑                       ↑
   │                       │
宏任务/微任务           样式/布局/绘制
   │                       │
   └─── React调度器协调 ───┘

这种设计就像双人接力赛跑:

  • 事件循环是持棒的奔跑者(必须持续前进)
  • 渲染帧是交棒检查点(按固定节奏接棒)
  • React调度器是教练(控制交接时机和节奏)

问题

问:如果React代码中有比执行较长时间的微任务呢?也能保持流畅吗?

答:当然是否定。因为React对宏任务做了时间切片,微任务在渲染之前执行,如果时间过长,仍然会阻塞渲染。

相关推荐
山雀~4 小时前
CSP 安全漏洞修复
前端·网络协议
陌离5 小时前
Go-Gui:一套 无限接近 现代化UI的 GPU绘制界面组件框架
前端
咚咚咚小柒5 小时前
【前端】LangChain.js学习
前端·javascript·人工智能·typescript·langchain·vue·ai编程
2401_885885045 小时前
巴林语音通知接口如何对接?系统告警语音API接入教程
android·前端·网络·python·语音识别
java1234_小锋5 小时前
【技术专题】CSS3 网页技术 - CSS3 盒模型
前端·css·css3
计算机魔术师5 小时前
手握芯片、又要吞下开源分发入口,英伟达被盯上了
前端
段一凡-华北理工大学6 小时前
高炉能源系统智能化:热风炉、煤气与极致能效~系列文章07:高炉煤气:产生规律与全厂用户平衡
java·前端·能源
前端架构师-老李6 小时前
HTML与CSS基础第四课—strong、em、b、i 各表示什么
前端·css·html
king王一帅7 小时前
AI 时代一群人在卷笔记软件,我想先把 Markdown 编辑器的底层做好
前端·ai编程·markdown
用户11481867894847 小时前
盲水印:DCT-QIM 从原理到踩坑
前端