網(wǎng)站首頁 編程語言 正文
引言
本文是深入淺出 ahooks 源碼系列文章的第一篇,這個系列的目標(biāo)主要有以下幾點:
- 加深對 React hooks 的理解。
- 學(xué)習(xí)如何抽象自定義 hooks。構(gòu)建屬于自己的 React hooks 工具庫。
- 培養(yǎng)閱讀學(xué)習(xí)源碼的習(xí)慣,工具庫是一個對源碼閱讀不錯的選擇。
注:本系列對 ahooks 的源碼解析是基于 v3.3.13
。自己 folk 了一份源碼,主要是對源碼做了一些解讀,可見 詳情。
第一篇主要介紹 ahooks 的背景以及整體架構(gòu)。
React hooks utils 庫
自從 React 16.8 版本推出 React hooks,越來越多的項目使用 Function Component。React hooks utils 庫隨即誕生,它主要解決的兩個問題如下:
- 公共邏輯的抽象。
- 解決 React hooks 存在的弊端,比如閉包等。
那現(xiàn)在社區(qū)有哪些比較優(yōu)秀的 React Hooks utils 庫呢?
react-use 是社區(qū)比較活躍的 React hooks utils 庫,它的 star 數(shù)達(dá)到了 29.6k
。它的功能非常強大,擁有的 hooks 已經(jīng) 100+。假如你需要功能比較齊全,可以考慮選擇 react-use。
如果不需要非常齊全的功能,只需要一些常見的功能,react-use 可能會稍微冗余了,可以考慮我們今天的主角——ahooks,目前它的 star 數(shù)為 9.2k
,也算是社區(qū)比較活躍。
ahooks
簡介
官方介紹如下:
ahooks,發(fā)音 [e? h?ks],是一套高質(zhì)量可靠的 React Hooks 庫。在當(dāng)前 React 項目研發(fā)過程中,一套好用的 React Hooks 庫是必不可少的,希望 ahooks 能成為您的選擇。
特點
它具有如下特點:
- 易學(xué)易用。
- 支持 SSR。
- 將訪問 DOM/BOM 的方法放在 useEffect 中(服務(wù)端不會執(zhí)行),避免服務(wù)端執(zhí)行時報錯。
- 源碼中可以看到很多
isBrowser
的判斷,主要是區(qū)分開瀏覽器環(huán)境和服務(wù)器環(huán)境。
- 對輸入輸出函數(shù)做了特殊處理,且避免閉包問題。
- 輸入的函數(shù),永遠(yuǎn)都是使用最新的一份。這個是通過
useRef
進(jìn)行實現(xiàn)。 - 輸出函數(shù),地址都是不會變化的,這個是通過
useMemoizedFn
(ahooks 封裝的)實現(xiàn)的,其實現(xiàn)也是通過useRef
實現(xiàn)。后面我們會提到。
- 輸入的函數(shù),永遠(yuǎn)都是使用最新的一份。這個是通過
- 包含大量提煉自業(yè)務(wù)的高級 Hooks。
- 包含豐富的基礎(chǔ) Hooks。
- 使用 TypeScript 構(gòu)建,提供完整的類型定義文件。可以學(xué)習(xí)一些 TypeScript 的技巧。
hooks 種類
ahooks 基于 UI、SideEffect、LifeCycle、State、DOM 等分類提供了常用的 Hooks。如下所示:
ahooks 整體架構(gòu)
項目啟動
我們先從 ahooks 中 folk 一份,clone 下來。
yarn run init yarn start
如果你能成功跑起服務(wù),就會看到和官方文檔一模一樣的頁面。
整體結(jié)構(gòu)
從倉庫的根目錄的 package.json 中可以得到以下信息。
- 文檔是使用
dumi
。是一款為組件開發(fā)場景而生的文檔工具。 - 該項目是一個
monoRepo
。它的項目管理是通過 lerna 進(jìn)行管理的。 - 單元測試是通過 jest 實現(xiàn)。
它的目錄結(jié)構(gòu)中,可以看到 docs 中存放倉庫公共文檔。packages 中存放兩個包,hooks 和 use-url-state。整體的結(jié)構(gòu)跟 dumi 中給出的 lerna 項目的結(jié)構(gòu)相似。其中每個包下面的每個組件都可以書寫對應(yīng)的文檔,不一樣的是,hooks 中每個組件多了 __tests__
文件夾,這個是用來寫單元測試的。
可以用以下一張圖,大致總結(jié)一下 ahooks 的工程架構(gòu):
hooks
剛剛也提到,ahooks 是采用了 monoRepo
的方式,我們的源碼都是在 packages 中,我們來看下 hooks。先看 packages/hooks/package.json
。另外要使用 useUrlState 這個 hook,需要獨立安裝 @ahooksjs/use-url-state
,其源碼在 packages/use-url-state
中。我理解官方的用意應(yīng)該是這個庫依賴于 react-router,可能有一些項目不需要用到,把它提出來有助于減少包的大小。
npm i @ahooksjs/use-url-state -S
回到 packages/hooks
。重點關(guān)注一下 dependencies 和 peerDependencies。可以看到其實它內(nèi)部還是使用了一些其他的工具庫的,比如 lodash(估計是避免重復(fù)造輪子,但感覺這樣會導(dǎo)致包會變大)。后面我們也會對這些工具庫做一個探索。
"dependencies": { "@types/js-cookie": "^2.x.x", "ahooks-v3-count": "^1.0.0", "dayjs": "^1.9.1", "intersection-observer": "^0.12.0", "js-cookie": "^2.x.x", "lodash": "^4.17.21", "resize-observer-polyfill": "^1.5.1", "screenfull": "^5.0.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" },
另外解釋下 peerDependencies。
peerDependencies
的目的是提示宿主環(huán)境去安裝滿足插件 peerDependencies
所指定依賴的包,然后在插件 import
或者 require
所依賴的包的時候,永遠(yuǎn)都是引用宿主環(huán)境統(tǒng)一安裝的 npm
包,最終解決插件與所依賴包不一致的問題。這里的宿主環(huán)境一般指的就是我們自己的項目本身了。
這對于封裝 npm 包非常重要。當(dāng)你寫的包 a 里面依賴另一個包 b,而這個包 b 是引用這個包 a 的業(yè)務(wù)的常用的包的時候,建議寫在 peerDependencies
里,避免重復(fù)下載/多個版本共存。
總結(jié)
作為系列的第一篇,介紹了 React hooks utils 庫的背景以及 ahooks 的特點簡介和整體結(jié)構(gòu),接下來會探索各個常見的 hooks 方法實現(xiàn),敬請期待。
參考?ahooks 正式發(fā)布:值得擁抱的 React Hooks 工具庫
原文鏈接:https://juejin.cn/post/7105396478268407815
相關(guān)推薦
- 2022-06-23 QT實現(xiàn)簡單計算器功能_C 語言
- 2023-01-02 C#中static的詳細(xì)用法實例_C#教程
- 2023-02-18 go?micro微服務(wù)框架項目搭建方法_Golang
- 2022-10-11 Systemtap BPF/BCC bpftrace 實踐對比
- 2022-08-17 C語言超全面講解字符串函數(shù)_C 語言
- 2023-01-10 阿里云服務(wù)器?jdk1.8?安裝配置教程_服務(wù)器其它
- 2022-05-18 C++中string類的常用方法實例總結(jié)_C 語言
- 2021-12-19 Redis中緩存穿透/擊穿/雪崩問題和解決方法_Redis
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支