跳到正文
本页内容

性能

对 Hook 库来说,“小”有两层意思:下载的代码少,页面里常驻的原生任务也少。

这个包有多大

better-hooks 构建报告v1.3.0 · 构建 8f90ccf61cae
独立入口
37
gzip 中位数
1.04 kB
根入口完整图
21.2 kB
通过体积预算
37 / 37
gzip 最大的独立入口每一条均包含该入口唯一可达的内部模块。
  1. use-websocket3.07 kB
  2. use-key-press2.68 kB
  3. use-session-storage2.17 kB
  4. use-local-storage2.17 kB
  5. use-intersection-observer1.98 kB
  6. use-resize-observer1.74 kB
  7. use-click-outside1.55 kB
  8. use-debounce-fn1.44 kB
查看全部 37 个独立入口
入口模块RawgzipBrotligzip / 预算
use-async34.37 kB1.33 kB1.13 kB预算内: 1.33 kB / 2.05 kB
use-boolean21.55 kB623 B527 B预算内: 623 B / 2.05 kB
use-click-outside35.05 kB1.55 kB1.30 kB预算内: 1.55 kB / 2.05 kB
use-controllable-state22.59 kB923 B766 B预算内: 923 B / 2.05 kB
use-copy-to-clipboard33.37 kB1.24 kB1.04 kB预算内: 1.24 kB / 2.05 kB
use-counter22.76 kB1.04 kB873 B预算内: 1.04 kB / 2.05 kB
use-debounce23.25 kB996 B856 B预算内: 996 B / 2.05 kB
use-debounce-fn44.59 kB1.44 kB1.26 kB预算内: 1.44 kB / 2.05 kB
use-document-visibility13.94 kB1.14 kB984 B预算内: 1.14 kB / 2.05 kB
use-event-listener34.05 kB1.19 kB1.03 kB预算内: 1.19 kB / 2.05 kB
use-hover35.07 kB1.39 kB1.19 kB预算内: 1.39 kB / 2.05 kB
use-input22.76 kB1.03 kB833 B预算内: 1.03 kB / 2.05 kB
use-intersection-observer37.34 kB1.98 kB1.71 kB预算内: 1.98 kB / 2.05 kB
use-interval42.14 kB839 B708 B预算内: 839 B / 2.05 kB
use-is-mounted21.27 kB565 B431 B预算内: 565 B / 2.05 kB
use-isomorphic-layout-effect1491 B302 B235 B预算内: 302 B / 2.05 kB
use-key-press38.59 kB2.68 kB2.33 kB预算内: 2.68 kB / 3.07 kB
use-latest21.27 kB585 B451 B预算内: 585 B / 2.05 kB
use-local-storage28.60 kB2.17 kB1.94 kB预算内: 2.17 kB / 3.07 kB
use-lock-fn31.91 kB800 B657 B预算内: 800 B / 2.05 kB
use-map12.20 kB820 B716 B预算内: 820 B / 2.05 kB
use-media-query24.16 kB1.28 kB1.12 kB预算内: 1.28 kB / 2.05 kB
use-memoized-fn21.53 kB689 B552 B预算内: 689 B / 2.05 kB
use-online11.85 kB706 B587 B预算内: 706 B / 2.05 kB
use-previous1291 B211 B171 B预算内: 211 B / 2.05 kB
use-reset-state43.39 kB1.19 kB966 B预算内: 1.19 kB / 2.05 kB
use-resize-observer36.30 kB1.74 kB1.49 kB预算内: 1.74 kB / 2.05 kB
use-safe-state21.45 kB676 B530 B预算内: 676 B / 2.05 kB
use-session-storage28.60 kB2.17 kB1.94 kB预算内: 2.17 kB / 3.07 kB
use-set12.14 kB764 B665 B预算内: 764 B / 2.05 kB
use-throttle33.74 kB1.10 kB945 B预算内: 1.10 kB / 2.05 kB
use-throttle-fn44.31 kB1.35 kB1.19 kB预算内: 1.35 kB / 2.05 kB
use-timeout43.29 kB1.09 kB926 B预算内: 1.09 kB / 2.05 kB
use-toggle1820 B465 B360 B预算内: 465 B / 2.05 kB
use-unmounted-ref21.32 kB617 B498 B预算内: 617 B / 2.05 kB
use-websocket313.8 kB3.07 kB2.68 kB预算内: 3.07 kB / 3.07 kB
use-window-size12.13 kB792 B677 B预算内: 792 B / 2.05 kB
未经压缩的 ESM · ES2022 · React 保持外部依赖 · Node.js zlib 默认 gzip / Brotli 参数第 90 百分位 gzip:2.17 kB

报告测量每个未经压缩的 ES2022 入口,以及从该入口可达的内部模块。React 和 React DOM 保持为外部依赖,gzip 与 Brotli 使用 Node.js 默认参数。这是一条稳定的包级基线,不是对最终应用体积的预测。

只导入需要的入口

每个 Hook 都有 better-hooks/use-media-query 这样的独立 ESM 入口。根入口 better-hooks 暴露相同 API,并依赖构建工具完成 Tree Shaking。文档示例使用独立入口,因为入口边界更直观。

这个包除了 React peer dependency 没有其他运行时依赖,使用显式 exports,并声明了 sideEffects: false

只共享真正相同的浏览器任务

多个订阅者观察同一来源时,Hook 会复用原生任务:相同媒体查询共用一个通道,联网状态在每个浏览器上下文共用一对监听器,窗口尺寸订阅者共用一个 resize 监听器。取消和错误处理无法清楚共享的 Observer 与连接,则保持实例独立。

定时器、监听器、Observer 和网络任务都在 commit 后启动,并在所有者变化或卸载时停止。稳定回调 ref 也能避免只因函数引用变化就重建任务。

最后还是要测真实应用

构建工具可能继续压缩、拆分、去重和转换这些代码。发布前请检查成品应用的包体积、长任务、订阅数量和无效渲染。这里的数据是起点,不是结论。