当前位置: 首页 > article >正文

别再复制粘贴了!手把手教你用TypeScript封装一个企业级axios请求库(附完整源码)

从零构建高可维护的TypeScript请求库axios企业级封装实战每次在Vue3项目中新建一个页面你是否习惯性打开旧项目复制粘贴网络请求代码当接口字段变更时是否需要在十几个文件中逐个修改错误处理逻辑这种重复劳动不仅降低开发效率更会成为项目维护的噩梦。本文将带你从工程化角度用TypeScript打造一个开箱即用、易于扩展的axios请求库彻底告别碎片化的请求代码。1. 为什么需要封装axios前端项目中网络请求就像空气一样无处不在。但直接使用原生axios会导致以下问题代码重复每个请求都需要重复编写错误处理、loading状态管理类型缺失响应数据没有类型约束后期维护如同盲人摸象难以维护拦截器逻辑分散在各处修改时需全局搜索替换扩展困难新需求如缓存、重试等特性无法统一实现我们的封装目标是通过面向对象设计实现以下特性// 理想中的调用方式 const user await http.getUser(/api/user, { cache: true // 自动缓存控制 })2. 基础架构设计2.1 类型系统先行优秀的TS封装始于严谨的类型定义。我们先规划核心类型// 基础响应结构 interface ApiResponseT unknown { code: number data: T message?: string } // 扩展的请求配置 interface RequestConfig extends AxiosRequestConfig { showLoading?: boolean retryCount?: number } // 错误处理类型 class RequestError extends Error { code?: number isNetworkError?: boolean }2.2 类结构设计采用工厂模式创建请求实例便于后续多实例管理class RequestClient { private instance: AxiosInstance private interceptors: RequestInterceptors constructor(config: RequestConfig) { this.instance axios.create(config) this.setupInterceptors() } private setupInterceptors() { // 拦截器实现 } public getT(url: string, config?: RequestConfig): PromiseT { // 方法实现 } // 其他HTTP方法... }3. 拦截器深度优化3.1 请求拦截器实战现代前端应用通常需要处理以下请求逻辑this.instance.interceptors.request.use(config { // 1. 认证处理 const token auth.getToken() if (token) { config.headers.Authorization Bearer ${token} } // 2. 全局loading控制 if (config.showLoading ! false) { store.dispatch(showLoading) } // 3. 特殊header处理 if (config.url?.includes(/upload)) { config.headers[Content-Type] multipart/form-data } return config })3.2 响应拦截器最佳实践响应处理需要兼顾业务约定和异常情况this.instance.interceptors.response.use( response { // 1. 关闭loading store.dispatch(hideLoading) // 2. 处理二进制响应 if (response.config.responseType blob) { return response.data } // 3. 业务状态码处理 const { code, data, message } response.data if (code 200) return data return Promise.reject( new RequestError(message || 业务错误, { code }) ) }, error { // 统一错误处理 const requestError new RequestError() if (error.response) { // HTTP状态码错误 requestError.code error.response.status requestError.message this.mapErrorCode(error.response.status) } else if (error.request) { // 网络错误 requestError.isNetworkError true requestError.message 网络连接异常 } else { // 其他错误 requestError.message error.message } return Promise.reject(requestError) } )4. 高级功能扩展4.1 请求重试机制对于不稳定的网络环境自动重试能显著提升用户体验private async requestWithRetryT( method: HttpMethod, url: string, config?: RequestConfig ): PromiseT { let retryCount config?.retryCount || 0 while (retryCount 0) { try { return await this.request(method, url, config) } catch (error) { if (!this.shouldRetry(error) || retryCount 0) { throw error } retryCount-- await new Promise(resolve setTimeout(resolve, this.getRetryDelay(retryCount)) ) } } throw new RequestError(请求失败) }4.2 缓存控制实现合理利用缓存可以减轻服务器压力private cache new Mapstring, { expire: number data: any }() public async getT( url: string, config?: RequestConfig { cacheTTL?: number } ): PromiseT { const cacheKey this.generateCacheKey(url, config) if (config?.cacheTTL) { const cached this.cache.get(cacheKey) if (cached cached.expire Date.now()) { return cached.data } } const data await this.request(get, url, config) if (config?.cacheTTL) { this.cache.set(cacheKey, { data, expire: Date.now() config.cacheTTL * 1000 }) } return data }5. 项目集成实践5.1 Vue3组合式API封装在组合式函数中提供更优雅的调用方式// src/composables/useHttp.ts export default function useHttp() { const http new RequestClient({ baseURL: import.meta.env.VITE_API_URL }) const get async T(url: string, config?: RequestConfig) { try { return await http.getT(url, config) } catch (error) { // 统一UI错误处理 showToast(error.message) throw error } } return { get } }5.2 环境变量管理通过环境变量支持多环境配置# .env.development VITE_API_URLhttps://dev.api.example.com VITE_API_TIMEOUT5000 # .env.production VITE_API_URLhttps://api.example.com VITE_API_TIMEOUT10000const http new RequestClient({ baseURL: import.meta.env.VITE_API_URL, timeout: Number(import.meta.env.VITE_API_TIMEOUT) })6. 测试与调试技巧6.1 单元测试策略使用jest编写健壮的测试用例describe(RequestClient, () { let http: RequestClient beforeEach(() { http new RequestClient({ baseURL: https://api.example.com }) jest.clearAllMocks() }) test(should add auth header when token exists, async () { localStorage.setItem(token, test-token) const spy jest.spyOn(axios, create) new RequestClient({}) expect(spy.mock.calls[0][0].headers.Authorization) .toBe(Bearer test-token) }) })6.2 调试拦截器在Chrome开发者工具中可以通过以下方式调试在拦截器代码处打上断点使用axios的请求/响应日志功能通过performance标记观察请求时间线// 在请求拦截器中添加性能标记 window.performance.mark(request_start)7. 性能优化与安全7.1 取消重复请求防止快速点击导致的重复提交private pendingRequests new Mapstring, AbortController() private addPendingRequest(config: RequestConfig) { const key this.generateRequestKey(config) if (this.pendingRequests.has(key)) { this.pendingRequests.get(key)?.abort() } const controller new AbortController() config.signal controller.signal this.pendingRequests.set(key, controller) }7.2 CSRF防护自动处理CSRF token// 在请求拦截器中 const csrfToken getCookie(csrfToken) if (csrfToken [post, put, delete].includes(config.method!)) { config.headers[X-CSRF-Token] csrfToken }8. 项目目录结构建议规范的目录结构有助于长期维护src/ libs/ http/ index.ts # 主入口 types.ts # 类型定义 interceptors/ # 拦截器实现 auth.ts error.ts loading.ts plugins/ # 扩展功能 cache.ts retry.ts utils/ # 工具函数 helper.ts test/ http/ http.test.ts9. 未来扩展方向当基础请求库稳定后可以考虑集成GraphQL客户端支持添加WebSocket连接管理实现请求优先级队列开发可视化请求监控面板interface AdvancedConfig { priority?: low | normal | high analytics?: boolean }在大型项目中我们进一步将请求库与状态管理结合实现了请求自动缓存到Vuex的功能。当组件卸载时自动取消pending请求显著降低了内存泄漏风险。经过三个版本的迭代现在这个请求库已经支撑了公司所有前端项目平均为每个新项目节省了40%的网络请求相关代码量。

