React 采用 monorepo 的管理方式。仓库中包含多个独立的包,以便于更改可以一起联调,并且问题只会出现在同一地方。

react

React “Core” 中包含所有全局 React API,比如:

1、React.createElement()

2、React.Component

3、React.Children

React 核心只包含定义组件必要的 API。它不包含协调算法或者其他平台特定的代码。它同时适用于 React DOM 和 React Native 组件。

React 核心代码在源码的 packages/react 目录中。在 npm 上发布为 react 包。相应的独立浏览器构建版本称为 react.js,它会导出一个称为 React 的全局对象。

import React from 'react';class Welcome extends React.Component {render() {return <h1>Hello, {this.props.name}</h1>;}
}

react-dom

React 最初只是服务于 DOM,但是这之后被改编成也能同时支持原生平台的 React Native。因此,在 React 内部机制中引入了“渲染器”这个概念。

渲染器用于管理一棵 React 树,使其根据底层平台进行不同的调用。

渲染器同样位于 packages/ 目录下:

React DOM Renderer 将 React 组件渲染成 DOM。它实现了全局 ReactDOMAPI,这在npm上作为 react-dom 包。这也可以作为单独浏览器版本使用,称为 react-dom.js,导出一个 ReactDOM 的全局对象.

import ReactDOM from 'react-dom';ReactDOM.render(<h1>Hello, world!</h1>,document.getElementById('root')
);

react-native

React Native使你只使用JavaScript也能编写原生移动应用。它在设计原理上和React一致,通过声明式的组件机制来搭建丰富多彩的用户界面。

import React, { Component } from 'react';
import { Text, View } from 'react-native';class WhyReactNativeIsSoGreat extends Component {render() {return (<View><Text>如果你喜欢在Web上使用React,那你也肯定会喜欢React Native.</Text><Text>基本上就是用原生组件比如'View'和'Text'来代替web组件'div'和'span'。</Text></View>);}
}

React Native Renderer 将 React 组件渲染为 Native 视图。此渲染器在 React Native 内部使用。

React Native 产出的并不是“网页应用”, 或者说“HTML5应用”,又或者“混合应用”。最终产品是一个真正的移动应用,从使用感受上和用 Objective-C 或 Java 编写的应用相比几乎是无法区分的。React Native 所使用的基础UI组件和原生应用完全一致。你要做的就是把这些基础组件使用JavaScript 和 React 的方式组合起来。

react-test-renderer

React Test Renderer 将 React 组件渲染为 JSON 树。这用于 Jest 的快照测试特性。在 npm 上作为 react-test-renderer 包发布。

import TestRenderer from 'react-test-renderer';function Link(props) {return <a href={props.page}>{props.children}</a>;
}const testRenderer = TestRenderer.create(<Link page="https://www.facebook.com/">Facebook</Link>
);console.log(testRenderer.toJSON());
// { type: 'a',
//   props: { href: 'https://www.facebook.com/' },
//   children: [ 'Facebook' ] }

本质上,该包可以在无需使用浏览器或 jsdom 的情况下,轻松地抓取由 React DOM 或 React Native渲染出的平台视图层次结构(类似于DOM树)。

reconciler

即便 React DOM 和 React Native 渲染器的区别很大,但也需要共享一些逻辑。特别是协调算法需要尽可能相似,这样可以让声明式渲染,自定义组件,state,生命周期方法和 refs 等特性,保持跨平台工作一致。

为了解决这个问题,不同的渲染器彼此共享一些代码。我们称 React 的这一部分为 “reconciler”。当处理类似于 setState() 这样的更新时,reconciler 会调用树中组件上的 render(),然后决定是否进行挂载,更新或是卸载操作。

Reconciler 没有单独的包,因为他们暂时没有公共 API。相反,它们被如 React DOM 和 React Native 的渲染器排除在外。

协调就是不同的渲染器彼此共享的一些代码,包括 diff 算法。当组件的 props 或 state 发生变化时,React 通过将最新返回的元素与原先渲染的元素进行比较,来决定是否有必要进行一次实际的 DOM 更新。当它们不相等时,React 才会更新 DOM。这个过程被称为“协调”。

“stack” reconciler 是 React 15 及更早的解决方案。Fiber 从 React 16 开始变成了默认的 reconciler。

