这个项目将尝试通过手写的方式来尽可能实现一个相对比较完整的React.并在实现的过程中通过笔记来记录下来一步步实现的过程.
实现的过程将从React 15版本的API开始,一步步来实现,不直接去实现17版本是为了更深入地去了解React API,以及明白React在一次次迭代中是如何进行架构的变更和优化.
所以在实现的过程中,前期大多是按照15版本的一些特性来实现的,比如jsx转换,事件池,组件堆栈等等在新版本都是不同的实现或者有所升级,但并不担心,我们会一步步地去跟随着来实现.
另外,这个项目也不追求还原率,也不会写一些比较骚的代码,旨在以最简洁,最容易懂的代码来实现最基本的功能,以便快速梳理完React的整个框架.当大体的API我们都已经完成得八九不离十了,这个时候可以来尝试对具体API进行进一步的优化与完善,处理好各种边界问题.明白React的各种设计思想才是最重要的.
使用npx create-react-app react-handwritten
命令来快速创建一个项目,删除public和
src目录下面的所有文件.
然后在public目录下创建一个index.html
文件,放入最简单的一个html文件.
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>React handwritten</title>
</head>
<body>
<div id="root"></div>
</body>
</html>
在src目录下创建一个index.js
文件,写下一个最简单的React组件代码.
import React from 'react';
import ReactDOM from 'react-dom';
const element = <h1>hello <span>world!</span></h1>;
ReactDOM.render(
element, document.getElementById('root')
);
接下来我们来一步步地实现React的各种API,并把每个功能以序号.功能点
的形式创建分支,每一个分支会在前一个分支的基础上来创建,并在doc
目录记录下当前API的实现过程.以及会建一个对应的Issue,实现该功能点的相关代码都会关联到这个Issue上面.就像下面这样
比如第一步,我们来从1.createElement开始.