Skip to content

序言:为什么要手写 Axios

本书目标

完成这本书后,你将:

  1. 亲手实现一个功能完备的 HTTP 客户端库
  2. 深入理解 Axios 的设计原理和实现细节
  3. 掌握适配器模式、拦截器链等设计模式
  4. 获得"手写 Axios"面试题的完整答案
  5. 具备阅读和理解开源项目源码的能力

从"会用"到"会造"

你可能已经用 Axios 发送过成千上万个请求了:

javascript
const response = await axios.get('/api/users');
const data = response.data;

简单、优雅、符合直觉。但我想问你一个问题:

如果没有 Axios,你能自己写一个吗?

这个问题背后,隐藏着"会用"和"会造"之间的巨大鸿沟。会用 Axios 的开发者有千千万万,但能亲手实现一个的,却寥寥无几。

这本书的目标很简单:带你亲手写一个 Mini-Axios

为什么要手写

面试的硬通货

"手写 Axios"是前端面试的高频考点。面试官想考察的不是你能不能背出 API,而是:

  • 你理解 HTTP 请求的底层原理吗?
  • 你能设计一个可扩展的架构吗?
  • 你熟悉 Promise 和异步编程吗?
  • 你知道适配器模式、拦截器链这些设计模式吗?

完成这本书的学习后,这些问题你都能从容应对。

工程能力的跃升

手写一个库,和使用一个库,锻炼的是完全不同的能力:

  • 架构设计:如何组织代码?模块间如何解耦?
  • 边界处理:参数校验、错误处理、兼容性适配
  • API 设计:如何让接口既强大又易用?
  • 工程化:TypeScript 类型、测试、构建、发布

这些能力,只有在"造轮子"的过程中才能真正掌握。

调试排错的底气

当你遇到 Axios 的 bug 或奇怪行为时,你是只能 Google 搜索,还是能直接看源码定位问题?

理解了实现原理,你就有了调试的底气。

这本书怎么教

渐进式实现

我们不会一上来就展示完整代码,而是采用渐进式的方式:

  1. 从最简单的能跑的代码开始
  2. 发现问题,提出需求
  3. 逐步增强,解决问题
  4. 循环迭代,逼近完整方案

每一步都有明确的目标,每一行代码都有存在的理由。

先原理,后代码

对于每个功能模块,我们遵循这样的节奏:

  1. 为什么:这个功能解决什么问题?
  2. 怎么设计:有哪些方案?为什么选择这个?
  3. 怎么实现:具体代码怎么写?
  4. 怎么验证:如何测试它是否正确?

对标官方 Axios

我们实现的 Mini-Axios 会尽量对标官方 Axios 的 API 和行为。这样你学到的知识可以直接迁移,理解官方源码也会更加顺畅。

你将实现什么

完成这本书后,你将拥有一个功能完备的 HTTP 客户端库:

核心功能

  • 支持 GET、POST、PUT、DELETE 等请求方法
  • 支持请求/响应拦截器
  • 支持请求取消
  • 支持超时控制

数据处理

  • 自动序列化请求数据
  • 自动解析 JSON 响应
  • 支持 FormData 和文件上传

工程特性

  • 浏览器和 Node.js 双端支持
  • 完整的 TypeScript 类型
  • 可测试、可扩展

适合读者

这本书适合以下读者:

读者类型收获
准备面试的前端开发者掌握"手写 Axios"这道高频面试题
想提升架构能力的工程师学习如何设计可扩展的库
对源码感兴趣的学习者建立阅读开源项目的信心
TypeScript 进阶者实践复杂类型系统的设计

你将学到的核心知识

章节核心知识点
核心架构Axios 类设计、双重身份(函数+对象)
配置系统配置合并策略、优先级规则
适配器适配器模式、XHR/Fetch/HTTP 适配器
拦截器拦截器链、Promise 链式调用
数据处理请求/响应转换器
URL 处理参数序列化、编码规则
取消机制CancelToken、AbortController
错误处理AxiosError、统一错误策略
TypeScript泛型响应、类型定义设计
测试发布单元测试、集成测试、npm 发布

前置要求

你需要具备

  • 熟悉 ES6+ 语法,特别是 Promise 和 async/await
  • 了解 HTTP 协议的基本概念(请求方法、状态码、请求头)
  • 有使用 Axios 或类似库的经验

你不需要

  • 精通某个前端框架
  • 有阅读源码的经验
  • 了解 Node.js 底层

如何学习

最重要的建议:一定要动手写!

学习方法
├── 跟着敲代码
│   └── 不要复制粘贴,理解每一行
├── 运行测试验证
│   └── 每完成一个功能就验证
├── 先思考再看答案
│   └── 遇到问题先自己想
└── 扩展练习
    └── 完成后尝试添加新功能

准备好了吗?让我们从第一个请求开始!

序言:为什么要手写 Axios has loaded