Vue-vben-admin Vue3+TS Axios的封装源码分析

Vue-vben-admin Vue3+TS Axios的封装源码分析

前言

一、近期再用Vue3+TS 重构之前Vue2的项目,因此想着借鉴一下业界较为优秀的代码,在Git上面找了好久,经过同事推荐,我发现由anncwd出品的Vue-vben-admin是很不错的,截止目前在git上面已经有5.9k个star了,目前将这个模板看完了,我觉得里面写的最好的莫过于对于Axios的封装了,在此我简单对这个源码进行一个分析,里面也涉及一些TS+Vue3的知识点,最重要的是,能够发现其中写的特别优秀的地方,我们也可以运用在自己的项目当中。

1.我们先来看一下源码中的目录结构吧

在这里插入图片描述
2.目录分析,这个文件夹当中分为6个文件,其中index.ts是入口文件,Axios是主要的对于axios二次封装的类,axiosCancel是对于取消请求类canceler的封装,axiosTransform.ts是定义了一个类,涵盖所有对于数据处理无论错误还是失败的钩子函数,checkStatus.ts是对于后端返回code非200时的处理函数,helper是一个处理时间的函数,这6个文件相辅相成,构建了一个强大的axios的二次封装,接下来我们就来看一看其中每个文件的源码吧

二、index.ts

1.在看index.ts的源码之前我必须先带着大家补充几个知识点,以免其中有几个地方比较卡顿

(1)ts中的Partial<T>类,实际上在ts当中为我们提供了这样的一个类,Partial
它可以将接受一个T泛型,可以将T中的所有属性变为可选的,换句话说,任意类型的机构,经过Partial处理后,所有的内部属性就变为可选的了。

 interface A {
   
   
   a:string
   b:number
 }
 const a:A = {
   
      //  error 因为A类型必须具备两个属性
   a:'张三'
 }
 
 const b:Partial<A> = {
   
     // successful  经过Partial处理后,所有属性值变为可选
   a:'张三'
 }
 //看一下他的源码
 type Partial<T> = {
   
   
    [P in keyof T]?: T[P];
 };

 //其实就是给每一个属性加了一个?操作符而已,将所有属性变为非必须的了而已

(2)encodeURIComponent

//这个是JavaScript的原生Api ,可以把字符串作为 URI 组件进行编码。字母数字保持原来的样子,当时汉字或者其他所有符号都会将其编码为数字,字母或者%,

var uri="http://w3cschool.cc/my test.php?name=ståle&car=saab";
encodeURIComponent(uri)

// 输出:https%3A%2F%2Fsiteproxy.ruqli.workers.dev%3A443%2Fhttp%2Fw3cschool.cc%2Fmy%20test.php%3Fname%3Dst%C3%A5le%26car%3Dsaab

有了上面的补充,接下来就直接来看一下代码吧,我都做了注释,但是下面的代码会依赖一些类型或者函数,大家先过一下,我们主要看一下结构,开始吧

import {
   
    AxiosTransform } from './axiosTransform'
import {
   
    AxiosResponse, AxiosRequestConfig } from 'axios'
import {
   
    Result, RequestOptions, CreateAxiosOptions } from './types'
import {
   
    errorResult } from './const'
import {
   
    ResultEnum, RequestEnum, ContentTypeEnum,} from '../../../enums/httpEnum'
import {
   
    useMessage } from '@/hooks/web/useMessage'
import {
   
    isString, isObject, isBlob } from '@/utils/is'
import {
   
    formatRequestDate } from './helper'
import {
   
    setObjToUrlParams, deepMerge } from '@/utils'
import {
   
    getToken } from '@/utils/auth'
import {
   
    checkStatus } from './checkStatus'
import VAxios from './Axios'
const {
   
    createMessage, createErrorModal } = useMessage()
/**
 * 请求处理
 */
