GitRead 中文社区
首页趋势排行榜原创文章严选周刊
更多资源
新手训练营
精选专题热门话题GitHub 文档资源精选实战指南

hyper-fetch

⚡ Fetching and realtime data exchange framework.

  • 语言TypeScript
  • 默认分支main
  • 大小308.4 MB
  • 更新3 天前
  • Issues1
在 GitHub 打开
avatarBetterTyped

技术解读

以下内容由 GitRead 中文社区 编辑团队基于项目 README 与官方资料整理, 结合中文开发者的常见使用场景补充技术选型建议。具体以项目官方文档为准。

项目背景与痛点

前端的数据请求在过去十年里经历了三次抽象:从 XMLHttpRequest 到 fetch,再到 axios 这层「请求库」,最后是 TanStack Query / SWR 这层「请求状态管理」。但真正做业务的人会发现,问题并没有解决,只是被重新分配了。

fetch 只给你一个 Promise,剩下的一切都要你自己写:loading 状态、错误重试、请求去重、缓存失效、取消、超时、SSR 序列化,以及最麻烦的——实时数据与请求数据的缝合。WebSocket 推过来一条消息,你得手动去 queryClient.setQueryData 里打补丁,改完还要自己去触发重渲染。

hyper-fetch 的切入点是:把「一次请求」从一个函数调用,提升为一个可描述、可复用、可被调度器管理的命令对象。它的自我定位是 “Fetching and realtime data exchange framework”,后半句才是重点——它不只想做请求层,还想吃掉实时数据这半块拼图。

核心技术揭秘

从架构上看,hyper-fetch 走的是一套很接近后端「中间件 + 调度器」的思路,而非 React 生态里常见的 Hook 优先方案。

最底层是 Adapter 适配层,把 fetch、axios、GraphQL 抽象成统一接口。这意味着网络层是可替换的,迁移成本极低,也方便在测试环境中塞入 mock adapter。往上一层是 Dispatcher(调度器),它是整个框架的大脑,串起缓存、队列、重试、生命周期钩子。再往上才是 React / Vue / Svelte 的 hooks 绑定。

请求本身被定义为 Request 实例(命令模式),携带 url、method、params、响应类型等元信息,并且是纯描述性的——同一个 Request 对象可以在不同组件、不同时间被重复 dispatch,行为完全一致。这正是它和「在组件里直接写 axios.get」的本质区别。类型系统在这里发挥了大作用:响应类型、错误类型、query params 类型都可以从 Request 定义中反向推导,而不需要你手写泛型。

graph TD A[业务组件 / useFetch] --> B[Request 命令定义] B --> C[Dispatcher 调度器] C --> D{"缓存是否新鲜?"} D -->|"是"| E[读取 Cache 并返回] D -->|"否"| F[Queue 排队与并发控制] F --> G[Adapter 适配层] G -->|"fetch / axios / GraphQL"| H[远端服务] H --> I[响应校验与类型推导] I --> J[写入 Cache] I --> K[PubSub 广播事件] K --> A E --> A

真正的杀手锏是右侧那条 PubSub 支路。hyper-fetch 内置了消息总线,并且提供了与 WebSocket / Socket.IO 的对接能力。它的做法是:把服务端推送的消息按 topic / key 映射到已有的请求实例上,命中后直接更新缓存并广播,订阅了该请求的组件自动拿到新数据。也就是说,一次 HTTP 请求和一条 WebSocket 推送,在数据层被归一到同一个缓存实体,组件侧完全不需要感知数据来源。这是它跟 SWR 类库最大的分野。

Queue 层负责并发控制和重试退避,缓存层支持内存、LocalStorage、IndexedDB 多种后端,可以组合出 stale-while-revalidate 这类策略。整条链路上开放了大量生命周期钩子(onRequest / onResponse / onError / onSuccess),允许你在不改动业务代码的前提下插入鉴权、日志、埋点。

功能亮点与差异

第一,网络库无关性。 TanStack Query 基本绑死 fetch 语义,而 hyper-fetch 通过 adapter 把 axios、GraphQL 都纳进来,对存量项目友好——你不需要为了引入它而重写网络层。

第二,请求即命令。 请求定义可以单独抽成文件、被多个页面引用、被单元测试直接实例化,这在中大型项目里对「请求契约」的收敛非常有价值。

第三,实时与请求的统一。 这是差异化最强的一点。大部分竞品把 WebSocket 当成另一套体系,hyper-fetch 把它吸收进缓存模型。

