IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> react源码分析(1)-综述 -> 正文阅读

[JavaScript知识库]react源码分析(1)-综述

目录

2021SC@SDUSC

整体介绍

目录结构

测试项目的运行与安装

总结



2021SC@SDUSC

整体介绍

react是一个比较流行的前端应用框架,具有声明化,组件化,一次学习,跨平台编写的特性。可以用于构建用户界面,支持JSX语法(当然也可以不使用,react.createElement方法就可以创造reactElement元素,但不如JSX简洁,两者可以用Babel进行转化),各个组件可以有自身的状态,内部数据可以使用state等进行访问。(利用react native开发原生移动应用也是一个亮点)。react本身对外部插件也有较为良好的兼容性。

react组件分为函数组件,类组件以及原生标签组件等,它们均有各自的特性与属性,比如类组件使用state与props管理状态,函数组件使用hooks等。

目录结构

首先看一下react源码的目录结构,这里的react版本为17.0.2,其中源码位于packages中,包括react,react-dom,react-reconcile等,而fixtures则包括一些小型测试项目,scripts则为一些babel,eslint等的相关文件。

此图片的alt属性为空;文件名为image.png

另外,react源码中使用的是flow进行类型检查(由于facebook的历史原因,并非typeScript),而vsCode会将其默认为typeScript进行检测导致报错(不妨碍运行),打开settings.json,关闭js动态验证即可。

在packages中有不少模块,根据readme.md可以大致分为以下几部分:

React Core其中包括所有全局reactAPI,只用于定义组件,不包括平台特定的代码,可同时适用于React DOM 和 React Native 组件。位于packages/react?中。

export {
  __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,
  act as unstable_act,
  Children,
  Component,
  Fragment,
  Profiler,
  PureComponent,
  StrictMode,
  Suspense,
  SuspenseList,
  cloneElement,
  createContext,
  createElement,
  createFactory,
  createMutableSource,
  createRef,
  forwardRef,
  isValidElement,
  lazy,
  memo,
  startTransition,
  unstable_Cache,
  unstable_DebugTracingMode,
  unstable_LegacyHidden,
  unstable_Offscreen,
  unstable_Scope,
  unstable_getCacheForType,
  unstable_useCacheRefresh,
  unstable_useOpaqueIdentifier,
  useCallback,
  useContext,
  useDebugValue,
  useDeferredValue,
  useEffect,
  useImperativeHandle,
  unstable_useInsertionEffect,
  useLayoutEffect,
  useMemo,
  useMutableSource,
  useSyncExternalStore,
  useSyncExternalStore as unstable_useSyncExternalStore,
  useReducer,
  useRef,
  useState,
  useTransition,
  version,
} from './src/React';

此处为react的入口API,也是集成地点。

渲染器最初只需要渲染DOM,后来被改编为支持原生平台的react native。因此渲染器被划分为多个部分,根据底层平台不同进行调用。其中包括:

React DOM Renderer?将 React 组件渲染成 DOM。负责在浏览器上的渲染。

React Native Renderer?将 React 组件渲染为 Native 视图。此渲染器在 React Native 内部使用。不过其实它只是实现了react与react native的连接,真正的渲染在react native中。

React Test Renderer?将 React 组件渲染为 JSON 树。这主要是为了测试所用,react采用JEST进行测试。

另外一个官方支持的渲染器的是?react-art。它曾经是一个独立的?GitHub 仓库,但是已经加入主源代码树。

reconciler(我所负责的核心部分) 包括react与react native中共同部分,尤其是十分重要的协调算法,这样可以让声明式渲染,自定义组件,state,生命周期方法和 refs 等特性,保持跨平台工作一致。其中stack fiber已经被放弃,现在使用fiber reconciler,它的主要目标有:

  • 能够把可中断的任务切片处理。
  • 能够调整优先级,重置并复用任务。
  • 能够在父元素与子元素之间交错处理,以支持 React 中的布局。
  • 能够在?render()?中返回多个元素。
  • 更好地支持错误边界。

