Skip to content

参考 ​

ky 2.x 常用方法、选项、默认值、hooks、错误类型与导出速查。版本基线 ky 2.0.2。⚠️ ky 是 ESM-only,全部用 import。

速查 ​

  • 主 API:ky(input, options) 加 get/post/put/patch/head/delete;create 创建全新默认,extend 继承父默认。
  • 响应读取:直接 await 得到增强 Response;可链 .json()、.text()、.blob()、.arrayBuffer()、.formData(),支持时还有 .bytes()。
  • URL 选项:baseUrl 标准解析,prefix 字符串拼接;ky 2.x 不再提供 prefixUrl。
  • 超时默认:每次尝试 timeout: 10000,整体 totalTimeout: false;通过 AbortSignal 主动取消。
  • 重试默认:limit: 2,仅幂等方法和指定状态码;超时默认不重试,jitter 与 Retry-After 负责节奏控制。
  • hooks:五类 hook 均为数组;beforeRequest 可替换 Request / 返回 Response,afterResponse 可返回 ky.retry()。
  • 错误读取:用 isHTTPError 等守卫;ky 2.x 的 HTTP 错误体位于 error.data,Standard Schema 失败单独抛 SchemaValidationError。
  • 运行环境:ESM-only、Node.js 22+、现代浏览器 / Bun / Deno,零运行时依赖。

一、方法快捷方式 ​

方法说明
ky(input, options?)主函数,input 接受 string | URL | Request
ky.get(input, options?)GET
ky.post(input, options?)POST
ky.put(input, options?)PUT
ky.patch(input, options?)PATCH
ky.head(input, options?)HEAD
ky.delete(input, options?)DELETE
ky.create(defaults)全新实例(不继承父默认)
ky.extend(defaults|fn)继承父默认并深合并的新实例
ky.stopSymbol,从 beforeRetry 返回以静默停止重试
ky.retry(options?)从 afterResponse 返回以强制重试

options / trace 是合法 HTTP 方法(在重试默认 methods 内),但没有同名快捷方法,需用 ky(url, { method: 'options' })。

二、响应快捷方法 ​

方法返回
.json<T = unknown>(schema?)解析 JSON(可传 Standard Schema 校验)
.text()文本
.blob()Blob
.arrayBuffer()ArrayBuffer
.formData()FormData
.bytes()Uint8Array(运行时相关)

没有 .buffer()。直接 await ky.get(url) 得到(增强过的)Response。

三、核心选项与默认值 ​

选项默认说明
method'get'HTTP 方法,标准方法自动大写
json—发送 JSON 的快捷方式(自动序列化 + 设 Content-Type)
body—原生 fetch 语义(传 FormData/流等用它)
searchParams''查询参数(对象/字符串/数组/URLSearchParams)
baseUrl—按标准 URL 解析的基地址
prefix—纯字符串拼接的前缀(剥 input 前导 /)
timeout10000每次尝试超时(ms),false 关闭
totalTimeoutfalse整个操作(含重试)总超时(ms)
retry2(即 limit)重试配置,详见下表
throwHttpErrorstrue非 2xx 抛 HTTPError;可传 (status)=>boolean
hooks各 []生命周期钩子
parseJsonJSON.parse自定义 JSON 解析
stringifyJsonJSON.stringify自定义 JSON 序列化
fetch原生 fetch自定义 fetch 实现
context{}传给 hooks 的上下文(始终是对象,浅合并)
onDownloadProgress—(progress, chunk) => void
onUploadProgress—(progress, chunk) => void(需请求流支持)
signal—AbortSignal,用于取消

⚠️ 1.x 的 prefixUrl 在 2.x 已移除,拆为 baseUrl + prefix。

四、retry 子选项 ​

子选项默认说明
limit2最多重试次数
methods['get','put','head','delete','options','trace']可重试方法(不含 POST/PATCH)
statusCodes[408, 413, 429, 500, 502, 503, 504]可重试状态码
afterStatusCodes[413, 429, 503]尊重 Retry-After 头的状态码
maxRetryAfterInfinityRetry-After 的上限
backoffLimitInfinity退避延迟上限(ms)
delayn => 0.3 * 2**(n-1) * 1000延迟函数(指数退避)
jitterundefined抖动:true 或 (delay)=>number
retryOnTimeoutfalse超时是否重试
shouldRetryundefined({error, retryCount}) => boolean|undefined

retry 直接传数字时被当作 limit,其余保持默认(retry: 5 ≡ retry: { limit: 5 })。

五、hooks 速查 ​

hook签名(state)返回同步?
init(options)void(就地改 options)是
beforeRequest({request, options, retryCount})Request(替换)/ Response(短路)/ void否
beforeRetry({request, options, error, retryCount})Request / Response / ky.stop / void否
beforeError({request, options, error, retryCount})Error(必返回)否
afterResponse({request, options, response, retryCount})Response(覆盖)/ ky.retry() / void否

beforeRequest 里 retryCount 恒为 0;beforeRetry 里 retryCount >= 1。每类 hook 是数组、按序串行执行。

六、错误类型 ​

类何时抛关键属性类型守卫
HTTPError收到非 2xx 响应response / request / options / dataisHTTPError
NetworkError网络层失败(无响应)request / causeisNetworkError
TimeoutError超时requestisTimeoutError
ForceRetryErrorky.retry() 超出 limit—isForceRetryError
KyError上述错误的基类—isKyError
SchemaValidationError.json(schema) 校验失败issues—(不属 KyError)

⚠️ 2.x 读 HTTPError 的错误体用 error.data(已预解析),不要再 error.response.json()(body 已被消费)。

七、命名导出 ​

ts
import ky, {
  // 错误类
  HTTPError, TimeoutError, NetworkError, KyError, ForceRetryError, SchemaValidationError,
  // 类型守卫
  isHTTPError, isTimeoutError, isNetworkError, isKyError, isForceRetryError,
  // 工具
  replaceOption,
} from "ky";

// 类型(TS)
import type { Options, NormalizedOptions, Hooks, RetryOptions, KyInstance } from "ky";

八、运行环境 ​

项ky 2.xky 1.x
模块格式ESM-onlyESM-only
Node.js≥ 22≥ 18
浏览器现代浏览器(需 fetch)现代浏览器
其他运行时Bun / DenoBun / Deno
依赖零依赖零依赖

九、1.x → 2.x 迁移要点 ​

变更1.x2.x
URL 前缀prefixUrl拆为 baseUrl(标准解析)+ prefix(纯拼接)
Node 门槛18+22+
init hook无新增(同步改 options)
totalTimeout无新增(操作总超时)
NetworkError + 类型守卫无新增(isHTTPError 等)
错误体读取error.response.json()改读 error.data(response body 已被消费)

命令与选项查完,回 指南 · 基础 理解机制,或 指南 · 专家 看 ESM 接入、init hook、Retry-After 等深水区。