首页IT科技如何学会看源码(大家都能看得懂的源码(一)ahooks 整体架构篇)

如何学会看源码(大家都能看得懂的源码(一)ahooks 整体架构篇)

时间2025-08-05 15:28:54分类IT科技浏览5088
导读:本文是深入浅出 ahooks 源码系列文章的第一篇,该系列已整理成文档-地址。觉得还不错,给个 star 支持一下哈,Thanks。...

本文是深入浅出 ahooks 源码系列文章的第一篇              ,该系列已整理成文档-地址                。觉得还不错                      ,给个 star 支持一下哈        ,Thanks                      。

第一篇主要介绍 ahooks 的背景以及整体架构      。

React hooks utils 库

自从 React 16.8 版本推出 React hooks           ,越来越多的项目使用 Function Component            。React hooks utils 库随即诞生                     ,它主要解决的两个问题如下:

公共逻辑的抽象                       。 解决 React hooks 存在的弊端            ,比如闭包等         。

那现在社区有哪些比较优秀的 React Hooks utils 库呢?

react-use 是社区比较活跃的 React hooks utils 库        ,它的 star 数达到了 29.6k        。它的功能非常强大                     ,拥有的 hooks 已经 100+                        。假如你需要功能比较齐全                ,可以考虑选择 react-use             。

如果不需要非常齐全的功能    ,只需要一些常见的功能                     ,react-use 可能会稍微冗余了                    ,可以考虑我们今天的主角——ahooks,目前它的 star 数为 10k(2022.08.10)                 ,也算是社区比较活跃    。

ahooks

简介

官方介绍如下:

ahooks                       ,发音 [eɪ hʊks]    ,是一套高质量可靠的 React Hooks 库                        。在当前 React 项目研发过程中              ,一套好用的 React Hooks 库是必不可少的                      ,希望 ahooks 能成为您的选择                 。

特点

它具有如下特点:

易学易用。 支持 SSR                    。 将访问 DOM/BOM 的方法放在 useEffect 中(服务端不会执行)        ,避免服务端执行时报错                     。 源码中可以看到很多 isBrowser 的判断           ,主要是区分开浏览器环境和服务器环境   。 对输入输出函数做了特殊处理                     ,且避免闭包问题                。 输入的函数            ,永远都是使用最新的一份                      。这个是通过 useRef 进行实现      。 输出函数        ,地址都是不会变化的                     ,这个是通过 useMemoizedFn(ahooks 封装的)实现的                ,其内部实现也是通过 useRef 实现            。后面我们会提到                       。 包含大量提炼自业务的高级 Hooks         。 包含丰富的基础 Hooks        。 使用 TypeScript 构建    ,提供完整的类型定义文件                        。可以学习一些 TypeScript 的技巧             。

hooks 种类

ahooks 基于 UI              、SideEffect                      、LifeCycle        、State           、DOM 等分类提供了常用的 Hooks    。如下所示:

ahooks 整体架构

项目启动

我们先从 ahooks 中 folk 一份                     ,clone 下来                        。(当时我 folk 的时候还是用的 yarn                    ,现在应该是用 pnpm,猜测是性能有关)                 。

yarn run init yarn start

如果你能成功跑起服务                 ,就会看到和官方文档一模一样的页面。

整体结构

从仓库的根目录的 package.json 中可以得到以下信息                    。

文档是使用 dumi                     。是一款为组件开发场景而生的文档工具   。 该项目是一个 monoRepo                。它的项目管理是通过 lerna 进行管理的                      。 单元测试是通过 jest 实现      。

它的目录结构中                       ,可以看到 docs 中存放仓库公共文档            。packages 中存放两个包    ,hooks 和 use-url-state                       。整体的结构跟 dumi 中给出的 lerna 项目的结构相似         。其中每个包下面的每个组件都可以书写对应的文档              ,不一样的是                      ,hooks 中每个组件多了 __tests__ 文件夹        ,这个是用来写单元测试的        。

可以用以下一张图           ,大致总结一下 ahooks 的工程架构:

hooks

刚刚也提到                     ,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 工具库

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
云质信息(QMS-云质说质量 – 9 我和我的客户投诉(1) – 逢年过节要祈祷)