axios-dedupe-adapter

中文文档
0.1.0发布于 2026/11/03MITTypeScriptESM + CJS零依赖

Axios adapter for concurrent request deduplication (in-flight merge) with optional TTL result caching. Zero runtime dependencies.

原始使用文档
文档目录16 节
  1. 特性
  2. 安装
  3. 使用
  4. 运行时清除缓存
  5. 挂到实例上方便调用
  6. 设计说明
  7. 并发合并 vs 结果缓存
  8. 为什么 signal 请求不合并
  9. 为什么 FormData 不自动合并
  10. 拦截器 / adapter 两阶段 key 对齐
  11. API
  12. generateRequestKey(config) → string
  13. createDedupeAdapter(axios) → Function
  14. clearCache() → void
  15. 注意事项
  16. License

axios-dedupe-adapter

Axios 适配器:并发请求合并(in-flight dedupe)+ 可选 TTL 结果缓存。零运行时依赖。

特性

  • 零运行时依赖 — 仅依赖 axios(peer),npm 装下来 0KB 额外体积
  • 三种行为模式:
    • 默认(isMerge 未设置):完全透明,和原生 axios 行为一致
    • 仅合并(isMerge: true, cacheTime: 0):并发同请求共享一个 Promise,完成立即释放
    • 合并 + 缓存(isMerge: true, cacheTime: N):请求完成后结果保留 N 秒
  • 边界安全:
    • AbortController 的 signal 请求不会被合并(取消语义不会错乱)
    • FormData / Blob / ArrayBuffer / 循环引用对象不会被错误合并
    • JSON 字符串与对象在拦截器阶段 / adapter 阶段算出的 key 保持一致

安装

npm install axios-dedupe-adapter
# 或
pnpm add axios-dedupe-adapter
# 或
yarn add axios-dedupe-adapter

使用

import axios from 'axios'
import { createDedupeAdapter } from 'axios-dedupe-adapter'

const instance = axios.create({ baseURL: '/api' })

// 挂载适配器
instance.defaults.adapter = createDedupeAdapter(instance)

// ============ 每个请求单独控制行为 ============

// 普通请求(默认不合并,零副作用)
instance.get('/users')

// 并发同请求合并:只发一次 HTTP,两个调用方共享同一个 Promise
instance.get('/shared', { isMerge: true })
instance.get('/shared', { isMerge: true }) // ← 不发新请求

// 合并 + 缓存 10 秒:10 秒内后续请求直接返回缓存结果
instance.get('/config', { isMerge: true, cacheTime: 10 })

运行时清除缓存

import { clearCache } from 'axios-dedupe-adapter'

// 所有进行中请求和结果缓存(含定时器)全部释放
clearCache()
// 场景:用户登出、主题切换、退出某租户

挂到实例上方便调用

import { createDedupeAdapter, clearCache, generateRequestKey } from 'axios-dedupe-adapter'

instance.defaults.adapter = createDedupeAdapter(instance)
instance.clearCache = clearCache
instance.generateRequestKey = generateRequestKey

设计说明

并发合并 vs 结果缓存

两者独立但可组合:

isMergecacheTime行为
未设置 / false忽略每次发新请求(默认,零副作用)
true0只合并 in-flight 请求,完成立即释放
true> 0合并 + 请求完成后缓存 N 秒

为什么 signal 请求不合并

const ctrl = new AbortController()
instance.get('/resource', { signal: ctrl.signal, isMerge: true })

如果这个请求被合并,它会共享第一个请求的 Promise 和 signal。当你 ctrl.abort() 时,实际上会把所有在途的共享请求一起取消 —— 这违反了使用者对 AbortController 的直觉(一个 controller 只控制自己的请求)。因此实现里显式跳过带 signal 的请求。

为什么 FormData 不自动合并

JSON.stringify(new FormData()) === '{}',这意味着两个不同内容的表单(比如上传文件 A 和文件 B)会算出同一个 key。实现里手动把 FormData 展开成 name=value&name=value 的形式,遇到非 string 值(File / Blob)直接降级为唯一 key,保证安全。

拦截器 / adapter 两阶段 key 对齐

axios 请求生命周期中,config.data 可能在拦截器阶段是对象、在 adapter 阶段被 transformRequest 序列化成 JSON 字符串。如果 key 只 JSON.stringify(value),这两个阶段会算出不同 key,导致缓存永远命不中。normalizePart() 对字符串形式的 JSON 做了 parse → stringify 归一化,保证两个阶段结果一致。

API

generateRequestKey(config) → string

从 axios config 生成唯一 key。同 (url, method, params, data) 的请求得到相同 key。可用于自定义逻辑(比如自己写 abort controller 的缓存 key)。

createDedupeAdapter(axios) → Function

创建适配器函数,赋值给 axios.defaults.adapter。

clearCache() → void

清空全部缓存条目(含 in-flight + 结果缓存 + 定时器)。不会取消正在进行中的底层 HTTP 请求,只是释放本地 Map。

注意事项

  • isMerge 默认关闭,不影响现有请求行为
  • signal 请求不会被合并
  • FormData 含非 string 值、二进制、循环引用对象会退化为唯一 key(不会被错误合并,但也不会享受到合并/缓存的好处)
  • clearCache() 不取消正在进行的 HTTP 请求,只清空本地缓存

License

MIT

版本与发布记录

axios-dedupe-adapter 共发布 2 个版本,首次发布于 2026/11/03;过去 12 个月发布了 2 个版本。

版本发布日期距今
0.1.0latest2026/11/03今天
0.0.0-stage2026/11/03今天

关于 axios-dedupe-adapter 的常见问题

axios-dedupe-adapter 是什么?

用于并发请求重复数据删除(动态合并)的Axios适配器,具有可选的TTL结果缓存。零运行时依赖项。

如何安装 axios-dedupe-adapter?

在项目目录运行 npm install axios-dedupe-adapter,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:axios(>=0.21)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

axios-dedupe-adapter 支持 TypeScript 吗?

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

axios-dedupe-adapter 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

axios-dedupe-adapter 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=14。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

axios-dedupe-adapter 可以商用吗?

axios-dedupe-adapter 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

axios-dedupe-adapter 还在维护吗?

最新版本 0.1.0 发布于 2026/11/03(今天);至今共发布 2 个版本,其中过去 12 个月发布了 2 个;首次发布于 2026/11/03。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。