第四,框架无关的核心。 Dispatcher、Cache、Queue 都在框架层之外,React 只是薄薄一层绑定,理论上可以移植到任何 UI 框架。

应用场景与落地建议

它最适合两类场景:实时性要求高的中后台(监控大盘、协作编辑、交易行情),以及请求契约复杂、多团队共享接口层的大型前端。

生产落地时有几个坑要提前避开:

  • Cache key 设计要一次性规划好,否则 PubSub 的 topic 映射会变成一团乱麻,这是最容易踩的雷;
  • 不要在早期过度抽象。命令模式带来的收益随项目规模线性增长,小项目里它只是额外的样板代码;
  • 注意请求取消与缓存生命周期。单页应用里长驻的缓存实体如果没人清理,内存会缓慢膨胀;
  • 调试链路变长。请求经过 Dispatcher、Queue、Adapter 三层,出错时要有意识地分层定位,别只盯着 network 面板;
  • SSR 场景要验证,命令对象可序列化是优势,但缓存和 PubSub 在服务端的行为需要实测。

综合评价

优点:架构分层清晰,adapter + dispatcher + cache + pubsub 的组合拳打得很有章法;请求契约与实时数据的统一是真正的设计洞察,不是 API 堆砌;类型推导扎实,命令模式让请求可测试、可复用。

缺点:学习曲线明显高于 SWR 这类「三行上手」的库,心智模型需要时间建立;社区体量和生态远不及 TanStack Query,出问题时可参考的案例少;文档组织偏零散,很多能力要靠翻源码和类型定义才能发现;抽象层数多,出 bug 时定位成本更高。

一句话结论:如果你只是想要一个带缓存的请求 Hook,它是杀鸡用牛刀;但如果你正在为「HTTP 请求和 WebSocket 推送各管一摊」而头疼,hyper-fetch 是目前少数真正想过这件事的框架,值得花一个下午读源码。

内容已同步仓库最新状态(最后提交:3 天前)。 编辑团队负责选题与抽样审核,详见 编辑准则。

相关仓库

freeCodeCamp/freeCodeCamp avatar
freeCodeCampfreeCodeCamp
2 小时前
458.9k
47.4k
193

freeCodeCamp.org 的开源代码库和课程体系。免费学习数学、编程和计算机科学。

learn-to-codenonprofitsprogramming+7
TypeScript
571.3 MB
9
详情
morluto/rea avatar
reamorluto
1 小时前
449.1k
110.4k
937

借助智能体逆向分析任何内容,从应用行为直至原生二进制文件。

agent-skillsaiandroid+17
TypeScript
146.5 MB
0
详情
openclaw/openclaw avatar
openclawopenclaw
14 分钟前
394.3k
82.9k
8.1k

真正做实事的 AI。任何 OS。任何平台。龙虾之道。🦞

aiassistantcrustacean+4
TypeScript
13.2 GB
18
详情
nilbuild/developer-roadmap avatar
developer-roadmapnilbuild
4 小时前
371.7k
45.8k
6

交互式路线图、指南及其他教育内容,帮助开发者在职业生涯中成长。

computer-scienceroadmapdeveloper-roadmap+7
TypeScript
356.1 MB
2
详情
deepseek-ai/deepseek-harness avatar
deepseek-harnessdeepseek-ai
6 天前
278.0k
34.0k
0

DeepSeek Harness:一切皆插件。

ai-agentscordisdsh+1
TypeScript
351.8 MB
3
详情
anomalyco/opencode avatar
opencodeanomalyco
22 分钟前
225.8k
30.5k
4.3k

开源编码代理。

TypeScript
674.7 MB
0
详情
vuejs/vue avatar
vuevuejs
2024年10月10日
212.6k
34.1k
645

这是 Vue 2 的仓库。如需 Vue 3,请前往 https://github.com/vuejs/core

frameworkfrontendjavascript+1
TypeScript
31.4 MB
0
详情
n8n-io/n8n avatar
n8nn8n-io
11 分钟前
210.0k
61.4k
1.2k

具备原生 AI 能力的公平代码工作流自动化平台。将可视化构建与自定义代码相结合,支持自托管或云端部署,提供 400+ 种集成。

automationipaasn8n+7
TypeScript
788.6 MB
3
详情

关于

ajaxbuildercachedata-exchangefetchfirebasegraphqljavascriptnextjsofflinepersistencequeryreactrealtimesocketssseswrtypescriptwebsocketsxhr
  • Apache License 2.0
  • 1.3k Stars
  • 32 Forks
  • 3 Watching

