react@17.0.2源码解读:写在前面的话

174 阅读3分钟

「这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战」。

react是对数据映射到视图的一个抽象,它是跨平台的。

阅读npm包好习惯,先看package.json文件。

  "workspaces": [
    "packages/*"
  ],

react生态的作者目前为止有1130位,主创是facebook的成员。 如此多得开发者,分工明确很重要。

workspaces

这里出现了一个npm概念:workspaces[工作空间]。 那么笔者就不厌其烦得介绍这一概念,已经理解的读者可自行跳过。

术语【工作空间】的概念

指在一个单一顶层根包内,npm命令行提供的一套管理本地文件系统中多个包的特性集合。这套特性组成了一个更加流线型的工作流去处理本地文件链接。在执行npm install命令时自动链接程序,避免手动调用npm link,以便将需要链接到当前node_modules目录的包添加到引用中。 说了一大堆,主要作用就是这些包的依赖共享,同时这些包可以相互依赖。下面是react工作空间中的部分包。

1637591216(1).png 比如react工作空间的这些包都共同依赖shared包。我们这里说的阅读源码,主要是阅读react包。

react包的组成部分

  • React.js文件的作用是将react的所有对外api导出。
  • ReactAct.js文件的作用是管理react的行为,异步或同步的行为,比如批量更新视图队列。
  • ReactBaseClasses.js包含了react两个最常用的类Component和PureComponent,所有react页面都会继承这两个类。
  • ReactChildren.js则提供了对象虚拟dom树的遍历功能。
  • ReactContext.js是react对生产者消费者模式的封装,在一些优雅的代码中,会用到ReactContext。
  • ReactCreateRef.js则提供了生成虚拟dom到真实dom引用的方法。
  • ReactElement则提供了创建虚拟dom的方法。
  • ReactHook.js则提供了一些内置的钩子函数,让函数组件也拥有完整的生命周期。
  • ReactMemo.js提供了对组件缓存的封装。
  • ReactNoopUpdateQueue.js提供了对更新队列的封装,它的作用是合并setState请求,减少视图更新。 还有一些比较小的js并没有列出,但也会在接下来的章节中作详细的分析。

react包的发布方式

'use strict';

if (process.env.NODE_ENV === 'production') {
  module.exports = require('./cjs/react.production.min.js');
} else {
  module.exports = require('./cjs/react.development.js');
}

直接通过npm安装得到的react包,可以看到,它导出的是一个打包过的包,这样可以避免项目打包时的耗时操作。像一些简单的包,可能不会打包,想react或者vue这样大型的框架,则会预先打包好,然后发布到npm上。

总结一下,react工作空间的代码分工明确,实现优雅,作了高度的抽象,是一个非常值得学习的库。 感谢阅读,觉得对你有启发,那就动动你的小手,鼓励一下作者。