相关文章:

别再复制粘贴了!手把手教你用TypeScript封装一个企业级axios请求库(附完整源码)

从零构建高可维护的TypeScript请求库:axios企业级封装实战 每次在Vue3项目中新建一个页面,你是否习惯性打开旧项目复制粘贴网络请求代码?当接口字段变更时,是否需要在十几个文件中逐个修改错误处理逻辑?这种重复劳动不…...

如何用开源智能工具一键提升你的英雄联盟游戏体验

如何用开源智能工具一键提升你的英雄联盟游戏体验 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 想要在英雄联盟中更高效地获取信息、减少重复…...

Rust crate 构建与依赖管理

Rust作为一门现代系统编程语言,凭借其出色的性能与安全性吸引了大量开发者。而Rust的模块化设计核心——crate(代码库)的构建与依赖管理,则是每个Rust开发者必须掌握的关键技能。无论是构建小型工具还是大型项目,高效的…...

clickhouse可以表关联吗

ClickHouse 完全支持表关联(JOIN),但语法和性能特性与传统数据库有所不同。ClickHouse JOIN 类型表格JOIN 类型语法说明INNER JOINSELECT ... FROM a INNER JOIN b ON a.id b.id标准内连接LEFT JOINSELECT ... FROM a LEFT JOIN b ON a.id …...

Halcon实战:用area_center算子快速搞定图像区域面积与中心点计算(附完整代码)

Halcon实战:用area_center算子快速搞定图像区域面积与中心点计算(附完整代码) 在工业质检、医疗影像或自动化测量领域,图像区域的面积与中心点坐标是最基础却至关重要的特征参数。想象一下这样的场景:生产线上需要统计…...

