<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文是深入淺出 ahooks 原始碼系列文章的第一篇,這個系列的目標主要有以下幾點:
注:本系列對 ahooks 的原始碼解析是基於 v3.3.13
。自己 folk 了一份原始碼,主要是對原始碼做了一些解讀,可見 詳情。
第一篇主要介紹 ahooks 的背景以及整體架構。
自從 React 16.8 版本推出 React hooks,越來越多的專案使用 Function Component。React hooks utils 庫隨即誕生,它主要解決的兩個問題如下:
那現在社群有哪些比較優秀的 React Hooks utils 庫呢?
react-use 是社群比較活躍的 React hooks utils 庫,它的 star 數達到了 29.6k
。它的功能非常強大,擁有的 hooks 已經 100+。假如你需要功能比較齊全,可以考慮選擇 react-use。
如果不需要非常齊全的功能,只需要一些常見的功能,react-use 可能會稍微冗餘了,可以考慮我們今天的主角——ahooks,目前它的 star 數為 9.2k
,也算是社群比較活躍。
官方介紹如下:
ahooks,發音 [eɪ hʊks],是一套高質量可靠的 React Hooks 庫。在當前 React 專案研發過程中,一套好用的 React Hooks 庫是必不可少的,希望 ahooks 能成為您的選擇。
它具有如下特點:
isBrowser
的判斷,主要是區分開瀏覽器環境和伺服器環境。useRef
進行實現。useMemoizedFn
(ahooks 封裝的)實現的,其實現也是通過 useRef
實現。後面我們會提到。ahooks 基於 UI、SideEffect、LifeCycle、State、DOM 等分類提供了常用的 Hooks。如下所示:
我們先從 ahooks 中 folk 一份,clone 下來。
yarn run init yarn start
如果你能成功跑起服務,就會看到和官方檔案一模一樣的頁面。
從倉庫的根目錄的 package.json 中可以得到以下資訊。
dumi
。是一款為元件開發場景而生的檔案工具。monoRepo
。它的專案管理是通過 lerna 進行管理的。它的目錄結構中,可以看到 docs 中存放倉庫公共檔案。packages 中存放兩個包,hooks 和 use-url-state。整體的結構跟 dumi 中給出的 lerna 專案的結構相似。其中每個包下面的每個元件都可以書寫對應的檔案,不一樣的是,hooks 中每個元件多了 __tests__
資料夾,這個是用來寫單元測試的。
可以用以下一張圖,大致總結一下 ahooks 的工程架構:
剛剛也提到,ahooks 是採用了 monoRepo
的方式,我們的原始碼都是在 packages 中,我們來看下 hooks。先看 packages/hooks/package.json
。另外要使用 useUrlState 這個 hook,需要獨立安裝 @ahooksjs/use-url-state
,其原始碼在 packages/use-url-state
中。我理解官方的用意應該是這個庫依賴於 react-router,可能有一些專案不需要用到,把它提出來有助於減少包的大小。
npm i @ahooksjs/use-url-state -S
回到 packages/hooks
。重點關注一下 dependencies 和 peerDependencies。可以看到其實它內部還是使用了一些其他的工具庫的,比如 lodash(估計是避免重複造輪子,但感覺這樣會導致包會變大)。後面我們也會對這些工具庫做一個探索。
"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
的目的是提示宿主環境去安裝滿足外掛 peerDependencies
所指定依賴的包,然後在外掛 import
或者 require
所依賴的包的時候,永遠都是參照宿主環境統一安裝的 npm
包,最終解決外掛與所依賴包不一致的問題。這裡的宿主環境一般指的就是我們自己的專案本身了。
這對於封裝 npm 包非常重要。當你寫的包 a 裡面依賴另一個包 b,而這個包 b 是參照這個包 a 的業務的常用的包的時候,建議寫在 peerDependencies
裡,避免重複下載/多個版本共存。
作為系列的第一篇,介紹了 React hooks utils 庫的背景以及 ahooks 的特點簡介和整體結構,接下來會探索各個常見的 hooks 方法實現,敬請期待。
參考 ahooks 正式釋出:值得擁抱的 React Hooks 工具庫
更多關於hooks架構React工具庫的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45