fetch 如何进行二次封装?常见用法和技巧有哪些?

深入解析fetch二次封装:技巧与实践指南

为什么需要二次封装fetch?

现代Web开发中,原生fetch API虽然功能强大,但缺少超时控制、错误重试、拦截器等企业级功能。通过二次封装,开发者可以统一处理以下场景:
自动添加鉴权头信息
全局错误处理机制
请求响应日志追踪
接口性能监控埋点
多环境域名切换

典型案例:高并发场景下的锁竞争优化

参考内核bio.c中的bcache锁设计,当处理大量并行请求时,合理的缓存策略能显著降低acquire()调用次数。在fetch封装层实现请求队列管理,可避免资源竞争导致的性能瓶颈。

核心封装技巧

1. 增强型错误处理

原生fetch只在网络故障时reject,需扩展业务错误识别:
```javascript
const enhancedFetch = async (url, options) => {
const response = await fetch(url, options);
if (!response.ok) {
const error = new Error(`HTTP ${response.status}`);
error.response = response;
throw error;
}
return response.json();
};
```

2. 超时中断机制

AbortController实现请求取消:
```javascript
const timeout = (ms) => {
const controller = new AbortController();
setTimeout(() => controller.abort(), ms);
return controller;
};

const fetchWithTimeout = (url, options, timeoutMs = 5000) => {
return fetch(url, {...options, signal: timeout(timeoutMs).signal});
};
```

3. 智能重试策略

针对特定状态码自动重试:
```javascript
const retryFetch = async (url, options, retries = 3) => {
try {
return await fetch(url, options);
} catch (err) {
if (retries > 0 && shouldRetry(err)) {
await new Promise(r => setTimeout(r, 1000));
return retryFetch(url, options, retries 1);
}
throw err;
}
};
```

高级用法实践

1. 请求拦截器栈

实现类似axios的拦截器机制:
```javascript
class FetchWrapper {
constructor() {
this.interceptors = {
request: [],
response: []
};
}

use(interceptor) {
this.interceptors[interceptor.type].push(interceptor.handler);
}
}
```

2. 缓存策略优化

参考bcache的锁机制设计:
使用LRU算法控制缓存大小
通过版本号管理缓存失效
区分GET/POST缓存策略

3. 性能监控集成

```javascript
const perfFetch = async (url, options) => {
const start = performance.now();
try {
const res = await fetch(url, options);
reportMetrics({
url,
duration: performance.now() start,
status: 'success'
});
return res;
} catch (err) {
reportMetrics({
url,
duration: performance.now() start,
status: 'failed'
});
throw err;
}
};
```

生产环境最佳实践

1. 统一错误编码体系:建立5xx/4xx错误到业务错误的映射关系
2. 熔断机制实现:当错误率超过阈值时自动切换备用接口
3. 请求优先级调度:区分关键请求与普通请求的优先级
4. 浏览器兼容处理:通过polyfill支持旧版浏览器

通过合理的二次封装,可使网络请求模块的错误率降低40%以上,同时提升开发效率。完整的封装方案已在[技术知识库](https://xcn2d971vuw4.feishu.cn/wiki/RaC2w1iiFijAa1kVJUjcp3agn8e)同步更新,包含可复用的生产级代码模板。