1. 程式人生 > >React原始碼分析1 -- 框架

React原始碼分析1 -- 框架

1 原始碼結構

我們分析的React原始碼version為16.0.0-alpha.3,原始碼目錄如下圖所示。

Markdown

含義如下

  • addons:外掛,一些比較有用的工具,如transition動畫
  • isomorphic: 同構,服務端在頁面初次載入時,將所有方法渲染好,一次性交給客戶端。這樣可以減少Ajax
  • shared: 共用方法,一些utils
  • test: 測試方法
  • renderers: React程式碼核心,大部分功能實現程式碼都在其中
    • dom:
    • stack/client: 各種ReactComponent
    • stack/server: 服務端渲染方法
    • shared: CSSProperty, DOMProperty, 合成事件處理,DOM操作方法,如findDOMNode, setInnerHTML等。
    • fiber: 重寫了React核心演算法,架構進行了升級,未來可能會應用。
    • native: ReactNative, 跨平臺實現Android和iOS
    • shared:
    • stack/reconciler: 協調器,包含自定義元件實現ReactCompositeComponent.js, setState機制,生命週期方法流程,DOM diff等
    • shared/event: 事件處理
    • fiber:實驗程式碼,未來可能會應用

2 重要模組

React程式碼還是相當複雜的,我們需要深入理解重要模組的原始碼機制。後面會有幾篇文章針對每個模組進行分析

  • 元素和元件的建立:ReactElement元素是一個數據類,包含props refs key等變數。ReactComponent是一個控制類,包含元件狀態,操作方法等,是React對內的一個很重要的類。它有不同的子類實現,如DOM原生元件ReactDOMComponent,React自定義元件ReactCompositeComponent,文字元件ReactDOMTextComponent。

    React利用createClass()建立元件類物件,createElement()建立元件例項物件。JSX經過babel轉譯後,實際是呼叫createElement()建立例項物件。這部分程式碼分析參見 React原始碼分析2 — 元件和物件的建立(createClass,createElement)

  • React元件插入DOM流程:建立了ReactElement和ReactComponent後,還需要將virtual DOM插入真實DOM中,這樣瀏覽器才能渲染。React會利用virtual DOM生成HTML,然後將HTML插入父元件中。而root元件正好是我們在ReactDOM.render()方法中傳入的DOM原生物件。這部分程式碼分析參見

    React原始碼分析3 — React元件插入DOM流程

  • React生命週期:React吸引人的一個地方在於,有比較清晰的生命週期呼叫方法。利用模板模式使得程式碼結構清晰而又不失靈活性。前端一直以來有個讓人詬病的地方在於,大家程式碼風格各異,沒有像Android那樣比較清晰的流程方法,使得維護起來比較麻煩。React的出現大大解決了這個難題。這部分程式碼分析參見 React原始碼分析4 — React生命週期詳解

  • setState實現機制:作為一種前端流行框架,雖然React專注於MVVM中的View,但它也實現了一套View和資料繫結的方法。這個正是setState。同時,利用佇列和transaction來管理setState,避免了一些重複無謂的介面更新。這部分程式碼分析參見 React原始碼分析5 — setState機制

總之,作為當下前端最流行的框架,React原始碼還是值得我們細細分析的。從原始碼中我們也能學到很多優秀的設計模式,讓我們的程式碼更加清晰好維護。文章中如有不正確的地方,歡迎指正!

相關推薦

React原始碼分析1 -- 框架

1 原始碼結構 我們分析的React原始碼version為16.0.0-alpha.3,原始碼目錄如下圖所示。 含義如下 addons:外掛,一些比較有用的工具,如transition動畫 isomorphic: 同構,服務端在頁面初次載入時,將所有

OKHttp原始碼分析1 - 框架

1 OKHttp介紹 網路庫一直是Android APP開發中至關重要的庫,關係到載入速度,流量消耗等諸多問題。Android系統提供了HttpClient和HttpURLConnection兩個網路庫。相比HttpClient,OKHttp效能更好,且API設計更加易用。相比Htt

Netty Pipeline原始碼分析(1)

原文連結:wangwei.one/posts/netty… 前面,我們分析了Netty EventLoop的 建立 與 啟動 原理,接下里我們來分析Netty中另外兩個重要元件—— ChannelHandler 與 Pipeline。Netty中I/O事件的傳播機制均由它負責,下面我們來看看它是如

vue原始碼分析1-new Vue做了哪些操作

