8000 GitHub - gaoxiaoduan/build-my-react: build-your-own-react
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

gaoxiaoduan/build-my-react

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

构建一个自己的 react

本仓库用与实践 didact,构建一个你自己的简版 react

目标实现

  • 渲染 dom 元素
  • 创建 element & JSX
  • 虚拟 dom & diff
  • components & state
  • Fiber

启动项目 🚀

  • clone 本项目 git clone https://github.com/gaoxiaoduan/build-my-react.git
  • 进入项目 目录 cd build-my-react
  • 编译项目 npm run build ⚠️ 项目暂未使用热更新,每次修改代码后需要重新 build : (
  • 可以使用http-server 或者 使用 vscode 插件 live-server运行 index.html

关于 Fiber

因为 React 16 带来了一个新的架构 Fiber,所以需要重构大部分的代码,本项目根据此文章重构

为什么需要 Fiber?

因为当浏览器的主线程被一些任务占用了较长的时间,那么会有一些关键的简短任务必须要等待长任务执行完毕才能完成。

这里有一个小demo,用于演示这个问题,为了保持行星旋转,主线程需要每 16 毫秒左右有一个瞬间可用。如果主线程被阻塞做其他事情,比如说 200 毫秒,你会注意到动画丢失帧并且行星冻结,直到主线程再次空闲

那么在我们构建的 react 中,是什么会占用主线程那么长的时间呢?

问题就出现在reconcile()的过程中,因为它依靠递归调用,所以很难让它暂停,所以一旦开始调和的过程,其他任务只能等主线程调和任务结束,这就是为什么使用 Fiber 来重写它,Fiber 允许我们循环替换递归,达到异步可中断更新的目的

异步可中断更新可以理解为:更新在执行过程中可能会被打断(浏览器时间分片用尽或有更高优任务插队),当可以继续执行时恢复之前执行的中间状态。有点类似 Generator

于是全新的 Fiber 架构应运而生

fiber.js

TODO:

  • 这里我们实现了异步可中断更新,还缺少根据优先级安排更新

About

build-your-own-react

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published
0