Windows平台微信/QQ/TIM防撤回补丁完整使用指南:如何实现消息保护与多开功能

Windows平台微信/QQ/TIM防撤回补丁完整使用指南:如何实现消息保护与多开功能 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目地址…...

HDLbits实战解析:从状态机基础到One-Hot编码进阶

1. 状态机基础与HDLbits实战入门 第一次接触状态机时,我也被那些抽象的状态转换图绕得头晕。直到在HDLbits上刷完Fsm3这道题,才真正理解状态机就像自动售货机的工作逻辑 - 投币、选择、出货,每个动作都对应明确的状态跳转。HDLbits平台最棒的…...

嵌入式开发工具

嵌入式开发工具:赋能智能硬件的核心技术引擎 在万物互联的时代,嵌入式系统已成为智能设备的核心大脑,而开发工具则是构建这一大脑的"手术刀"。从智能家居到工业自动化,嵌入式开发工具通过高效的代码编写、调试和优化&a…...

第9章 函数-9.4 函数参数的传递

在Python中,根据实参的数据类型,可以将函数参数的传递模式分为2种,一是值传递,其包括整数、浮点数、字符串和元组;二是引用传递,其包括列表、字典、集合和对象。值传递和引用传递的区别是,函数参…...

3分钟快速上手Aider:终极AI结对编程助手完全指南

3分钟快速上手Aider:终极AI结对编程助手完全指南 【免费下载链接】aider aider is AI pair programming in your terminal 项目地址: https://gitcode.com/GitHub_Trending/ai/aider 你是否渴望在终端中拥有一个能理解你代码库的AI编程伙伴?Aider…...

BilibiliDown视频下载器终极完整指南:5分钟从新手到高手

BilibiliDown视频下载器终极完整指南:5分钟从新手到高手 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors…...

万字干货 | OpenClaw 进阶玩法大全:技能 / 多 Agent / 省钱 / 安全,+ 实战技巧一次学会图

1.概述在人工智能快速发展的今天,AI不再仅仅是回答问题的聊天机器人,而是正在演变为能够主动完成复杂任务的智能代理。OpenAI的Codex CLI就是这一趋势的典型代表——一个跨平台的本地软件代理,能够在用户的机器上安全高效地生成高质量的软件变…...

Docker Swarm 搞定高可用集群,生产环境再也不怕服务挂掉了

Docker Swarm是什么? Docker Swarm 是 Docker 官方推出的容器集群管理工具,基于 Go 语言实现。代码开源在:https://github.com/docker/swarm 使用它可以将多个 Docker 主机封装为单个大型的虚拟 Docker 主机,快速打造一套容器云平…...

如何5分钟搞定抖音批量下载:douyin-downloader完整使用指南

如何5分钟搞定抖音批量下载:douyin-downloader完整使用指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback …...

如何实现零训练深度换脸:roop-unleashed终极指南

如何实现零训练深度换脸:roop-unleashed终极指南 【免费下载链接】roop-unleashed Evolved Fork of roop with Web Server and lots of additions 项目地址: https://gitcode.com/gh_mirrors/ro/roop-unleashed 在当今数字内容创作爆炸的时代,视频…...

OneMore插件终极指南:3步解锁OneNote隐藏的160+效率神器

OneMore插件终极指南:3步解锁OneNote隐藏的160效率神器 【免费下载链接】OneMore A OneNote add-in with simple, yet powerful and useful features 项目地址: https://gitcode.com/gh_mirrors/on/OneMore 还在为OneNote功能单一而烦恼?OneMore插…...

04 前端 Web 开发 HTML5 + CSS3 + 移动 web 视频教程,前端web入门首选黑马程序员

04 前端 Web 开发 HTML5 CSS3 移动 web 视频教程,前端web入门首选黑马程序员 一、参考资料 【前端Web开发HTML5CSS3移动web视频教程,前端web入门首选黑马程序员】 https://www.bilibili.com/video/BV1kM4y127Li/?p44&share_sourcecopy_web&vd…...

Markdown Viewer:浏览器中的终极Markdown渲染神器,让你告别单调预览

Markdown Viewer:浏览器中的终极Markdown渲染神器,让你告别单调预览 【免费下载链接】markdown-viewer Markdown Viewer / Browser Extension 项目地址: https://gitcode.com/gh_mirrors/ma/markdown-viewer 还在为Markdown文件的预览效果发愁吗&…...

如何用5分钟彻底解决BT下载速度慢的问题?终极Tracker列表指南

