# Ky 最佳实践

URL: https://caijiao.org/ky/best-practices
Source: docs/ky/best-practices.md
Description: 总结使用 Ky 的最佳实践，包括实例化、统一配置、错误处理、请求复用等。

为了在项目中高效、稳定地使用 [Ky](/ky/)，以下是一些推荐的最佳实践。

## 1. 创建统一实例

- 使用 `ky.create()` 创建全局或模块实例，统一管理前缀 URL、请求头、超时和重试策略。  

```javascript
import ky from 'ky';

export const api = ky.create({
  prefixUrl: 'https://api.example.com',
  headers: { 'Authorization': 'Bearer TOKEN' },
  timeout: 5000,
  retry: 2
});
````

## 2. 使用 Hooks 统一拦截请求与响应

- 统一处理请求日志、错误处理、响应格式化。

```javascript
api.hooks.beforeRequest.push(request => {
  console.log('请求开始:', request.url);
});

api.hooks.afterResponse.push((request, options, response) => {
  if (!response.ok) console.warn('请求失败:', response.status);
});
```

## 3. 错误分类处理

- 区分 HTTPError、TimeoutError、AbortError，针对不同类型采取不同处理策略。

```javascript
try {
  await api.get('data').json();
} catch (error) {
  if (error.name === 'HTTPError') { /* 处理 HTTP 错误 */ }
  else if (error.name === 'TimeoutError') { /* 处理超时 */ }
  else if (error.name === 'AbortError') { /* 处理取消请求 */ }
}
```

## 4. 统一响应格式解析

- 对返回数据结构一致的 API，可在 `afterResponse` 中统一解析 JSON 或处理状态码，减少重复代码。

## 5. 避免重复请求

- 对于同一接口的频繁请求，可结合缓存或节流策略，避免不必要的网络请求。

## 6. 使用 TypeScript 类型

- 对请求和响应数据使用类型定义，提高代码可维护性和可读性。

```typescript
interface User {
  id: number;
  name: string;
}

const users: User[] = await api.get('users').json();
```

## 小结

- 使用实例统一配置，减少重复代码。
- Hooks 提供灵活拦截和处理能力。
- 分类处理错误，提高稳定性。
- 配合 TypeScript、缓存和统一解析，可构建高质量的请求层。
