簡單分析 React Router 的原始碼

Mondo 科技 更新 2024-03-03

當前的分析版本是 v52.0,最新提交為:專案由 lerna 管理,在根目錄下執行yarn您可以為專案安裝依賴項。 繼續在根目錄下執行yarn build會進入 reaact-router、react-router-dom 等目錄進行打包,打包工具是 rollup,會打包 esm、cjs、umd 等結果。

react-router-dom:軟體包 react-router-dom

/users/songjp/fe/mime/react-router/packages/react-router-dom├──browserrouter.js├──hashrouter.js├──link.js├──memoryrouter.js├──n**link.js├──prompt.js├──readme.md├──redirect.js├──route.js├──router.js├──staticrouter.js├──switch.js├──es| ├browserrouter.js| ├hashrouter.js| ├link.js| ├memoryrouter.js| ├n**link.js| ├prompt.js| ├redirect.js| ├route.js| ├router.js| ├staticrouter.js| ├switch.js| ├generatepath.js| ├matchpath.js| ├warnaboutdeprecatedesmimport.js| └withrouter.js├──generatepath.js├──index.js├──jest.config.js├──matchpath.js├──modules| ├browserrouter.js| ├hashrouter.js| ├link.js| ├n**link.js| ├index.js| └utils├──package.json├──rollup.config.js├──warnaboutdeprecatedcjsrequire.js└──withrouter.js
您可能會有疑問:

為什麼根目錄下有瀏覽器路由器?js,還有es browserrouterjs 和模組 BrowserRouterjs ?為什麼根目錄下有路由器?js,有es路由器js,但沒有模組路由器JS直接說出了結論:

彙總根據模組索引打包js 打包,即原始碼在 modules 目錄下,react-router-dom 的原始碼在 modules 目錄下,主要是 browserrouter、hashrouter、link、n**link 元件,至於 router 元件、switch 元件等,其實在 react-router 倉庫裡。 至於根目錄下的browserrouterjs 主要是為了相容性require("react-router-dom/%s")實際上應該更多地使用require("react-router-dom").%ses 目錄js 主要是為了相容性import %s from "react-router-dom/es/%s這樣的引用方式,其實更值得推薦import from "react-router-dom"引用的方式是只要注意 modules 目錄,es 目錄下的檔案和根目錄下的檔案都是為了相容一些元件引用

通常我們像這樣使用 react-router-dom:

import from "./react-router-dom"; home about users
讓我們從browserrouter元件開始。

// react-router-dom/browserrouter.jsimport from "history";class browserrouter extends react.component }
browserrouter 元件實際上通過呼叫 history 中的 createbrowserhistory 方法來建立乙個 history 物件。 歷史記錄中有乙個 CreateTransitionManager 檔案,它在內部實現了觀察者模式:
// history/createtransitionmanager.jslet listeners = const appendlistener = (fn) => listeners.push(listener) return ()=> }const notifylisteners = (.args) =>
當 history 物件本身觸發 popstate 事件或歷史記錄時替換或歷史記錄push 方法,notifylisteners 被觸發以通知所有觀察者。

而 react-router 中的 router 元件實際上是它是觀察者。它內部有乙個位置狀態,並且它訂閱了歷史記錄更改

// react-router/router.jsif (!props.staticcontext) )else }
當歷史記錄更改時,位置的狀態也會更改。 此狀態也用作 routercontext提供者將繼續傳遞。