react 源码概览相关推荐

  1. React事件机制 - 源码概览(下)

    上篇文档 React事件机制 - 源码概览(上)说到了事件执行阶段的构造合成事件部分,本文接着继续往下分析 批处理合成事件 入口是 runEventsInBatch // runEventsInBat ...

  2. 推荐一个 React 技术揭秘的项目,自顶向下的 React 源码分析

    大家好,我是你们的 猫哥,那个不喜欢吃鱼.又不喜欢喵 的超级猫 ~ just-react 这本书的宗旨是打造一本严谨.易懂的 React 源码分析教程. 为了达到这个目标,在行文上,本书会遵循: 不预 ...

  3. react源码解析之stack reconciler

    关于源码解读的系列文章,可以关注我的github的这个仓库, 现在才刚刚写,后续有空就写点.争取把react源码剖析透学习透.有不正确的地方希望大家帮忙指正.大家互相学习,共同进步. 本篇文章是官方文 ...

  4. build怎么调试 react_GitHub - bozhouyongqi/debug-react: 本地调试react源码环境

    [TOC] 工欲善其事,必先利其器. 在学习raect源码时,如果能够在浏览器中单步调试,势必会加深理解.其实可以借助webpack的resolve.alias将react等指向本地的目录,这样就不会 ...

  5. React源码分析与实现(一):组件的初始化与渲染

    原文链接地址:github.com/Nealyang 转载请注明出处 前言 战战兢兢写下开篇...也感谢小蘑菇大神以及网上各路大神的博客资料参考~ 阅读源码的方式有很多种,广度优先法.调用栈调试法等等 ...

  6. react源码分析-setState分析

    前言 是否有过这样的疑问: setState做了什么? setState是如何触发ui变化的? isWorking 如果此时isWorking为true,react将不会立即执行更新操作,而是把更新操 ...

  7. webuploader 怎么在react中_另辟蹊径搭建阅读React源码调试环境支持所有React版本细分文件断点调试...

    引言(为什么写这篇文章) 若要高效阅读和理解React源码,搭建调试环境是必不可少的一步.而常规方法:使用react.development.js和react-dom.development.js调试 ...

  8. onclick 源码_仿照React源码流程打造90行代码的Hooks

    作者:苏畅 转发链接:https://mp.weixin.qq.com/s/YLSD4IojDWTPlov_RQtVAA 前言 你可能已经看过其它简易的Hooks实现.那么本文和其它实现有什么区别呢? ...

  9. 《React源码解析》系列完结!

    前言 距离第一篇<React源码解析(一)>已经过去将近4个月的时间,由于是我第一次进行源码解析相关的写作,思路和文笔还不够成熟.一百多天以来,我基于读者反馈反思这几篇文章中的不足,同时也 ...

最新文章

  1. golang中文文档_Golang 标准库 限流器 time/rate 设计与实现
  2. centos7.5安装influxdb-1.7.8
  3. Mp3tag(MP3文件信息修改器) V2.79a 多语绿色版
  4. 关于递归函数,非递归函数中引用传参的问题
  5. 容器弹性云底层原理揭秘
  6. python超时处理_Python如何实现让一个函数超时退出?
  7. 如何测试前台获得的数据
  8. 清华大学操作系统OS学习(十五)——I/O子操作系统、同步或异步I/O、I/O结构、I/O结构
  9. MyBatis使用总结+整合Spring
  10. 局域网中的通信协议及选择简述。
  11. 点云纹理映射 matlab,一种点云模型纹理映射方法与系统与流程
  12. html中如何淡化背景图片,excel怎么去除背景图片
  13. UTF-8不是兼容Unicode吗? 那UTF-8也应该支持中文啊, 为什么上面的XML文档会 出现字符集错误的情况呢?
  14. 如何成为一名架构师?
  15. count(*)和count(1)和count(字段)的区别
  16. 高效短眠的10个好处及如何进行高效的睡眠
  17. 01 Android Studio学习第一天
  18. spring-环绕通知 @Around
  19. ad被锁定的账户_如何在AD中方便查询被锁定的帐号状态和特定条件的查询被锁定的帐号...
  20. CISAW证书发证机构是哪里?权威性如何?

热门文章

  1. 全网销售额超 2.67 亿!德施曼连续 5 年蝉联双11全网智能锁销冠
  2. Scikit-Learn 学得如何?程序员不容错过十大实用功能来袭
  3. 腾讯云首次披露虚拟化技术发展线路图,看好轻量级虚拟化的潜力
  4. 银泰抛弃传统数据库转投阿里云PolarDB 投入产出比增长2倍以上
  5. 美国确诊超46万!美国州长竟然抢起高龄程序员了,什么情况?
  6. Yaniv Erlich:DNA 很可能是人类终极的储存设备
  7. 光棍节就要到了,要不要给你介绍个 Python 对象?| CSDN 博文精选
  8. 你真的理解 Integer 的缓存问题吗?| CSDN 博文精选
  9. Python 2 即将退休,Fedora 怎么办?
  10. 惠普往事:全球最大的 PC 制造商炼成记!| 极客头条