如何用5分钟彻底解决BT下载速度慢的问题?终极Tracker列表指南 【免费下载链接】trackerslist Updated list of public BitTorrent trackers 项目地址: https://gitcode.com/GitHub_Trending/tr/trackerslist 还在为BT下载速度慢如蜗牛而烦恼吗?每…...

SEATA分布式事务——AT模式云

简介 AI Agent 不仅仅是一个能聊天的机器人(如普通的 ChatGPT),而是一个能够感知环境、进行推理、自主决策并调用工具来完成特定任务的智能系统,更够完成更为复杂的AI场景需求。 AI Agent 功能 根据查阅的资料,agent的…...

从数据采集到回放验证:ADTF 适配 ROS 的 ADAS 测试实践胃

一、简化查询 1. 先看一下查询的例子 /// /// 账户获取服务 /// /// /// public class AccountGetService(AccountTable table, IShadowBuilder builder) { private readonly SqlSource _source new(builder.DataSource); private readonly IParamQuery_accountQuery b…...

Java中ThreadPoolExecutor 深度剖析

ThreadPoolExecutor 深度剖析(基于Java 21) 这是 JUC 中最核心、最复杂的并发组件之一。以下按维度逐一展开,辅以源码与图示。一、底层实现原理 1.1 核心控制字段:ctl ThreadPoolExecutor 用一个 AtomicInteger 类型的 ctl 字段同…...

OpenCV实战:SimpleBlobDetector参数调优全攻略(附完整代码)

OpenCV实战:SimpleBlobDetector参数调优全攻略(附完整代码) 在工业视觉检测和医学图像分析领域,斑点检测是一项基础但至关重要的任务。想象一下这样的场景:生产线上的零件表面缺陷检测、显微镜下的细胞计数、PCB板焊点…...

旧安卓手机别扔!手把手教你搭建个人隐私安全检测环境(Kali+Metasploit实战)

旧安卓设备重生计划:构建家庭隐私安全实验室的5个关键步骤 那部抽屉里积灰的旧安卓手机,或许是你提升数字安全意识的最佳教具。当科技媒体不断报道数据泄露事件时,大多数人依然对手机应用的权限滥用缺乏直观认知。本文将带你用退役设备搭建一…...

KDE桌面Mac化实战:从Launchpad到全局菜单的完整改造指南

1. 为什么要把KDE桌面改造成macOS风格? 作为一个长期使用Linux的老用户,我完全理解大家对macOS那种简洁优雅界面的向往。但说实话,macOS的封闭性总是让人感觉束手束脚。直到有一天我发现,原来用KDE Plasma可以完美复刻macOS的视觉…...

从Bulk CMOS到先进工艺:Sentaurus TCAD中几何结构与掺杂如何‘捏’出你的Ion和Ioff

从Bulk CMOS到先进工艺:Sentaurus TCAD中几何结构与掺杂如何‘捏’出你的Ion和Ioff 在半导体器件设计中,Ion(导通电流)和Ioff(关断电流)是衡量器件性能的两个关键指标。就像雕塑家通过调整黏土的形状和质地…...

探秘Text2Vec:智能文本处理的新利器

探秘Text2Vec:智能文本处理的新利器 【免费下载链接】text2vec Fast vectorization, topic modeling, distances and GloVe word embeddings in R. 项目地址: https://gitcode.com/gh_mirrors/tex/text2vec Text2Vec是一款强大的R语言文本处理工具包&#xf…...

AgentCPM-Report实战案例:Pixel Epic在跨境数据合规白皮书撰写中的应用

AgentCPM-Report实战案例:Pixel Epic在跨境数据合规白皮书撰写中的应用 1. 引言:当数据合规遇上像素冒险 跨境数据合规是当前企业出海面临的重要挑战之一。传统白皮书撰写需要耗费大量时间收集法规、分析案例、整理框架,而Pixel Epic这款基…...

STM32步进电机4轴控制源码(相对/绝对/回原点/梯形加减速运动控制 F103 F405版本)

STM32步进电机4轴控制源码,相对,绝对,回原点,梯形加减 STM32步进电机4轴控制源码,相对,绝对,回原点,梯形加减速,运动控制,两份源码,F103&#xff…...

嵌入式语音交互实战:基于树莓派4B与SYN6288的智能语音播报系统设计

1. 智能语音播报系统入门指南 想象一下,当你走进电梯时听到"请注意安全"的语音提示,或者在健身房跑步机上听到"当前速度5公里/小时"的播报,这些场景背后都离不开智能语音播报技术。今天我要分享的,是如何用树…...