首先我們可以看到vue的原始碼在github上有,大家可以克隆下來。 git地址 我們主要看src下的內容。 1.現在我們來分析下 new Vue都做了哪些操作 var app = new Vue({ el: '#app', mounted:{ console.log(t

redis原始碼分析1------dict的實現

1. 總體結構 redis的dict就是hash表,使用鏈式結構來解決key值衝突,典型的資料結構 結構體的定義如下: typedef struct dictEntry { void *key; union { void *val; uint64_t

Netty原始碼分析:1.4伺服器啟動流程

第一章節是主要是伺服器啟動的程式碼分析。章節目錄有: |———1.1初始化NioEventLoopGroup |———1.2初始化NioEventLoop |———1.3初始化NioServerSocketChannel |———1.4伺服器啟動流程 為什麼先從初始化開

Netty原始碼分析:1.3初始化NioServerSocketChannel

第一章節是主要是伺服器啟動的程式碼分析。章節目錄有: |———1.1初始化NioEventLoopGroup |———1.2初始化NioEventLoop |———1.3初始化NioServerSocketChannel |———1.4伺服器啟動流程 為什麼先從初始化開

Netty原始碼分析:1.2初始化NioEventLoop

第一章節是主要是伺服器啟動的程式碼分析。章節目錄有: |———1.1初始化NioEventLoopGroup |———1.2初始化NioEventLoop |———1.3初始化NioServerSocketChannel |———1.4伺服器啟動流程 為什麼先從初始化開

Netty原始碼分析:1.1初始化NioEventLoopGroup

第一章節是主要是伺服器啟動的程式碼分析。章節目錄有: |———1.1初始化NioEventLoopGroup |———1.2初始化NioEventLoop |———1.3初始化NioServerSocketChannel |———1.4伺服器啟動流程 為什麼先從初始化開

React 原始碼分析-呼叫ReactDOM.render後發生了什麼

我們知道, 對於一般的React 應用, 瀏覽器會首先執行程式碼 ReactDOM.render來渲染頂層元件, 在這個過程中遞迴渲染巢狀的子元件, 最終所有元件被插入到DOM中. 我們來看看 呼叫ReactDOM.render 發生了什麼 大致過程(只展示主要的函式呼叫): 1、

《2.uboot和系統移植-第5部分-2.5.uboot原始碼分析1-啟動第一階段》

《2.uboot和系統移植-第5部分-2.5.uboot原始碼分析1-啟動第一階段》 第一部分、章節目錄 2.5.1.start.S引入 2.5.2.start.S解析1 2.5.3.start.S解析2 2.5.4.start.S解析3 2.5.5.start.S解析4 2.5.6.s

MyBatis原始碼分析-1-基礎支援層-反射模組-Reflector/ReflectorFactory

本文主要介紹MyBatis的反射模組是如何實現的。 MyBatis 反射的核心類Reflector,下面我先說明它的建構函式和成員變數。具體方法下面詳解。 org.apache.ibatis.reflection.Reflector public class Reflector {

rxjs 原始碼分析1-(fromEvent)

前言 Rxjs是使用 Observables 的響應式程式設計的庫,它使編寫非同步或基於回撥的程式碼更容易。我們現在針對Rxjs 6 來進行原始碼分析,分析其實現的基本原理, 我們可以根據中文文件來學習Rxjs 的基本使用,但是這個文件是Rxjs 5 的版本。其最基本的使用區別如下,Rxjs 6的操作符都放

React原始碼分析之事件系統

React原始碼分析之事件系統(轉載自阿里雲) react自己實現了一套高效的事件系統,包括了事件的註冊、儲存、分發、和重用,在DOM事件體系基礎上做了很大改進,減少了記憶體消耗,簡化了事件邏輯,並最大化的解決了IE等瀏覽器的事件不相容問題。與傳統的DOM體系相比,它有如下特點:

谷歌瀏覽器的原始碼分析 1

隨著網路技術的發展,越來越多應用都已經離不開網路,特別像人類大腦一樣的知識庫的搜尋引擎,更加是離不開功能強大的雲端計算。不過,即便雲端計算非常強大,但它還不能直接地把結果呈現給使用者,這樣就需要一個客戶端來呈現出來,這個客戶端就是瀏覽器。現在越來越多人上網,他們每一次上網,都離不開瀏覽的使用,這已經是一

Shiro原始碼分析(1)

簡介 SecurityManager:安全管理器,Shiro最核心元件。Shiro通過SecurityManager來管理內部元件例項,並通過它來提供安全管理的各種服務。 Authenticator:認證器,認證AuthenticationToken是否有

React原始碼分析(一)-呼叫ReactDOM.render後發生了什麼

所謂知其然還要知其所以然. 本系列文章將分析 React 15-stable的部分原始碼, 包括元件初始渲染的過程、元件更新的過程等. 這篇文章先介紹元件初始渲染的過程的幾個重要概念, 包括大致過程、建立元素、例項化元件、事務、批量更新策略等. 在這之前, 假設讀者已經:

React原始碼分析(三)-全面剖析元件更新機制

React 把元件看作狀態機(有限狀態機), 使用state來控制本地狀態, 使用props來傳遞狀態. 前面我們探討了 React 如何對映狀態到 UI 上(初始渲染), 那麼接下來我們談談 React 時如何同步狀態到 UI 上的, 也就是: React 是如何更新

React原始碼分析(二)-元件的初始渲染

上一篇文章講到了React 呼叫ReactDOM.render首次渲染元件的前幾個過程的原始碼, 包括建立元素、根據元素例項化對應元件, 利用事務來進行批量更新. 我們還穿插介紹了React 事務的實現以及如何利用事務進行批量更新的實現. 這篇文章我們接著分析後面的過程,

3.21以太貓原始碼分析1

概述: Cryptokitties,眾所周知的迷戀貓的遊戲,是基於以太坊平臺執行的。使用者在遊戲中可以養大、買賣並繁育“電子寵物”小貓,每隻小貓和繁衍的後代都是獨一無二的。由於它是第一款真正意義上的區塊