React Fiber = 任务切片 + 时间切片

一句话分清

  • 任务切片 = 把一个大任务拆成很多个小任务
  • 时间切片 = 给这些小任务限定执行时间,到点就停,不卡页面

React Fiber = 任务切片 + 时间切片


1. 任务切片(Task Splitting)

是什么?

把一个巨大、一口气执行不完的任务 ,

拆成一个个可以分步执行的小单元。

目的

  • 任务可以随时停下来
  • 可以随时继续
  • 可以被高优先级任务插队
  • 可以废弃旧任务

形象比喻

你要搬 1000 块砖:

  • 不切片:一次性搬完 → 累死(页面卡死)
  • 任务切片:分成 1000 次,每次搬 1 块

这就是 Fiber 做的事:

把整棵虚拟 DOM 树

→ 拆成一个个 Fiber 节点

每个节点就是一个小任务单元。

代码层面理解

js 复制代码
// 不切片(卡死)
for (let i=0; i<10000; i++) {
  heavyWork(i)
}

// 任务切片(拆成小任务)
let i = 0
function work() {
  heavyWork(i)
  i++
  if (i < 10000) {
    nextWork(work) // 下次再做
  }
}

任务切片 = 结构拆分


2. 时间切片(Time Slicing)

是什么?

规定:主线程每次最多只能执行 X ms(React 是 5ms)

时间一到,必须让出主线程给浏览器渲染。

目的

  • 不让 JS 长时间霸占线程
  • 保证页面流畅不卡顿
  • 保证输入、点击、动画不延迟

形象比喻

你有 1 小时搬砖时间:

  • 不切片:一直搬,不休息 → 页面卡死
  • 时间切片:每搬 5 分钟就休息一下,让页面先渲染

代码层面理解

js 复制代码
function run() {
  const start = performance.now()

  // 最多执行 5ms
  while (performance.now() - start < 5) {
    if (!hasTask()) break
    doOneTask()
  }

  // 时间到了,休息,下次继续
  schedule(run)
}

时间切片 = 时间控制


3. 两者关系(最关键)

没有任务切片 → 时间切片毫无意义

如果任务是整块不可拆分 的,

你想停也停不下来。

没有时间切片 → 任务切片白拆了

任务拆小了,但你一口气执行完 ,

还是会卡页面。


4. 结合 React 一句话总结

Fiber 架构 =

  1. 任务切片

    把虚拟 DOM 树 → 拆成一个个 Fiber 节点

    实现:可中断、可恢复、可插队、可放弃

  2. 时间切片

    用 MessageChannel 控制每 5ms 让出主线程

    实现:不阻塞渲染、页面流畅


5. 超级精简记忆(面试必背)

  • 任务切片 = 把大任务拆小(结构层面)
  • 时间切片 = 每 5ms 强制暂停(时间层面)
  • Fiber = 任务切片 + 时间切片
  • 任务切片让它能停,时间切片让它必须停

相关推荐
子兮曰3 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰3 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万3 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝3 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋3 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁3 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
汉堡大王95273 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大3 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师3 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端
沙蒿同学3 天前
我用 Go 搭了一条 AI Agent 流水线:从 1 张商品图到一整套淘宝详情页
前端·javascript·后端