🏄‍♂️一个简单的hello, world,是如何通过React渲染出来的?

497 阅读1分钟

前言

在深入实现react之前,我们先来实现一个最简单的react应用。

// 创建my-app
npx create-react-app my-app

// 切换目录
cd my-app
cd src

// 删除src目录上的所有文件
rm -rf *
  
// 在src目录上创建index.js文件
touch index.js
// src/index.js
const element = <h1>hello, world</h1>;
const container = document.getElementById('root');
ReactDOM.render(element, container);

分析

现在,我们通过yarn start运行该应用

yarn start

然后在浏览器中打开localhost:3000,如下所示

在上面我们传入的<h1>hello,world</h1>既不是字符串,也不是html。那么它是什么呢?它是JSX,是js的语法扩展。通过JSX,我们可以更加方便的使用react。但是,JSX是不能在浏览器中直接运行的。

所以,为什么hello,world可以在浏览器中成功渲染出来呢?

现在,我们打开浏览器的控制台,切换到Sources面板,如下所示:

可以看到,在左侧边栏有一个static/js文件夹,打开这个文件夹,可以看到bundle.js文件,如图

然后通过command + f打开搜索面板,搜索hello, world

通过调试,我们可以知道这里的react_WEBPACK_IMPORTED_MODULE_0__default()其实就是React,所以,实际上<h1>hello,world</h1>这段JSX代码被转换成了React.createElement(...)的样子

// 源码
const element = <h1>hello, world</h1>


// 编译后
const element = React.createElement('h1',{...}, 'hello world');
                                         

而整个编译过程实际都是由babel来完成的。所以在react源码中我们不需要实现jsx的编译工作。

那么这里的React.createElement又是用来干嘛的呢?

从官网的解释可以知道,它是用来生成react元素的

现在,我们来看看react元素长什么样?

// src/index.js
console.log('element', element);

接着ReactDOM.render方法会将react元素渲染到屏幕上。

ReactDOM.render(element)

总结

所以渲染出hello world的整个过程,经过了如下3步: