返回

从零打造属于自己的axios二次封装库,手把手教你如何自定义请求库

前端

定制化的axios:升级前端数据交互

引言

现代前端开发离不开与后端服务器的数据交互。axios作为一款优秀的请求库,以其易用性和强大功能受到前端开发者的青睐。然而,在实际项目开发中,我们常常需要对axios进行二次封装,以满足项目的特定需求。本文将详细介绍如何从零开始构建一个axios二次封装库,涵盖多种常见场景和高级特性。

如何构建一个axios二次封装库

1. 登录态管理

在许多项目中,我们需要在请求头中携带登录态信息,以保证请求的合法性。我们可以通过axios的拦截器功能,在请求发送之前,自动为请求头添加登录态信息。

// 登录态管理
const instance = axios.create({
  headers: {
    Authorization: `Bearer ${localStorage.getItem('token')}`
  }
});

instance.interceptors.request.use((config) => {
  if (!localStorage.getItem('token')) {
    window.location.reload();
  }
  config.headers.Authorization = `Bearer ${localStorage.getItem('token')}`;
  return config;
});

2. 错误请求重新尝试发起

网络波动或服务器故障会导致请求失败。通过axios的拦截器,我们可以在请求失败时自动重试发起请求。

// 错误请求重新尝试发起
instance.interceptors.response.use(
  (response) => response,
  (error) => {
    if (error.response.status === 500 || error.response.status === 503) {
      return instance.request(error.config);
    }
    return Promise.reject(error);
  }
);

3. loading状态管理

请求过程中显示loading组件可以告知用户请求正在进行。通过axios拦截器,我们可以在请求发送前后分别显示和隐藏loading组件。

// loading状态管理
instance.interceptors.request.use((config) => {
  // loading组件显示
  NProgress.start();
  return config;
});

instance.interceptors.response.use(
  (response) => {
    // loading组件隐藏
    NProgress.done();
    return response;
  },
  (error) => {
    // loading组件隐藏
    NProgress.done();
    return Promise.reject(error);
  }
);

4. 错误处理

请求过程中难免遇到各种错误,我们需要对错误进行统一处理,以便定位和解决问题。通过axios拦截器,我们可以在请求失败时捕获错误信息并将其上报到服务器。

// 错误处理
instance.interceptors.response.use(
  (response) => response,
  (error) => {
    console.error(error.response.data);
    return Promise.reject(error);
  }
);

5. 重复请求拦截

连续点击按钮等场景可能会发出重复请求,给服务器造成不必要的压力。通过axios拦截器,我们可以检查请求是否已经发出,已发出则直接返回上一次请求的结果。

// 重复请求拦截
const pendingRequests = new Set();

instance.interceptors.request.use((config) => {
  if (pendingRequests.has(config.url)) {
    return pendingRequests.get(config.url);
  } else {
    pendingRequests.add(config.url);
    return instance.request(config).then(
      (response) => {
        pendingRequests.delete(config.url);
        return response;
      },
      (error) => {
        pendingRequests.delete(config.url);
        return Promise.reject(error);
      }
    );
  }
});

6. 取消请求

当用户取消操作时,我们需要取消正在进行的请求。通过axios的cancelToken功能,我们可以轻松实现请求取消。

// 取消请求
const cancelTokenSource = axios.CancelToken.source();

instance.get('/api/users', {
  cancelToken: cancelTokenSource.token
}).then((response) => {
  console.log(response.data);
}, (error) => {
  if (axios.isCancel(error)) {
    console.log('请求已取消');
  } else {
    console.error(error.response.data);
  }
});

cancelTokenSource.cancel('操作已被取消');

7. 多域名支持

需要向不同域名发出请求时,我们可以通过axios的create方法创建多个实例,每个实例对应一个域名。

// 多域名支持
const instance1 = axios.create({
  baseURL: 'https://example1.com'
});

const instance2 = axios.create({
  baseURL: 'https://example2.com'
});

// 向不同域名发出请求
instance1.get('/api/users').then((response) => {
  console.log(response.data);
});

instance2.get('/api/products').then((response) => {
  console.log(response.data);
});

8. 断网情况处理

用户断网时,我们需要进行特殊处理,比如显示断网提示组件。通过axios拦截器,我们可以检查请求失败是否是由于断网造成的。

// 断网情况处理
instance.interceptors.response.use(
  (response) => response,
  (error) => {
    if (error.response === undefined) {
      // 断网
      NProgress.done();
      alert('网络连接已断开,请检查您的网络设置');
      return Promise.reject(error);
    } else {
      return Promise.reject(error);
    }
  }
);

9. 错误信息的埋点统计

对错误信息进行埋点统计可以帮助我们定位和解决问题。通过axios拦截器,我们可以将错误信息上报到服务器。

// 错误信息的埋点统计
instance.interceptors.response.use(
  (response) => response,
  (error) => {
    console.error(error.response.data);
    axios.post('/api/errors', {
      message: error.response.data.message
    });
    return Promise.reject(error);
  }
);

结论

通过对axios进行二次封装,我们可以满足各种项目需求,提升前端数据交互的效率和可靠性。本文介绍的9种常见场景和高级特性仅是二次封装的冰山一角,在实际开发中,开发者还可以根据具体需求进行更深入的探索和实践。

常见问题解答

1. 为什么需要对axios进行二次封装?

二次封装可以满足特定项目需求,增强请求的灵活性、可靠性和可定制性。

2. 二次封装的最佳实践是什么?

遵循单一职责原则,为每个特性或功能创建单独的拦截器或模块。

3. 如何测试二次封装库?

使用Jest或Mocha等测试框架编写单元测试和集成测试。

4. 二次封装库是否可以用于所有项目?

二次封装库是为特定项目定制的,其适用性取决于项目需求。

5. 如何维护二次封装库?

随着项目需求的变化,定期审查和更新二次封装库,确保其与axios库兼容且符合项目要求。