Axios
基于 Promise 的 HTTP 客户端,同时支持浏览器和 Node.js,是 JavaScript 生态中使用最广泛的 HTTP 请求库之一。
Axios 是开源的基于 Promise 的 HTTP 客户端库,同时支持浏览器和 Node.js 环境,提供拦截器、自动 JSON 转换、请求取消、超时控制、进度监控等功能。npm 周下载量超 1 亿次,GitHub 约 108,600 Stars,是前端和全栈开发者最常用的 HTTP 客户端之一。
Axios
基于 Promise 的 HTTP 客户端,同时支持浏览器和 Node.js,是 JavaScript 生态中使用最广泛的 HTTP 请求库之一。
技术简介说明
Axios 是一个开源的、基于 Promise 的 HTTP 客户端库,可以在浏览器和 Node.js 环境中运行。它由 Matt Zabriskie 于 2014 年创建,至今已发展成为 npm 上周下载量超过 1 亿次的顶级 HTTP 客户端库。Axios 的核心价值在于提供了一套简洁、一致的 API 来处理 HTTP 请求,同时内置了大量开发者日常需要的功能——拦截器、自动 JSON 转换、请求/响应取消、超时控制、进度监控等。
Axios 的设计哲学是"开箱即用"。与原生 Fetch API 相比,它不需要手动处理响应体的解析(如 response.json()),不需要手动判断 HTTP 状态码(可配置自动抛出非 2xx 响应),不需要额外封装即可实现请求拦截、响应拦截、重试、取消等常见需求。这使得 Axios 在大型企业级项目和快速迭代的中小型项目中都有广泛应用。
在 Node.js 生态中,Axios 是许多框架和 SDK 的底层 HTTP 引擎,被 NestJS、Nuxt.js、Strapi 等知名项目集成使用。截至 2026 年,Axios 仍然是 npm 上下载量最高的 HTTP 客户端之一,拥有约 10.8 万 GitHub Stars,是前端和全栈开发者必须掌握的基础工具。
基本信息
| 属性 | 说明 |
|---|---|
| 官网 | https://axios-http.com |
| GitHub | https://github.com/axios/axios |
| License | MIT |
| 最新版本 | v1.18.1(2026 年 6 月 21 日发布) |
| GitHub Stars | ~108,600+(2026 年 7 月) |
| npm 周下载量 | ~1 亿+ |
| 主要维护者 | Jason Saayman(Lead Maintainer)、Jay、Dmitriy Mozgovoy(Core Contributor) |
| 创建者 | Matt Zabriskie |
| 支持环境 | 浏览器(XHR / Fetch)、Node.js(http / fetch adapter) |
| 包大小 | ~35.6 KB(gzip: ~13.5 KB) |
| TypeScript | 内置类型定义(axios/index.d.ts) |
快速上手
安装
# npm
npm install axios
# yarn
yarn add axios
# pnpm
pnpm add axios
# CDN(浏览器直接使用)
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>基础配置
import axios from 'axios'
// 创建自定义实例,配置默认值
const instance = axios.create({
baseURL: 'https://api.example.com',
timeout: 10000,
headers: {
'Content-Type': 'application/json',
},
// 自动将响应体解析为 JSON
responseType: 'json',
// 只有状态码在 2xx 范围内才不会触发错误
validateStatus: (status) => status >= 200 && status < 300,
})
// 请求拦截器:在请求发送前统一处理
instance.interceptors.request.use(
(config) => {
// 自动附加 Token
const token = localStorage.getItem('token')
if (token) {
config.headers.Authorization = `Bearer ${token}`
}
return config
},
(error) => Promise.reject(error)
)
// 响应拦截器:统一处理响应和错误
instance.interceptors.response.use(
(response) => response.data,
(error) => {
if (error.response?.status === 401) {
// 处理未授权
window.location.href = '/login'
}
return Promise.reject(error)
}
)最小示例
import axios from 'axios'
// GET 请求
const { data } = await axios.get('https://api.example.com/users')
console.log(data)
// POST 请求
const result = await axios.post('https://api.example.com/users', {
name: '张三',
email: '[email protected]',
})
// 带参数的请求
const users = await axios.get('/users', {
params: { role: 'admin', page: 1 },
})核心概念与架构
Axios 的架构由以下几个核心部分组成:
┌─────────────────────────────────────────────┐
│ Axios 实例 │
├─────────────────────────────────────────────┤
│ 请求拦截器链 → Adapter → 响应拦截器链 │
│ (Request (HTTP/XHR (Response │
│ Interceptors) Adapter) Interceptors) │
├─────────────────────────────────────────────┤
│ 核心功能层 │
│ · Transformers(数据转换) │
│ · Defaults(默认配置) │
│ · CancelToken / AbortController(取消请求) │
│ · Progress(进度事件) │
├─────────────────────────────────────────────┤
│ 环境适配层 │
│ · XHR Adapter(浏览器 XMLHttpRequest) │
│ · Fetch Adapter(浏览器/Node.js Fetch API) │
│ · HTTP Adapter(Node.js http/https 模块) │
└─────────────────────────────────────────────┘
请求生命周期
- 配置合并:将实例默认配置、请求配置合并
- 请求拦截器:按添加的逆序(LIFO)依次执行
- 数据转换:请求前自动序列化请求体(默认支持 JSON、FormData、URLSearchParams)
- Adapter 发送请求:根据环境选择合适的适配器
- 数据转换:响应后自动反序列化响应体
- 响应拦截器:按添加的顺序(FIFO)依次执行
- 返回结果:返回包含
data、status、statusText、headers、config的响应对象
核心特性
1. 请求/响应拦截器
Axios 最强大的特性之一。可以在请求发送前和响应返回后统一处理,适用于 Token 注入、错误重试、日志记录、全局错误处理等场景。
// 请求拦截器
axios.interceptors.request.use((config) => {
config.headers['X-Request-Time'] = Date.now()
return config
})
// 响应拦截器
axios.interceptors.response.use(
(response) => response,
(error) => {
// 全局错误处理
return Promise.reject(error)
}
)2. 自动 JSON 转换
请求和响应默认自动进行 JSON 序列化/反序列化,无需手动调用 JSON.stringify() 或 response.json()。
3. 请求取消
支持通过 AbortController(推荐)和传统的 CancelToken 两种方式取消请求。
// AbortController(现代方式)
const controller = new AbortController()
axios.get('/api/data', { signal: controller.signal })
controller.abort() // 取消请求
// CancelToken(传统方式,已不推荐)
const source = axios.CancelToken.source()
axios.get('/api/data', { cancelToken: source.token })
source.cancel('请求已取消')4. 上传/下载进度监控
在浏览器环境中支持监控上传和下载进度。
axios.post('/upload', formData, {
onUploadProgress: (e) => {
console.log(`上传进度: ${Math.round((e.loaded / e.total) * 100)}%`)
},
onDownloadProgress: (e) => {
console.log(`下载进度: ${Math.round((e.loaded / e.total) * 100)}%`)
},
})5. 超时控制
axios.get('/api/slow', {
timeout: 5000, // 5 秒超时
})6. 并发请求
const [users, posts] = await axios.all([
axios.get('/users'),
axios.get('/posts'),
])
// 或使用 Promise.all
const results = await Promise.all([
axios.get('/users'),
axios.get('/posts'),
])7. 多环境 Adapter
内置三种适配器:浏览器 XHR、Fetch API、Node.js HTTP。支持自定义 Adapter。
// 使用 Fetch Adapter(Axios 1.7+)
axios.get('/api/data', { adapter: 'fetch' })
// 使用 HTTP Adapter(Node.js)
axios.get('/api/data', { adapter: 'http' })
// 自定义 Adapter
axios.get('/api/data', {
adapter: async (config) => {
// 自定义请求逻辑
return { data: {}, status: 200, statusText: 'OK', headers: {}, config }
},
})8. CSRF/XSRF 防护
内置 CSRF Token 自动携带机制。
axios.post('/api/action', data, {
xsrfCookieName: 'csrftoken',
xsrfHeaderName: 'X-CSRFToken',
withCredentials: true,
})9. 请求/响应数据转换
// 自定义请求转换
axios.post('/api', data, {
transformRequest: [
(data, headers) => {
// 自定义序列化逻辑
return JSON.stringify(data)
},
...axios.defaults.transformRequest,
],
})10. 最大内容长度限制
防止下载超大文件导致内存溢出。
axios.get('/api/large-file', {
maxContentLength: 50 * 1024 * 1024, // 限制 50MB
maxBodyLength: 50 * 1024 * 1024,
})生态图
核心生态项目
| 项目 | 说明 | 地址 |
|---|---|---|
| axios-cache-interceptor | 最流行的 Axios 缓存拦截器,减少重复请求 | GitHub |
| axios-mock-adapter | 请求拦截 Mock 工具,常用于测试 | GitHub |
| axios-retry | 自动重试失败的请求,支持指数退避 | npm |
| axios-logger | 请求/响应日志格式化输出 | npm |
| axios-extensions | 扩展工具集:缓存、节流、重试 | GitHub |
| axios-hooks | React Hooks 封装 | npm |
框架集成
| 框架 | 集成方式 |
|---|---|
| Vue.js | 官方推荐通过 provide/inject 或 Vue 实例挂载使用 |
| React | 配合 useEffect / 自定义 Hook 使用 |
| NestJS | @nestjs/axios 模块封装 |
| Nuxt.js | @nuxt/http 或 nuxt-axios 模块(Nuxt 3 已移除 Axios 作为默认) |
| Next.js | 在 getServerSideProps / API Route 中使用 |
工具链
- axios-cookiejar-support:Node.js 环境下支持 Cookie Jar
- axios-https-proxy-fix:HTTPS 代理支持
- axios-debug-log:调试日志输出
- axios-curlirize:将 Axios 请求转换为 cURL 命令,方便调试
适用场景
1. 企业级中后台系统
Axios 的拦截器机制非常适合中后台系统的全局鉴权、错误处理和请求日志需求。配合 Token 自动刷新、请求重试、Loading 状态管理等,可以快速搭建完善的请求层。
2. 需要统一请求/响应处理的项目
当多个页面、多个模块需要统一处理请求头、响应格式、错误码时,Axios 的实例 + 拦截器模式是最成熟的选择。
3. 需要请求取消的场景
文件上传、搜索建议(防抖取消)、页面切换取消未完成请求等场景,Axios 的 AbortController 集成非常便捷。
4. 文件上传/下载
Axios 内置进度事件监控(onUploadProgress / onDownloadProgress),适合需要显示上传/下载进度的场景。
5. Node.js SSR / BFF 层
在 Next.js、Nuxt.js 等服务端渲染框架中,Axios 可以同时服务客户端和服务端请求,配合 Adapter 切换实现同构 HTTP 调用。
6. API Mock 与测试
配合 axios-mock-adapter,可以方便地在单元测试和开发环境中拦截和模拟 API 响应,无需修改业务代码。
7. 需要重试机制的 API 调用
配合 axios-retry 或在拦截器中实现重试逻辑,在网络不稳定或 API 偶发失败时自动重试,提高请求成功率。
开发与工程化
TypeScript 支持
Axios 内置完整的 TypeScript 类型定义,支持泛型推导响应数据类型:
interface User {
id: number
name: string
email: string
}
// 泛型指定响应数据类型
const response = await axios.get<User>('/api/users/1')
const user: User = response.data
// 自定义请求配置类型
interface ApiConfig {
showLoading?: boolean
showError?: boolean
}
// 扩展 AxiosRequestConfig
declare module 'axios' {
interface AxiosRequestConfig {
showLoading?: boolean
showError?: boolean
}
}构建工具集成
// Vite - 无需额外配置,直接 import
import axios from 'axios'
// Webpack - 同上,直接 import
// Axios 会自动根据环境选择 Adapter
// 如需 Tree-shaking,使用具名导入
import { get, post } from 'axios' // 注意:Axios 默认导出,tree-shaking 效果有限环境变量配置
// .env
VITE_API_BASE_URL=https://api.example.com
VITE_API_TIMEOUT=10000
// src/api/index.ts
const api = axios.create({
baseURL: import.meta.env.VITE_API_BASE_URL,
timeout: Number(import.meta.env.VITE_API_TIMEOUT),
})请求层封装模式
// src/api/request.ts - 统一请求层
import axios, { type AxiosRequestConfig, type AxiosResponse } from 'axios'
const request = axios.create({
baseURL: import.meta.env.VITE_API_BASE_URL,
timeout: 15000,
})
// 请求拦截器
request.interceptors.request.use((config) => {
// Token、Loading、日志等
return config
})
// 响应拦截器
request.interceptors.response.use(
(response: AxiosResponse) => {
// 统一解包响应数据
return response.data
},
(error) => {
// 统一错误处理
const status = error.response?.status
const messages: Record<number, string> = {
400: '请求参数错误',
401: '未授权,请重新登录',
403: '拒绝访问',
404: '请求资源不存在',
500: '服务器内部错误',
}
const message = messages[status] || `请求失败 (${status || '网络错误'})`
console.error(message)
return Promise.reject(error)
}
)
// 导出封装后的方法
export const get = <T = any>(url: string, config?: AxiosRequestConfig) =>
request.get<any, T>(url, config)
export const post = <T = any>(url: string, data?: any, config?: AxiosRequestConfig) =>
request.post<any, T>(url, data, config)
export default request性能与安全
性能考量
| 维度 | 说明 |
|---|---|
| 包大小 | ~35.6 KB(gzip: ~13.5 KB),相比 Fetch API(0 KB)有额外开销 |
| 请求性能 | 与原生 Fetch 基本一致(浏览器环境下底层使用 XHR/Fetch) |
| Tree-shaking | 默认导出,tree-shaking 效果有限;但整体体积不大 |
| 内存占用 | 拦截器链和转换函数会增加少量内存开销 |
| 连接复用 | Node.js 环境下支持 HTTP Keep-Alive,但需要手动配置 httpAgent / httpsAgent |
安全注意事项
⚠️ 2026 年供应链攻击事件
2026 年 3 月 30-31 日,Axios npm 包遭受重大供应链攻击。Google Threat Intelligence 将攻击归因于与朝鲜(North Korea)关联的威胁行为者。攻击者通过社交工程手段获取了维护者的 npm 账号权限,发布了包含恶意代码的版本(v1.14.1 和 v0.30.4)。恶意版本引入了隐藏依赖 [email protected],会投递跨平台 RAT(远程访问木马)。美国 CISA(网络安全与基础设施安全局)于 2026 年 4 月 20 日发布了官方安全公告。
应对措施:
- 确保使用 v1.15.0 及以上的安全版本
- 检查
package-lock.json/pnpm-lock.yaml中是否有可疑依赖 - 使用
npm audit或pnpm audit检查项目安全状态 - 启用 npm 的 2FA 保护维护者账号
已知 CVE
| CVE 编号 | 说明 | 影响版本 | 修复版本 |
|---|---|---|---|
| CVE-2025-58754 | data: URI 内存耗尽 DoS 攻击 | < 1.11.0 | 1.11.0+ |
| CVE-2026-40175 | 关键安全漏洞(详见安全公告) | 特定版本 | 已修复 |
| CVE-2026-44486 | Proxy-Authorization 头在跨域重定向时泄漏 | < 1.18.0 | 1.18.0+ |
通用安全建议
- 敏感头信息保护:v1.18.0+ 会自动在跨域重定向时剥离敏感头(如
Authorization、Cookie) - 原型污染防护:v1.16.0+ 加强了配置读取时对原型链污染的防护
- URL 校验:v1.18.0+ 增加了畸形 URL 的拒绝机制
- 依赖锁定:始终使用 lock 文件锁定依赖版本,避免自动升级到恶意版本
技术对比
Axios vs Fetch API vs ky vs Got
| 特性 | Axios | Fetch API | ky | Got |
|---|---|---|---|---|
| 环境 | 浏览器 + Node.js | 浏览器 + Node.js 18+ | 浏览器(基于 Fetch) | 仅 Node.js |
| 包大小 | ~35.6 KB (gzip 13.5 KB) | 0 KB(原生) | ~5 KB (gzip 2 KB) | ~50 KB |
| HTTP/2 | 不支持(浏览器环境) | 浏览器决定 | 浏览器决定 | ✅ 原生支持 |
| 请求拦截器 | ✅ 内置 | ❌ 需手动封装 | ✅ beforeRequest hooks | ✅ beforeRequest hooks |
| 响应拦截器 | ✅ 内置 | ❌ 需手动封装 | ✅ afterResponse hooks | ✅ 无直接等价物 |
| 自动 JSON | ✅ 请求/响应均自动 | ❌ 响应需手动 .json() | ✅ 自动 | ✅ 自动 |
| 超时控制 | ✅ timeout 选项 | ❌ 需用 AbortController | ✅ timeout 选项 | ✅ timeout 选项 |
| 请求取消 | ✅ AbortController + CancelToken | ✅ AbortController | ✅ AbortController | ✅ AbortController |
| 上传进度 | ✅ onUploadProgress | ❌ 需用 XHR 或 Fetch + 手动计算 | ❌ | ❌ |
| 下载进度 | ✅ onDownloadProgress | ❌ 需用 ReadableStream 手动计算 | ❌ | ✅ |
| 重试机制 | ❌ 需 axios-retry | ❌ 需手动封装 | ✅ 内置 | ✅ 内置 |
| 错误抛出 | ✅ 非 2xx 自动抛出 | ❌ 需手动检查 response.ok | ✅ 非 2xx 自动抛出 | ✅ 非 2xx 自动抛出 |
| CSRF 防护 | ✅ 内置 | ❌ 需手动处理 | ❌ | ❌ |
| FormData | ✅ 自动序列化 | ✅ 原生支持 | ✅ 自动 | ✅ 自动 |
| Cookie 控制 | ✅ withCredentials | ✅ credentials 选项 | ✅ credentials 选项 | ✅ 内置 cookie jar |
| 代理支持 | ✅ Node.js 环境支持 | ❌ 有限 | ❌ | ✅ 原生支持 |
| 缓存 | ❌ 需 axios-cache-interceptor | ❌ 需手动封装 | ❌ 需手动 | ✅ 内置缓存策略 |
| HTTP/3 | ❌ | 浏览器决定 | 浏览器决定 | ❌ |
| 下载量(周) | ~1 亿+ | 原生 API | ~1.7 万 | ~1.5 万 |
选择建议
| 场景 | 推荐 | 原因 |
|---|---|---|
| 传统企业项目 / 已有 Axios 依赖 | Axios | 生态成熟、拦截器强大、迁移成本高 |
| 新项目 / 包大小敏感 | Fetch API | 零依赖、原生支持、现代浏览器全覆盖 |
| 需要轻量 Fetch 增强 | ky | 5KB 体积、内置重试、现代 API 设计 |
| Node.js 服务端 / 微服务 | Got | HTTP/2 支持、内置缓存、重试、分页等 |
| Next.js App Router / RSC | Fetch API | 与 React 缓存机制兼容、零运行时开销 |
最佳实践
1. 使用实例而非全局 Axios
// ❌ 不推荐:污染全局配置
axios.defaults.baseURL = 'https://api.example.com'
// ✅ 推荐:创建独立实例
const api = axios.create({ baseURL: 'https://api.example.com' })2. 统一错误处理
// 在响应拦截器中集中处理所有错误
instance.interceptors.response.use(null, (error) => {
if (axios.isCancel(error)) {
console.log('请求已取消')
return Promise.reject(error)
}
const status = error.response?.status
switch (status) {
case 401:
// 跳转登录
break
case 403:
// 提示无权限
break
case 429:
// 限流处理
break
default:
// 通用错误提示
break
}
return Promise.reject(error)
})3. Token 自动刷新
let isRefreshing = false
let pendingRequests: Array<(token: string) => void> = []
instance.interceptors.response.use(null, async (error) => {
if (error.response?.status === 401 && !error.config._retry) {
if (isRefreshing) {
// 等待 Token 刷新完成
return new Promise((resolve) => {
pendingRequests.push((token) => {
error.config.headers.Authorization = `Bearer ${token}`
resolve(instance(error.config))
})
})
}
error.config._retry = true
isRefreshing = true
try {
const { data } = await axios.post('/auth/refresh', {
refreshToken: localStorage.getItem('refreshToken'),
})
const newToken = data.token
localStorage.setItem('token', newToken)
// 重试所有等待的请求
pendingRequests.forEach((cb) => cb(newToken))
pendingRequests = []
error.config.headers.Authorization = `Bearer ${newToken}`
return instance(error.config)
} finally {
isRefreshing = false
}
}
return Promise.reject(error)
})4. 请求去重
const pendingRequests = new Map<string, AbortController>()
instance.interceptors.request.use((config) => {
// 生成请求唯一标识
const key = `${config.method}:${config.url}:${JSON.stringify(config.params)}`
// 取消之前的相同请求
if (pendingRequests.has(key)) {
pendingRequests.get(key)!.abort()
}
const controller = new AbortController()
config.signal = controller.signal
pendingRequests.set(key, controller)
return config
})
instance.interceptors.response.use((response) => {
// 请求完成后移除
const key = `${response.config.method}:${response.config.url}:${JSON.stringify(response.config.params)}`
pendingRequests.delete(key)
return response
})5. 安全的版本管理
# 使用精确版本或范围锁定
# package.json
{
"dependencies": {
"axios": "~1.18.0" # 只允许 patch 更新
}
}
# 定期运行安全审计
npm audit
# 或
pnpm audit技术局限与边界
1. 包体积
Axios 的 gzip 体积约 13.5 KB,对于追求极致性能的项目来说仍然偏大。如果只需要简单的 GET/POST 请求,原生 Fetch API 是更好的选择。
2. 无法 Tree-shaking
Axios 使用默认导出(export default axios),所有方法挂载在同一个对象上,导致无法有效 tree-shake。即使只使用 axios.get(),也会打包整个库。
3. 不支持 HTTP/2(浏览器环境)
浏览器环境下 Axios 基于 XHR 或 Fetch,HTTP 协议版本由浏览器决定,无法直接控制。在 Node.js 环境下,HTTP Adapter 基于 http/https 模块,不支持 HTTP/2(需要使用 http2 模块或第三方方案)。
4. 非标准 Fetch 特性缺失
某些 Fetch API 独有的特性(如 ReadableStream 响应体、Request/Response 对象直接操作)在 Axios 中需要通过 Adapter 或自定义转换实现。
5. 维护者风险
2026 年 3 月的供应链攻击事件暴露了 Axios 高度依赖单一维护者的风险。维护团队规模较小,npm 发布权限集中,这对大型项目的安全性构成隐患。
6. React Server Components 兼容性
在 Next.js App Router 的 Server Components 中,Axios 不被推荐作为数据获取工具。RSC 环境下推荐使用原生 Fetch API,因为 Fetch 请求可以被 React 自动缓存和去重。
7. 取消请求的局限性
传统的 CancelToken 已被标记为废弃,推荐使用 AbortController。但在某些旧版浏览器环境中,AbortController 的兼容性仍需考虑。
8. 错误类型不统一
Axios 的错误对象结构在不同场景(网络错误、超时、HTTP 状态码错误、取消请求)下格式不一致,需要额外判断处理。
学习资源
官方文档
教程与文章
-
Axios vs Fetch API: The Definitive Guide (2025) - OpenReplay
-
Axios vs Fetch vs ky: HTTP Client Comparison 2026 - Reintech
-
Axios vs Fetch — What I Use and What I Regret - JavaScript Plain English
视频教程
安全相关
- Axios npm Supply Chain Attack Post Mortem - GitHub Issue #10636
- Axios Versions, CVEs, and Safe Upgrade Path (April 2026) - HeroDevs
- Mitigating the Axios npm Supply Chain Compromise - Microsoft
- Supply Chain Compromise of axios - Huntress
- North Korea-Nexus Threat Actor Compromises Axios - Google Cloud
- Axios Supply Chain Attack Threat Brief - Palo Alto Unit 42
社区讨论
2026 年现状
版本状态
截至 2026 年 7 月,Axios 的最新稳定版本为 v1.18.1(2026 年 6 月 21 日发布)。v1.x 系列是当前的主要维护线,v0.x 系列仅做安全补丁维护。
2025-2026 版本演进时间线
| 时间 | 版本 | 关键变更 |
|---|---|---|
| 2025.02 | v1.8.0 | 新增 ignoreAbsoluteURLs 配置,规范 FormData/Blob 支持 |
| 2025.04 | v1.9.0 | Axios 构造函数 config 参数改为可选,修复 Fetch content-length 计算 |
| 2025.06 | v1.10.0 | fetchOptions 透传至 Fetch 函数,FormData 布尔值转字符串 |
| 2025.07 | v1.11.0 | 🔒 修复 CVE-2025-58754(data: URI 内存耗尽 DoS) |
| 2026.03 | — | ⚠️ 供应链攻击事件:v1.14.1 和 v0.30.4 被植入恶意代码 |
| 2026.04 | v1.15.x | 供应链攻击后安全修复版本 |
| 2026.05 | v1.16.x | 原型污染防护、HTTPS 数据泄漏修复 |
| 2026.06 | v1.17.0 | 新增 zstd 解压缩支持、配置原型污染防护 |
| 2026.06 | v1.18.0 | 跨域重定向敏感头剥离、畸形 URL 拒绝 |
| 2026.06 | v1.18.1 | 修复 AxiosError 循环 JSON 序列化、Node HTTP Adapter 代理修复 |
维护状态与社区
- GitHub Stars:约 108,600+,仍然是 GitHub 上 Stars 最多的 JavaScript HTTP 客户端
- npm 周下载量:超过 1 亿次,是最受欢迎的 npm 包之一
- 维护团队:以 Jason Saayman 为核心的小型团队,供应链攻击事件后社区对维护者集中度的关注增加
- 活跃 Issue:GitHub 上仍有大量 open issues,社区活跃度保持较高水平
供应链攻击的影响
2026 年 3 月的供应链攻击事件是 Axios 历史上最严重的安全事件。攻击者通过社交工程获取维护者 npm 账号权限,发布了携带 RAT 木马的恶意版本。该事件导致了以下影响:
- 信任危机:部分开发者和项目开始考虑迁移到 Fetch API 或其他替代方案
- 安全加固:Axios 团队采用了 staged publishing(分阶段发布)机制,加强了 npm 账号安全
- 生态警醒:推动了 npm 生态系统对维护者账号安全、2FA 强制启用的讨论
未来展望
- Fetch Adapter 成熟化:Axios 持续完善 Fetch Adapter,逐步统一浏览器和 Node.js 环境的底层实现
- 安全强化:经历供应链攻击后,安全机制持续加强(敏感头保护、原型污染防护、URL 校验等)
- TypeScript 改进:类型定义持续优化,泛型支持更加完善
- Node.js 新版本适配:持续适配 Node.js 新版本(已支持 Node.js 26 测试矩阵)
- 竞争压力:原生 Fetch API 的普及对 Axios 形成持续压力,特别是在新项目和 Next.js/RSC 场景中
总结建议
| 场景 | 建议 |
|---|---|
| 已有 Axios 依赖的项目 | 升级到 v1.18.1+,启用 lock 文件,定期审计 |
| 新项目(非 RSC) | 可考虑 Fetch API 或 ky,减少依赖;如需拦截器等高级功能,Axios 仍是可靠选择 |
| Next.js App Router / RSC | 优先使用原生 Fetch API |
| Node.js 微服务 | 考虑 Got(HTTP/2 支持)或原生 Fetch API |
| 对包大小敏感的场景 | 选择 ky(~2 KB gzip)或原生 Fetch API(0 KB) |
文档更新时间:2026 年 7 月 7 日
基于 Axios v1.18.1
数据来源:GitHub、npm、HeroDevs、Microsoft Security Blog、Axios 官方文档