const transform: AxiosTransform = {
   
      // 所谓transform 本质上就是  transform  这个对象中拥有 多个处理数据的钩子
  /**
   * 请求成功处理
   * 但依然要根据后端返回code码进行判断
   */
  transformRequestData: (  //  对后端返回的数据做处理, 这是在http状态码为200的时候
    res: AxiosResponse<Result>,
    options: RequestOptions
  ) => {
   
   
    const {
   
    isTransformRequestResult } = options
    if (!isTransformRequestResult) return res.data  // 不处理 直接返回res.data
    const {
   
    data } = res
    if (!data) return errorResult // 错误处理
    const {
   
    code, msg: message } = data
    if (code === ResultEnum.UNLOGIN) {
   
   
      const msg = '请重新登陆!'
      createMessage.error(msg)
      Promise.reject(new Error(msg))
      location.replace('/login')
      return errorResult
    }
    if (code === ResultEnum.BACKERROR) {
   
   
      const msg = '操作失败,系统异常!'
      createMessage.error(msg)
      Promise.reject(new Error(msg))
      return errorResult
    }

    const hasSuccess =
      data && Reflect.has(data, 'code') && code === ResultEnum.SUCCESS  // 200
    if (!hasSuccess) {
   
     // 非200 非 401 非500 的情况 直接返回后端提示的错误
      if (message) {
   
   
        if (options.errorMessageMode === 'modal') {
   
   
          createErrorModal({
   
    title: '错误提示', content: message })
        } else {
   
   
          createMessage.error(message)
        }
      }
      Promise.reject(new Error(message))
      return errorResult
    }

    if (code === ResultEnum.SUCCESS) return data  // 200 返回data

    if (code === ResultEnum.TIMEOUT) 
### 关于 Vue-Vben-Admin 后端集成方案及推荐技术栈 #### 推荐的技术栈组合 对于 `vue-vben-admin` 这样的现代前端框架而言,后端的选择至关重要。考虑到项目的规模和技术发展方向,以下是几种适合搭配使用的后端技术和架构模式: 1. **Node.js + Express/Koa** Node.js 提供了强大的异步I/O能力,非常适合构建高性能Web应用服务器。Express 或 Koa 可作为轻量级中间件来处理HTTP请求响应逻辑[^2]。 2. **Spring Boot (Java)** 对于企业级应用场景来说,Spring Boot 是一个非常受欢迎的选择。它不仅简化了基于 Spring 框架的应用程序配置过程,还自带了许多实用的功能模块和支持服务发现、负载均衡等功能的微服务体系组件[^4]。 3. **ABP Framework (.NET Core/C#)** ABP vNext 是一个多层架构应用程序框架,专为快速开发复杂业务系统而设计。其官方文档提到过与 `vue-vben-admin-abp-vnext` 的迁移案例,表明两者之间存在良好兼容性和紧密合作的可能性[^3]。 4. **Django (Python)** 如果偏好 Python 编程语言,则 Django 将会是一个不错的选择。该框架内置了大量的功能特性,如ORM映射工具、认证授权机制以及RESTful API接口生成功能等,能够极大地提高开发效率并减少重复劳动。 #### 集成方式建议 为了更好地实现前后端分离式的部署结构,在实际操作过程中需要注意以下几个方面: - 使用 RESTful API 或 GraphQL 来定义清晰的服务契约; - 前端通过 HTTP 请求的方式调用后端提供的API资源; - 利用 OAuth2.0 / JWT Token 实现安全的身份验证和权限控制; - 考虑引入缓存策略优化性能表现,比如 Redis 或者 Memcached; - 数据库层面可以选择 MySQL/MongoDB 等关系型或非关系型存储引擎依据具体需求决定。 ```javascript // 示例:使用 Axios 发起 GET 请求获取用户列表 import axios from &#39;axios&#39;; const getUsers = async () => { try { const response = await axios.get(&#39;/api/users&#39;); console.log(response.data); } catch (error) { console.error(error); } }; ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值