摘要:在前端開發過程中,源碼解讀是必不可少的一個環節,我們直接進入主題,注意當前版本號。注意包文件僅僅是的必要的功能性的定義,它必須要結合一起使用下是,原生環境下是。
在前端開發過程中,源碼解讀是必不可少的一個環節,我們直接進入主題,注意當前 React 版本號 16.8.6。
注意:react 包文件僅僅是 React components 的必要的、功能性的定義,它必須要結合 React render一起使用(web下是 react-dom,原生app環境下是react-native)。即 react 僅僅是定義節點與表現行為的包,具體如何渲染、如何更新這是與平臺相關的,都是放在react-dom、react-native 包里的。這是我們只分析 web 環境的,即我們不會只分析 react 包文件,會結合 react 包與 react-dom、react-reconciler 及其他相關包一起分析。
React 16.8.6 使用 FlowTypes 靜態類型檢查器,我們需要在開發工具中支持 Fow(以 vscode 為例):
安裝 Flow Language Support 插件
配置 workspace/.vscode/settings.json
{ "flow.useNPMPackagedFlow": true, "javascript.validate.enable": false }
關于 Flow 更多請看 Flow官網。
React首先,從 react 入口,打開 react 源碼庫 index.js:
"use strict"; const React = require("./src/React"); // TODO: 決定頂層文件導出格式 // 雖然是旁門左道,但它可以使 React 在 Rollup 和 Jest 上運行 module.exports = React.default || React;
進入 ./src/React。
React API其中 React 完整內容是:
const React = { // React 暴露出來的 API ... }; // Note: some APIs are added with feature flags. // Make sure that stable builds for open source // don"t modify the React object to avoid deopts. // Also let"s not expose their names in stable builds. if (enableStableConcurrentModeAPIs) { React.ConcurrentMode = REACT_CONCURRENT_MODE_TYPE; React.unstable_ConcurrentMode = undefined; } if (enableJSXTransformAPI) { if (__DEV__) { React.jsxDEV = jsxWithValidation; React.jsx = jsxWithValidationDynamic; React.jsxs = jsxWithValidationStatic; } else { React.jsx = jsx; // we may want to special case jsxs internally to take advantage of static children. // for now we can ship identical prod functions React.jsxs = jsx; } } export default React;
其中,React 暴露出來的 API 有:
Children: { ... },
提供處理 props.children 的方法,由于 props.children 是一個類數組的類型,可以用 React.Children 來處理
Component, PureComponent, createRef, forwardRef,
Component: React 組件類
PureComponent: React 純組件,和 React.Component 類似,都是定義一個組件類。不同是 React.Component 沒有實現 shouldComponentUpdate(),而 React.PureComponent 通過 props 和 state 的淺比較實現了。
createRef: 創建 ref 函數, React.createRef()
forwardRef: 用來解決 函數組件 以及 HOC 組件傳遞 ref 的問題
createContext, lazy, memo, error, warn,
createContext: context 創建方法
lazy: 實現異步加載的功能模塊
memo: 也是一個高階組件,類似于React.PureComponent,不同于React.memo 是 function 組件,React.PureComponent 是 class 組件。
useState, useEffect, useContext, useCallback, useImperativeHandle, useDebugValue, useLayoutEffect, useMemo, useReducer, useRef,
Hooks 是 React v16.7.0-alpha 開始加入的新特性,可以讓你在class以外使用state和其他React特性
其中 useState、useEffect、useContext 是 Hooks 三個最主要的API
useState: 狀態鉤子,可以在一個 函數式組件 中調用它,為這個組件增加一些內部的狀態
useEffect: 副作用鉤子,為函數式組件帶來執行 副作用 的能力
useContext: 可以訂閱 React context 而不用引入嵌套
useCallback: 回調鉤子,當輸入對象改變時調用
useImperativeHandle: 自定義使用 ref 時,公開給父組件的實例值,應和 forwardRef 一起使用
useDebugValue: 用于在 React 開發者工具中顯示自定義 hook 的標簽
useLayoutEffect: api 與 useEffect 相同,使用它從 DOM 讀取布局并同步重新渲染
useMemo: 當輸入對象改變時,返回一個 memoized 值
useReducer: useState的替代方案,允許你使用一個reducer來管理一個復雜組件的局部狀態
useRef: 返回 ref 對象,可以通過 .current 訪問 ref 實例的屬性方法
Fragment: REACT_FRAGMENT_TYPE, Profiler: REACT_PROFILER_TYPE, StrictMode: REACT_STRICT_MODE_TYPE, Suspense: REACT_SUSPENSE_TYPE,
用 Symbol 來表示 React 的 Fragment、StrictMode、Suspense 組件
Fragment: 可以聚合一個子元素列表,并且不在DOM中增加額外節點
StrictMode: 可以在開發階段開啟嚴格模式,發現應用存在的潛在問題,提升應用的健壯性
Suspense: 在 React.lazy 時,import 失敗或者異常時,就需要使用 Suspense 給出錯誤提示
createElement: __DEV__ ? createElementWithValidation : createElement, cloneElement: __DEV__ ? cloneElementWithValidation : cloneElement, createFactory: __DEV__ ? createFactoryWithValidation : createFactory, isValidElement: isValidElement,
createElement: 創建 ReactElement
cloneElement: 克隆 ReactElement
createFactory: 創建一個專門用來創建某一類 ReactElement 的工廠
isValidElement: 驗證是否是一個 ReactElement
version: ReactVersion, unstable_ConcurrentMode: REACT_CONCURRENT_MODE_TYPE, __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: ReactSharedInternals,
version: React 功能版本號
__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: 顧名思義: React 內部元素,不要使用
這些就是 React 最主要的 API,下面 逐個擊破,從應用到源碼,一一吃透 React 。
附 V16 個個版本的更新內容:
React v16.0
render 支持返回 Array 和 String 、Error Boundaries、createPortal、支持自定義 DOM 屬性、減少文件體積、Fiber;
React v16.1
react-call-return;
React v16.2
Fragment;
React v16.3
createContext、createRef、forwardRef、生命周期函數的更新、Strict Mode;
React v16.4
Pointer Events、update getDerivedStateFromProps;
React v16.5
Profiler;
React v16.6
memo、lazy、Suspense、static contextType、static getDerivedStateFromError();
React v16.7
Hooks;
React v16.8
Concurrent Rendering;
React v16.9(~mid 2019)
Suspense for Data Fetching;
走在最后,歡迎 star:https://github.com/sisterAn/blog
歡迎關注:前端瓶子君
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/106020.html
摘要:前端日報精選十問幫你理清前端工程師及大前端團隊的成長問題譯讀完細則之后學到的件事掘金怎么寫一個組件庫一眾成翻譯還有這操作一個能生成思維導圖的開源搜索引擎知乎專欄中文前端推薦第天值得收藏的基礎教程知乎專欄第期沒有的一天轉載中回調地 2017-06-15 前端日報 精選 十問sofish:幫你理清前端工程師及大前端團隊的成長問題![譯] 讀完 flexbox 細則之后學到的 11 件事 -...
摘要:無意中發現貼吧也出了個漂流瓶的東西,隨手翻了翻發現居然有好多妹子圖,閑來無事于是就想寫個爬蟲程序把圖片全部抓取下來。具體獲取一頁內容的如下看參數很容易明白,就是當前頁碼,就是當前頁中包含的漂流瓶數量。 showImg(https://segmentfault.com/img/bVLUTV?w=638&h=808); 無意中發現貼吧也出了個漂流瓶的東西,隨手翻了翻發現居然有好多妹子圖,閑...
閱讀 732·2021-08-17 10:11
閱讀 1598·2019-08-30 11:15
閱讀 1020·2019-08-26 13:54
閱讀 3507·2019-08-26 11:47
閱讀 1220·2019-08-26 10:20
閱讀 2820·2019-08-23 18:35
閱讀 1216·2019-08-23 17:52
閱讀 1299·2019-08-23 16:19