简要分析

热度分
1402
价值分
810
活跃状态
活跃
GitHub

语言占比

CSS
HTML
JavaScript
Shell
TypeScript

Release

  • hyper-fetch-v9.4.13 天前
  • hyper-fetch-v9.4.01 周前
  • hyper-fetch-v9.3.02 周前
  • hyper-fetch-v9.2.02 周前
  • hyper-fetch-v9.1.010月8日

贡献者

prc5prc5GerasNyxGerasNyxalbelewandowskialbelewandowskisnyk-botsnyk-botExmiraiExmiraiLukasHirtLukasHirtabidonabidonth3fallenth3fallenbanticbanticschalkventerschalkventerYeasiinYeasiindependabot[bot]dependabot[bot]

Hyper Fetch

Hyper Fetch

One SDK. Any API. Fully typed.

The type-safe API layer for TypeScript apps. Connect to REST, GraphQL, Firebase, WebSockets, SSE — all with one consistent interface and the best type safety in the ecosystem.

Documentation | Quick Start | Guides

Follow on Twitter

Join our Discord community


Quick Start

Define requests manually

import { createClient } from "@hyper-fetch/core";

// Create a client — this is the single entry point for all your API calls
const client = createClient({ url: "https://api.example.com" });

// Define a typed request — response shape is inferred everywhere from here
const getUsers = client.createRequest<{ response: { id: number; name: string }[] }>()({
  endpoint: "/users",
  method: "GET",
});

// Send it — data, error, and status are fully typed
const { data, error, status } = await getUsers.send();

Or generate from OpenAPI

npx @hyper-fetch/cli generate --url https://api.example.com/openapi.json
import { sdk } from "./generated";

// Every endpoint from your schema is available as a typed method
const { data } = await sdk.users.list.send();

Why HyperFetch?

  • 🔮 Zero guesswork — End-to-end TypeScript types from schema to response, full autocompletion, zero any
  • 📡 One interface for everything — REST, GraphQL, Firebase, WebSockets, SSE — stop learning a new library for each API
  • 💾 Data management built in — Caching, queuing, offline support, retries, and deduplication out of the box
  • ⚡ Works everywhere — React, Next.js, Remix, Astro, Node.js, Bun — same API, every environment

Try other BetterTyped projects

Hyper Fetch is the data layer inside Hype Stack, the full-stack template I build alongside it.

Build your SaaS on Hype Stack

Platinum sponsor banner

Platinum sponsors

Packages

Package Version Downloads Size
@hyper-fetch/core npm downloads size
@hyper-fetch/react npm downloads size
@hyper-fetch/sockets npm downloads size
@hyper-fetch/cli npm downloads size
@hyper-fetch/firebase npm downloads size
@hyper-fetch/firebase-admin npm downloads size
@hyper-fetch/graphql npm downloads size
@hyper-fetch/axios npm downloads size
@hyper-fetch/plugin-devtools npm downloads size

Gold sponsor banner

Gold sponsors

Examples

Fetching data

// Send and destructure — all return values are typed
const { data, error, status } = await getUsers.send();

Mutation with params and payload

// Params go in the URL, data goes in the body — both fully typed
const { data, error, status } = await createUser.send({
  params: { teamId: 1 },
  data: { name: "Jane", email: "[email protected]" },
});

React hooks

import { useFetch } from "@hyper-fetch/react";

const UserList = () => {
  // useFetch triggers the request on mount and returns typed state
  const { data, loading, error } = useFetch(getUsers);

  if (loading) return <p>Loading...</p>;
  if (error) return <p>Error loading users</p>;
  return <ul>{data?.map((u) => <li key={u.id}>{u.name}</li>)}</ul>;
};

Documentation

  • Getting Started
  • Core Concepts
  • React Integration
  • CLI & SDK Generation
  • API Reference
  • Guides

Silver sponsor banner

Silver sponsors

Our sponsors

Sponsors

License

MIT

评论

登录 后发表评论
暂无评论
GitRead 中文社区
深度解读 · 趋势洞察 · 价值精选

关于

关于我们联系我们编辑准则收录标准赞赏人员

发现

技术趋势新手训练营资源精选实战指南精选专题热门话题GitHub 文档

条款

隐私政策服务条款网站地图
26.9万收录项目
5.8万中文话题
155精选专题
发现技术价值,连接开源智慧
© 2026 GitRead · GitHub 中文社区 本站与 GitHub, Inc. 无隶属关系;GitHub 是 GitHub, Inc. 的商标。