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

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

时间2025-06-20 14:07:53分类IT科技浏览4446
导读:本文是深入浅出 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
SEO网站优化全攻略(让你的网站在搜索引擎中更有竞争力)