import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
ReactDOM.render(<App />, document.getElementById('root'));
複製代碼
當經過create-react-app初始化一個項目的時候,上面這段代碼就在瀏覽器中繪製出了內容.ReactDOM.render(ReactElement, Container, callback)是怎麼將React組件繪製到瀏覽器中的呢?本文是React源碼閱讀系列的起始篇,在這篇文章中主要圍繞如下兩個方面進行介紹:css
閱讀源碼是一個知其然知其因此然的過程.經過源碼閱讀的過程當中咱們能學習到一些設計,代碼優化,解決方案等,經過這些來反哺實際工做的遇到的問題.這個也是這個系列想要得到而且與你們分享的內容.react
如下全部代碼基於React 16.8.6web
首先定位到packages/react-dom/src/client/ReactDOM.js
能夠看到ReactDOM.render()方法將當前的ReactElement和Container信息傳遞給了legacyRenderSubtreeIntoContainer.
因爲是首次mount,這個時候尚未root節點而且是應用的根節點這裏直接進行root節點的建立.最後調用root的render方法就開始進行頁面的繪製.在legacyCreateRootFromDOMContainer方法中會對當前容器的內容進行清理.這裏調用建立了ReactRoot節點.
createContainer根據當前的container信息來建立根容器.
定位到packages/react-reconciler/src/ReactFiberReconciler.js
定位到packages/react-reconciler/src/ReactFiberRoot.js(Fiber !!!!!!)
在createFiberRoot方法中,建立了根據當前的容器信息建立了FiberRootb而且建立了一個HostRootFiber進行相互引用.瀏覽器
經過啓動最開始create-react-app建立的項目,能夠看到如下的輸出.bash
這篇文章只梳理了React在實際調用渲染函數以前的函數調用和數據結構.在這個過程當中終於盼來了千呼萬喚的fiber.以後的文章會繼續深刻react的渲染流程和fiber的實現來對react進行學習.數據結構
歡迎你們關注個人公衆號,一塊兒進步app