React Fiber

68 阅读1分钟

Fiber

1.Fiber是一种数据结构,对象

2.Fiber是一个执行单元

执行流程

1.Fiber和浏览器交替获取控制权

1.每个帧的开头包括样式计算,布局和绘制等等

2.GUI渲染和Javascript的执行是互斥的

window.requestAnimationFrame

window.requestAnimationFrame(callback)
let start
let root = document.getElementById("root")

function animate(timeStart) {
  if(!start) start = timeStart
  console.log(timeStart - start)
  root.style.transform = "translateX(" + timeStart * 0.01 + "px)"
  if(timeStart < 10000)
    window.requestAnimationFrame(animate)
}
window.requestAnimationFrame(animate)

window.requestIdleCallback

浏览器空闲时调用

function sleep(duration) {
  let now = Date.now()
  while(duration + now > Date.now()) {
  }
}

sleep(2000)
console.log(123)

function works = [
  () => console.log('task 1'),
  () => console.log('task 2'),
  () => console.log('task 3'),
  () => console.log('task 4'),
  () => console.log('task 5'),
]

function progress(deadline) {
  console.log('剩余空闲时间:', deadline.timeRemaining())
  if(deadline.timeRemaining()>0 && works.length>0) {
    performUnitOfWork()
  }
  if(works.length>0) {
    window.requestIdleCallback(progress)
  }
}

function performUnitOfWork() {
  let work = works.shift()
  work()
}

window.requestIdelCallback(progress)

MessageChannel

let channel = new MessageChannel()
let port1 = channel.port1
let port2 = channel.port2
port1.onmessage = function(e) {
  console.log("接收到的数据:",e.data)
}
port2.onmessage = function(e) {
  console.log("接收到的数据:",e.data)
}
port1.postMessage("port1")
port2.postMessage("port2")

React Hooks & Fiber

hooks 就是通过把数据挂载到组件对应的 fiber 节点上来实现的

FiberNode.memoiedState useState()

FiberNode.queue setState()

FiberNode.updateQueue useEffect()

class组件 保存 自定义状态

function组件 保存 链表头指针