// react-router/router.js
作為乙個真正的路由元件(渲染元件),它在內部確定從 routercontext 傳遞的位置值,以及它自己的路徑(例如確定是否存在匹配項:
// react-router/route.jsconst match = this.props.computedmatch? this.props.computedmatch // already computed the match for us: this.props.path? matchpath(location.pathname, this.props): context.match;
匹配呈現子項:
// react-router/route.js
從上面可以看出,支援各種孩子。 對應路由元件的元件引數、渲染引數和子引數。

在 BrowserRouter 的情況下,它只是將 CreateBrowserHistory 替換為 CreateHashHistory,因此最終的邏輯差異在於 npm 包 History。

// react-router-dom/hashrouter.jsimport react from "react";import from "history";class hashrouter extends react.component }export default hashrouter;
hashrouter 與 browserrouter 有什麼共同點:

當我們點選鏈結元件進行跳轉時,我們呼叫其中的推送方法(browserrouter 或 hashrouter)來更改 url。 對於歷史模式,它是通過歷史PushState,對於雜湊模式,是更改視窗location.hash。在各自的推送方法中,它們會呼叫內部的 setstate 方法,該方法會通知每個底層路由元件最新的路由資訊,每個路由元件會通過匹配最新的路由資訊來判斷是否需要顯示。 hashrouter 和 browserrouter 之間的區別:

什麼時候回滾前進的路由時間:歷史模式主要是監聽popstate事件,獲取最新的路由資訊(不,其實在觸發popstate的時候,url已經變了,所以直接把url資訊傳遞給路由),然後通過setstate通知路由元件。 請注意,popstate 事件稱為歷史記錄pushstate() 和歷史replaceState() 不執行,但僅在歷史記錄時執行back(),history.go(),history.forward() (當單擊瀏覽器後退按鈕時,它實際上等同於呼叫歷史記錄。back(),所以 popstate 事件也會被觸發)。參考:PopState MDN:對於hash模式,主要監聽hashchange事件,獲取最新的路由資訊(同上),通過setstate通知路由元件。

相關問題答案

    保留小程式原始碼 保留小程式原始碼系統

    在數位化時代背景下,預約小程式原始碼成為企業高效運營的秘訣。開源小程式允許定製服務,以滿足不同的業務需求,從資料分析到使用者體驗優化,所有這些都提供了提高服務效率和提高客戶滿意度的可能性。這些預訂系統的開發 維護和使用,通過小程式提公升企業的競爭力,通過預訂體驗幫助企業增加收入和市場份額。在數字時代...

    如何獲取多語種企業網站原始碼?原始碼可以給別人嗎?

    在當今的數字時代,企業已成為企業與全球使用者溝通 展示產品和服務的重要視窗。隨著全球化的發展,對多語言企業 的需求正在增加。本文將深入討論如何獲取多語言企業原始碼,以及是否可以在法律和商業層面上共享。在我們開始談論如何獲取多語言企業的原始碼之前,我們首先需要對什麼是多語言企業原始碼有乙個深刻的理解。...

    如何做產品溯源碼? 做溯源碼要注意什麼

    產品溯源碼是一種可以追溯產品來源和生產過程的編碼系統,消費者通過它可以了解產品的生產地點 生產時間 原材料等資訊,從而保證產品的質量和安全。那麼,產品溯源碼到底應該怎麼做呢?接下來,防偽 中心 將給大家詳細的介紹。產品溯源碼是指對產品 包括食品 藥品 農產品等 進入市場的各個階段 從生產到流通 進行...

    原始碼補丁工件補丁包

    VUE 專案中使用了 VUE PDF 第三方外掛程式來預覽 PDF,編寫業務執行完美,PDF 檔案內容正常預覽沒有問題。後期需求會發生變化,業務需求會增加電子簽名功能。在這種情況下,可以顯示PDF檔案的內容,但無法顯示公司的電子簽名。這是令人沮喪的,因為已經編寫了很多依賴項,如果替換這些依賴項,這些...

    部署AI矩陣系統原始碼

    AI矩陣系統的主要特點和功能包括以下幾個方面 .智慧型感知和認知 系統可以從影象 聲音 文字等中提取有用的資訊和特徵。通過感知和理解輸入資料。它可以識別和理解語言 影象 聲音等內容,完成對複雜環境的智慧型感知和認知。.自主學習習和知識獲取 系統可以通過機器學習習和深度學習習技術,從大量資料中學習習和...