中国有句古话叫“授人以鱼不如授人以渔”,说的是传授给人以知识,不如传授给人学习知识的方法。道理其实很简单,鱼是目的,钓鱼是手段,一条鱼能解一时之饥,却不能解长久之饥,若是想永远有鱼吃,那就要学会钓鱼的方法。html
这篇文章将为你们分享如何去探索React内部运行机制。前端
实践是检验真理的惟一标准。node
Go to downloadreact
咱们把React源码拉下来以后会可以看到它的目录结构后 ,那么你的心情或许是下面这样的git
当咱们对React源码结构有了一个大概的了解以后,真的要对每一个目录下的文件看一遍吗?github
我是不建议这样的,由于React源码中文件数量庞大,而且各个文件之间的引入关系至关复杂,因此这时候咱们还须要探索是否有其余更好的方式去打开React的神秘大门。web
如今的前端项目通常是模块化开发,开发中会用到各类依赖包,这样的话在项目中就少不了package.json
这个文件,在package.json
文件中的script
模块下面会暴露出各类命令用以实现不一样的目的。咱们在React项目中package.json
文件中script
模块发现一个至关重要的命令算法
"build": "node ./scripts/rollup/build.js"
复制代码
这个命令的做用是打包,就是将各个文件目录下的模块文件打包中最终的文件。当成功打包后会获得两个主要的文件。chrome
/build/dist/react.development.js
/build/dist/react-dom.development.js
复制代码
上面两个文件分别用于React和ReactDOM对象的定义与导出,使用时以下面这样。json
import React, { Component } from 'react';
import ReactDOM from 'react-dom'
复制代码
在react.development.js
和react-dom.development.js
两个文件中看代码相对于直接看React源码有一个明显的好处是全部的对象与函数定义都在同一个文件中,省去了多个文件的跳转。可是与之同时而来的另外一个缺点就是代码量太过于庞大。其中react-dom.development.js
文件的代码已经超过了25000行,每一个函数之间的调用关系也是很难屡清。那么对于React源码还有更好的梳理方式吗?
咱们先写一个很是简单的demo,就像下面这样。
app.jsx
import React from 'react';
import {render} from 'react-dom';
import HelloReact from './HelloReact';
// 这里加上debugger有助于在Chrome控制台添加断点
debugger;
render(<HelloReact name="Taylor" />, document.getElementById('root')); 复制代码
HelloReact.jsx
import React, {Component} from 'react'
class HelloReact extends Component{
render() {
debugger
return (
<div> Hello {this.props.name} </div>
);
}
}
export default HelloReact
复制代码
上面这个程序是 React官方网站 提供的第一个demo,它一个最基础的React使用案例。咱们在这个demo运行时使用Chrome调试工具加上断点便可获知React组件的渲染流程以及函数直接的调用关系。
断点该怎么加?加到哪里?
一、入口函数
二、函数内部调用的其余函数
上面两个添加断点的方法是由外向内,咱们也能够由内向外添加断点。由内向外须要咱们找到整过demo执行流程的最后一个函数“节点”。
三、出口函数
四、函数的上一级调用函数
不少时候咱们本身分析一些问题老是局限于本身固有的思惟方式,惟有多获取别人的思想观点才能对问题理解更加深入、准确。
推荐文章
Inside Fiber: in-depth overview of the new reconciliation algorithm in React
「译」React Fiber 那些事: 深刻解析新的协调算法 彻底理解React Fiber