源代码在?packages/react-reconciler?目录下。

import?{

??createContainer?as?createContainer_new,

??updateContainer?as?updateContainer_new,

??batchedUpdates?as?batchedUpdates_new,

??deferredUpdates?as?deferredUpdates_new,

??discreteUpdates?as?discreteUpdates_new,

??flushControlled?as?flushControlled_new,

??flushSync?as?flushSync_new,

??flushSyncWithoutWarningIfAlreadyRendering?as?flushSyncWithoutWarningIfAlreadyRendering_new,

??flushPassiveEffects?as?flushPassiveEffects_new,

??getPublicRootInstance?as?getPublicRootInstance_new,

??attemptSynchronousHydration?as?attemptSynchronousHydration_new,

??attemptDiscreteHydration?as?attemptDiscreteHydration_new,

??attemptContinuousHydration?as?attemptContinuousHydration_new,

??attemptHydrationAtCurrentPriority?as?attemptHydrationAtCurrentPriority_new,

??findHostInstance?as?findHostInstance_new,

??findHostInstanceWithWarning?as?findHostInstanceWithWarning_new,

??findHostInstanceWithNoPortals?as?findHostInstanceWithNoPortals_new,

??shouldError?as?shouldError_new,

??shouldSuspend?as?shouldSuspend_new,

??injectIntoDevTools?as?injectIntoDevTools_new,

??createPortal?as?createPortal_new,

??createComponentSelector?as?createComponentSelector_new,

??createHasPseudoClassSelector?as?createHasPseudoClassSelector_new,

??createRoleSelector?as?createRoleSelector_new,

??createTestNameSelector?as?createTestNameSelector_new,

??createTextSelector?as?createTextSelector_new,

??getFindAllNodesFailureDescription?as?getFindAllNodesFailureDescription_new,

??findAllNodes?as?findAllNodes_new,

??findBoundingRects?as?findBoundingRects_new,

??focusWithin?as?focusWithin_new,

??observeVisibleRects?as?observeVisibleRects_new,

??registerMutableSourceForHydration?as?registerMutableSourceForHydration_new,

??runWithPriority?as?runWithPriority_new,

??getCurrentUpdatePriority?as?getCurrentUpdatePriority_new,

??getIsStrictModeForDevtools?as?getIsStrictModeForDevtools_new,

??setIsStrictModeForDevtools?as?setIsStrictModeForDevtools_new,

}?from?'./ReactFiberReconciler.new';

此处即为react-reconciler的入口,其实有新旧两个版本,这里以新版本为例展示其API。

测试项目的运行与安装

在介绍源码之前,可以先看一下fixtures测试项目的安装与运行以便于对react有一个大致的了解,首先需要在react项目根目录下运行yarn进行安装(如果出现yarn与node不匹配的问题,可以运行以下命令:yarn config set ignore-engines true 解决),这里其实推荐在linux系统上运行,但可以将JSON配置文件中的命令内容更改成符合powershell的格式,其实也可以在window上尝试,还要注意raw.githubusercontent.com的连接问题,可以先在IPaddress中查出相关IP地址,然后复制写入hosts文件,多尝试几次即可安装成功,然后进行build,再通过终端打开测试项目,按照readme.md中的提示运行,然后用浏览器打开相关项目下的index.html,如图所示为art的项目演示(react-art为官方支持的一个渲染器,本来是GitHub的一个项目,后来被加入到react的主源代码树中)

动态旋转图

此图为attribute-beahvior的演示(查看不同情况下SVG的效果)

attribute-behavior

总结

介绍了一下react,大体查看了一下react的目录结构,然后为react的测试代码部署了环境,并且顺利的成功运行了测试项目。希望未来能够越来越顺畅的分析react源码,明白内部的工作原理。本人曾参与过react相关的项目,react本身应用也很广泛,前景光明。

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-30 11:50:23  更:2021-09-30 11:52:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/18 23:32:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码