🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] > react 更新到 17.0.0 (October 20, 2020) # 项目结构 目前有不少大型开源项目采用了 monorepo 这种方式,如 Babel,可以看到这些项目的第一级目录的内容以脚手架为主,主要内容都在 packages 目录中 分多个 package 进行管理: ```shell- ├── .circleci/ ---------------------------------- 使用 CircleCI 进行持续集成/持续部署 ├── .codesandbox/ ------------------------------- 使用 [CodeSandbox CI](https://codesandbox.io/docs/ci) 服务 ├── build/ -------------------------------------- 构建后的输出目录 ├── fixtures/ ----------------------------------- React 开发的测试用例 ├── packages/ ----------------------------------- 源码目录,我们主要剖析目录 │ ├── create-subscription/ -------------------- 在组件里订阅额外数据的工具 │ ├── dom-event-testing-library/ -------------- XXX │ ├── eslint-plugin-react-hooks --------------- XXX │ ├── jest-mock-scheduler/ -------------------- XXX │ ├── jest-react/ ----------------------------- XXX │ ├── react/ ---------------------------------- 核心代码 │ ├── react-art/ ------------------------------ 矢量图形库 │ ├── react-cache/ ---------------------------- XXX │ ├── react-client/ --------------------------- XXX │ ├── react-debug-tools/ ---------------------- XXX │ ├── react-devtools/ ------------------------- XXX │ ├── react-devtools-core/ -------------------- XXX │ ├── react-devtools-extensions/ ------------- XXX │ ├── react-devtools-inline/ ------------------ XXX │ ├── react-devtools-scheduling-profiler/ ----- XXX │ ├── react-devtools-shared/ ------------------ XXX │ ├── react-devtools-shell/ ------------------- XXX │ ├── react-dom/ ------------------------------ DOM 渲染相关 │ ├── react-fetch/ ---------------------------- XXXX │ ├── react-interactions/ --------------------- XXXX │ ├── react-is/ ------------------------------- React 元素类型相关 │ ├── react-native-renderer/ ------------------ react-native 渲染相关 │ ├── react-noop-renderer/ -------------------- Fiber 测试相关 │ ├── react-reconciler/ ----------------------- React 调制器 │ ├── react-refresh/ -------------------------- XXXX │ ├── react-server/ --------------------------- XXXX │ ├── react-test-renderer/ -------------------- 实验性的 React 渲染器 │ ├── react-transport-dom-relay/ -------------- XX │ ├── react-transport-dom-webpack/ ------------ XX │ ├── scheduler/ ------------------------------ 规划 React 初始化,更新等等 │ ├── shared/ --------------------------------- 通用代码 │ ├── use-subscription/ ----------------------- XXX ├── scripts ------------------------------------- 公共的lint,build,test和release等相关的文件 │ ├── babel/ ---------------------------------- babel 配置脚本目录 │ ├── bench/ ---------------------------------- bench 目录 │ ├── circleci/ ------------------------------- circle ci 构建目录 │ ├── error-codes/ ---------------------------- XXX │ ├── eslint/ -------------------------------- eslint 目录 │ ├── eslint-rules/ --------------------------- 语法规则和代码风格 │ ├── flow/ ----------------------------------- Flow 类型声明 │ ├── git/ ------------------------------------ git钩子的目录 │ ├── jest/ ----------------------------------- JavaScript 测试目录 │ ├── merge-fork/ ----------------------------- XXX │ ├── perf-counters/ -------------------------- XXX │ ├── prettier/ ------------------------------- prettier目录 │ ├── print-warnings/ ------------------------- XXX │ ├── release/ -------------------------------- 自动发布新版本脚本 │ ├── rollup/ --------------------------------- rollup 构建目录 │ ├── shared/ --------------------------------- 自动发布新版本脚本 │ ├── tasks/ ---------------------------------- 自动发布新版本脚本 │ ├── yarn/ ----------------------------------- 自动发布新版本脚本 │ ├── authors --------------------------------- shell 文件,可以根据 git shortlog 的输出生成一个 项目参与者的文件。 ├── .editorconfig ------------------------------- 编辑器语法规范配置 ├── .eslintignore ------------------------------- eslint 忽略配置 ├── .eslintrc.js -------------------------------- eslint 配置文件 ├── .gitattributes ------------------------------ 给 attributes 路径名的简单文本文件 ├── .gitignore ---------------------------------- git 忽略配置 ├── .mailmap ------------------------------------ 邮件列表档案 ├── .nvmrc -------------------------------------- nvm 配置文件 ├── .prettierignore ----------------------------- prettier 忽略文件 ├── .prettierrc.js ------------------------------ prettierrc 配置文件 ├── .watchmanconfig ----------------------------- watchman 配置文件 ├── appveyor.yml -------------------------------- GitHub 托管项目的自动化集成 ├── AUTHORS ------------------------------------- 开发者列表档案 ├── babel.config.js ----------------------------- babel 配置文件 ├── CHANGELOG.md -------------------------------- 更新日志 ├── CODE_OF_CONDUCT.md -------------------------- 行为准则 ├── CONTRIBUTING.md ----------------------------- Contributing to React ├── dangerfile.js ------------------------------- 提高 Code Review 体验 ├── netlify.toml -------------------------------- 持续集成静态网站 ├── package.json -------------------------------- 项目管理文件 ├── README.md ----------------------------------- 项目文档 ├── SECURITY.md --------------------------------- 安全问题说明 ├── yarn.lock ----------------------------------- yarn 加锁文件 ``` 一眼望去,上面的目录结构是不是感觉很是奇怪? **根目录下没有 src 之类的源码目录,也没有 test 这类的存放单元测试的目录,只有一个 packages 目录。这个 repository 其实是一个用 yarn 的 workspaces 来管理的 monorepo。实际上,我们往npm上发布的几个package都来自于同一个codebase,包括react、react-dom、react-is……**。 > npm 7 开始,包括了 workspaces 功能 > https://classic.yarnpkg.com/en/docs/workspaces/ > [yarn的WorkSpaces功能介绍](https://www.dazhuanlan.com/2019/12/25/5e027015a4775/) > [Monorepo——大型前端项目的代码管理方式](https://segmentfault.com/a/1190000019309820) # JSX [JSX(JavaScript XML)](http://facebook.github.io/jsx/) 是`js`内定义的一套类 XML 语法,可以解析出目标 js 代码,颠覆传统`js`写法。`HTML`由浏览器解析,而`JSX`是由`js`解析。当让也可以通过构建工具先解析生成,如`webpack`, 这样可以减少代码这行中 js 解析 JSX 的时间,这个后面会专题讲诉。 JSX 原本是使用官方自己提供的方法处理,2015-7-12 日官方[博客文章](http://facebook.github.io/react/blog/2015/06/12/deprecating-jstransform-and-react-tools.html)声明其自身用于 JSX 语法解析的编译器 JSTransform 已经过期,不再维护,`React JS`和`React Native`已经全部采用第三方`Babel`的 JSX 编译器实现。 babel 作为一个代码转换工具,它不仅仅能将 ES6 转化成 ES5,也能够**将 JSX 转换成某个函数嵌套调用的结构,而这个函数是可以自定义的**,具体请参考 [transform-react-jsx](https://babeljs.io/docs/plugins/transform-react-jsx/) [JSX 和 Virtual DOM](https://github.com/MuYunyun/blog/issues/24) [preact 源码学习系列之一:JSX解析与DOM渲染](https://github.com/youngwind/blog/issues/103) [可替代的JSX](https://www.zcfy.cc/article/alternatives-to-jsx) # React.createElement [React.js点滴知识](https://blog.csdn.net/sinat_17775997/category_6352631_6.html) # 参考 > https://indepth.dev/ > [React 源码全方位剖析](http://www.sosout.com/2018/08/12/react-source-analysis.html) > https://react.jokcy.me/book/update/expiration-time.html