1.0.5 • Published 2 years ago

@erkelost/axios-ext v1.0.5

Weekly downloads
-
License
MIT
Repository
github
Last release
2 years ago

@iel/axios-ext

Axios 扩展辅助功能。

安装

npm i axios @iel/axios-ext -S

用法

由于 axios 内部使用闭包保护自调用 request ,所以需使用插件提供的 createAxios 方法获取 axios 实例,否则由插件扩展的功能无法在实例自调用时使用!

import { createAxios, onRequest } from '@iel/axios-ext'
import axios from 'axios'

// 可以接收 axios 配置项或实例对象
// 返回包装后的 axios 实例
// http.$axiosExt 为 AxiosExt 实例
const http = createAxios(http)

// 定义一个 AxiosExt 插件,接收默认配置项
const Plugin = (axiosExt, options) => {
  // 注册请求时的回调函数
  onRequest(() => {
    // on request hook
  })
}

// 注册该插件,默认会执行插件方法体内部函数
// 返回该实例,已注册插件不会被重复注册
http.$axiosExt.use(Plugin, {}).use(Plugin, {})

// 销毁实例,在插件销毁时处理一些任务并清理所有插件信息
http.$axiosExt.destroy()

示例

import axios from 'axios'
import { createAxiosExt, createAxios } from '@iel/axios-ext'
import AxiosExtLog from '@iel/axios-ext-log'

//============普通创建============
const http = axios.create({
  baseURL: '/api'
})

// 注册日志插件
const axiosExt = createAxiosExt(http).use(AxiosExtLog, { globalOnResponse: true })

// ✔️ 会正常打印信息
http.get('/demo/list').then((response) => {
  // do somethings
})

// ✔️ 会正常打印信息
http
  .withLog({ onRequest: true })
  .get('/demo/list')
  .then((response) => {
    // do somethings
  })

// ❌ 扩展功能不起作用
http().then((response) => {
  // do somethings
})

// ✔️ 会正常打印信息
http
  .withLog({ onRequest: true })({ method: 'get', url: '/demo/list' })
  .then((response) => {
    // do somethings
  })

//============通过插件提供方法创建============
const http2 = createAxios(http)

// 注册日志插件
http2.$axiosExt.use(AxiosExtLog, { globalOnResponse: true })

// ✔️ 会正常打印信息
http2().then((response) => {
  // do somethings
})

开发插件包

插件内部提供了对请求流阶段的辅助工具,可以通过在不同阶段对相关数据操作进而完成对应功能的实现。

示例

这里演示开发一个在请求时自动携带 token 的插件。

// auto-add-token.js
import { onRequest } from '@iel/axios-ext'

// 插件初始化时会传入 axiosExt 实例以及插件所需的配置项
export default function autoAddToken(axiosExt, opts = {}) {
  // 在请求阶段时修改 config 配置项为其添加 token
  onRequest(({ config }) => {
    config.headers.Authorization = localStorage.token || ''
  })
}

接下来为 axiosExt 注册我们的插件。

import { createAxios, createAxiosExt } from '@iel/axios-ext'
import axios from 'axios'
import AutoAddToken from './auto-add-token'

const http = createAxios(axios)
const axiosExt = createAxiosExt(http) // ==> http.$axiosExt

// 为 http 注册插件
axiosExt.use(AutoAddToken)

// 当请求时就会为我们的请求自动带上 token
http.get('/api/list').then(() => {
  // do somethings
})

API 说明

名称描述
createAxiosExt创建 AxiosExt 实例
SHALLOW_INSTANCE_KEY浅层拷贝 axios 实例标识
EVENT_STORE_KEY请求事件数据仓储
isAxiosInstance判断是否为 axios 实例
createAxios创建 axios 实例,支持传入配置项和 axios 实例
createShallowAxiosInstance创建浅层拷贝 axios 实例
getFullPath获取请求接口完整地址
getKeyByConfig根据常用请求配置项序列化生成接口标识
pickConfig提取常用请求配置项(method、url、data、params)

Hook 说明

名称描述
onRequest当请求时执行回调函数,多次调用将依次执行
onResponse当响应成功时执行回调函数,多次调用将依次执行
onResponseError当响应失败时执行回调函数,多次调用将依次执行
onFinally当请求流结束时执行回调函数,多次调用将依次执行
onDestroy当 axiosExt 实例销毁时执行回调函数,多次调用将依次执行