@cplieger/fetch

中文文档
2.3.0发布于 2026/11/01Apache-2.0TypeScriptES Module零依赖构建来源已验证近 30 天下载 3950

处理类型Script JSON 请求, 不丢弃, 作为输入结果或数据或数值

此软件包已被标记为弃用

Moved into @cplieger/ui: import @cplieger/ui/fetch. Guide: https://github.com/cplieger/ui/blob/main/docs/migrating.md

中文使用文档
文档目录12 节
  1. 为什么用它
  2. 安装
  3. 使用量
  4. API 密码
  5. 错误是值
  6. 路径停留在您的基址下
  7. 不支持设计
  8. 相关项目
  9. 文档
  10. 捐款
  11. 免责声明
  12. 许可证

获取

npm JSR Mutation (TS)

@cplieger/fetch 覆盖平台 fetch 对于 TypeScript , JSON 请求从不掷出 。 每个调用返回一个输入的成功值或错误值,或只返回数据或 null 当你需要的就是这些.

它取代了 try编号 :catch,则 response.ok 检查和 JSON.parse 否则你每通电话都会写 它没有运行时间依赖和船舶作为只作为无害环境管理的TypeScript源,你的捆绑者用自己的代码编译. 它需要TypeScript 5.0或更晚,并运行于Node 18,Chrome 103,Safari 16和Firefox 100或更晚. 它根据Apache-2.0获得许可.

为什么用它

@cplieger/fetch 用于前端和服务器的代码,该代码可调用 JSON API ,并想要处理其中的每个失败 if。 。 。 .

  • 网络故障、 超时、 取消请求、 非-2xx 响应以及 无法验证的机构 都以错误值返回 code。 。 。 .
  • 失败的反应保持了状态,标题和解析JSON的身体,所以429's Retry-After 是一个财产离开.
  • 验证是一个简单的函数,所以 Zod 或 valibot schema 插件作为 (v) => schema.parse(v)。 。 。 .
  • 有了绝对的基础URL,绝对或协议相对路径无法到达另一个来源.
  • 它大约是2千B 精密和克齐普, 它的测试 与铬自己的 fetch, (中文(简体) ), Headers 财务报告和审定财务报表 AbortSignal。 。 。 .

考虑 凯 如果您想要在一个客户端中重试、挂钩、上传和下载进度。 考虑 函数 如果您需要在节点、浏览器和工人上进行流式响应和自动重试.

安装

npx jsr add @cplieger/fetch
# or
npm i @cplieger/fetch

使用量

每个后端创建一个实例, 然后在结果上创建分支 :

import { createFetch } from "@cplieger/fetch";

export const api = createFetch({ baseUrl: "https://api.example.com/v1" });

const res = await api.apiGetRaw<{ id: string; name: string }>("/users/me");
if (res.ok) {
  console.log(res.data.name, res.headers.get("ETag"));
} else {
  // status is 0 when no response arrived; code says why.
  console.error(res.status, res.code, res.error);
}

当您只需要数据时,没有后缀的帮助者返回数据,或者 null 任何错误. apiPost, (中文(简体) ), apiPut 财务报告和审定财务报表 apiPatch 发送他们的第二个参数作为 JSON 与 Content-Type: application/json数字 :

const user = await api.apiGet<{ id: string; name: string }>("/users/me"); // the user, or null
const created = await api.apiPost<{ id: string }>("/items", { name: "widget" });

验证一个具有返回已键入值或抛出值的任何函数的响应正体。 抛出一个错误 code: "decode"数字 :

import { z } from "zod";

const User = z.object({ id: z.string(), name: z.string() });
const user = await api.apiGetTyped("/users/me", (v) => User.parse(v)); // typed, or null

每个帮手都要最后的 options 对取消信号、超时、额外标题、解码器、预编码机构、跳过成功机构或读取为 Blob数字 :

const controller = new AbortController();
await api.apiGetRaw("/slow", { signal: controller.signal, timeoutMs: 5_000 });
await api.apiDeleteRaw("/items/1", { ignoreBody: true });
const poster = await api.apiGet("/posters/42", { as: "blob" }); // a Blob, or null

在一个地方对每一次失败采取行动,如在会话到期时将用户发送到其中签字,使实例 onError 钩. 它看到每一个失败 与它的 code 已经从身体上读到, 并且它不扔或返回到呼叫者:

export const api = createFetch({
  baseUrl: "https://api.example.com/v1",
  onError: (err) => {
    if (err.status === 401 && err.code === "session_expired") location.assign("/login");
  },
});

在路径中设置查询参数, 例如 /items?page=2。要添加一个在启动后更改的页眉,例如一个符号,请在实例中读取 prepareHeaders 钩子,它运行在每一个请求。 超时开始于 prepareHeaders 返回,所以可以挂起的钩子需要自己的限制. 请求、超时和运行时间 覆盖每个设置和选项.

API 密码

  • 实例 : createFetch(config?) 返回 a FetchInstance。 。 。 . FetchConfig 持有 baseUrl, (中文(简体) ), credentials, (中文(简体) ), prepareHeaders, (中文(简体) ), fetchFn, (中文(简体) ), maxResponseBytes 财务报告和审定财务报表 onError。 。 。 .
  • 一次请求: requestRaw 财务报告和审定财务报表 request附加时 apiGet, (中文(简体) ), apiPost, (中文(简体) ), apiPut, (中文(简体) ), apiPatch 财务报告和审定财务报表 apiDelete 以简单形式返回数据或 null (单位:千美元) *Raw 以返回全部结果. apiGetTyped 财务报告和审定财务报表 apiPostTyped 还取解码器.
  • 超时 : withTimeout(signal, ms) 财务报告和审定财务报表 API_TIMEOUT_MS30,000毫秒(英语:.
  • 类型 : ApiOk<T>, (中文(简体) ), ApiErr, (中文(简体) ), ApiResult<T>, (中文(简体) ), Decoder<T>, (中文(简体) ), FailedRequest, (中文(简体) ), HttpMethod, (中文(简体) ), RequestOptions<T> jSON读取和 BlobRequestOptions 页:1 as: "blob"。 。 。 .

全文见 日 尔。 。 。 .

错误是值

requestRaw 和每个 *Raw 帮助者决心 ApiResult<T> 永远不要扔 一个成功是 { ok: true, status, data, headers }。错误是 { ok: false, status, error, code?, requestId?, headers?, body? }。 。 。 .

status 当没有回复时为 0. code 那时 network, (中文(简体) ), timeout, (中文(简体) ), cancelled 或者说 invalid时 invalid 表示请求无法构建且从未发送 。 不是JSON或者解码器故障的2xx尸体是 decode真实状态 非-2xx响应保持其状态和标题. 当它的身体是JSON时, body 拿着它,还有它的 error, (中文(简体) ), code 财务报告和审定财务报表 request_id 字段填充结果 error, (中文(简体) ), code 财务报告和审定财务报表 requestId。 。 。 .

服务器控制 code 发送 timeout 或另一个图书馆代码。 图书馆代码随之而来 status 0,或 2xx 状态 decode,而服务器代码总是随其非-2xx状态而来. 处理 body 作为不信任的输入.

一个204或一个空的2xx体给予 data: undefined被援助者变成 null一个JSON null, (中文(简体) ), 0, (中文(简体) ), false 或者说 "" 是真实的数据.

结果和错误 有完整的合同.

路径停留在您的基址下

绝对的 baseUrl,每个请求都会去那个计划和主机。 类似路径 https://other.example 或者说 //host 成为路径的一部分,所以 https://api.example.com/v1 加号 https://other.example 请求 https://api.example.com/v1/https://other.exampleA级 ..,一个点段或一个回击不能从基路径爬出,而查询字符串和片段是按书面发送的.

保护需要 baseUrl 有计划 和东道主。 空或相亲 baseUrl,一个与协议相对的路径仍然可以到达另一个来源. 没有 baseUrl,路径 fetch() 不变,所以永远不要通过不信任的输入作为整个路径.

基础 URL 和不信任的回复 覆盖此和响应大小上限 .

不支持设计

@cplieger/fetch 没有重试或回放、截取链、响应缓存、解码器梳理器、可变或全局设置、自动同位素键或请求ID头,或流式响应. 不支持设计 给出每个理由 以及用什么代替.

  • @cplieger/ 动作 以这个库为基础,并添加了备份的再试,请求去dupe,乐观的更新和通知.
  • httpx 数据 是 Go 库,用于输出的 HTTP 调用, 并使用复写和备份 .

文档

捐款

欢迎提出问题和拉动请求。 见 捐款额。 。 。 .

免责声明

这个项目是精心设计的,遵循安全最佳做法,但打算供个人/自发使用。 不保证生产环境的适宜性. 自己冒险使用.

这个项目是利用AI辅助工具,使用 克劳德, (中文(简体) ), 常规,以及 基罗人类维护者界定建筑、监督实施和作出所有最后决定.

许可证

阿帕奇2.0 (英语). 见 自由主义。 。 。 .

版本与发布记录

@cplieger/fetch 共发布 14 个版本,首次发布于 2026/07/05;过去 12 个月发布了 14 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
2.3.0latest2026/11/019 天前
2.3.0-dev.1dev2026/10/1823 天前
2.2.22026/10/081 个月前
2.2.12026/09/201 个月前
2.2.02026/09/141 个月前
2.1.22026/08/232 个月前

关于 @cplieger/fetch 的常见问题

@cplieger/fetch 是什么?

处理类型Script JSON 请求, 不丢弃, 作为输入结果或数据或数值注意:该包已被作者标记为弃用——Moved into @cplieger/ui: import @cplieger/ui/fetch. Guide: https://github.com/cplieger/ui/blob/main/docs/migrating.md

如何安装 @cplieger/fetch?

在项目目录运行 npm install @cplieger/fetch,或使用 pnpm add / yarn add / bun add。

@cplieger/fetch 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@cplieger/fetch 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@cplieger/fetch 可以商用吗?

@cplieger/fetch 使用 Apache-2.0 许可。宽松许可:允许商业使用、修改和再分发,并附带明确的专利授权;分发时需保留许可与 NOTICE 文件,修改过的文件要注明改动。以上为概括,不构成法律意见,请以许可原文为准。

@cplieger/fetch 的下载量有多少?

根据 npm 官方下载统计,@cplieger/fetch 在 2026/10/11 – 2026/11/09 这 30 天内被下载 3,950 次,日均约 132 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@cplieger/fetch 还在维护吗?

最新版本 2.3.0 发布于 2026/11/01(9 天前);至今共发布 14 个版本,其中过去 12 个月发布了 14 个;首次发布于 2026/07/05。作者已将其标记为弃用,新项目建议寻找替代方案。