插件开发
如果一个功能没有第三方依赖,或普通请求不需要,我们都推荐优先考虑函数,而不是插件。
开发一个插件的约定:
- 如果需要添加拦截器,应该使用前置条件限制,并且支持
AxiosRequestConfig
启用和禁用 - 如果拓展的是 Headers,应该设置到
AxiosInstance.defaults.headers.common
- 如果写的是适配器,应该通过拦截器封一层
开发插件
插件应该暴露一个 install 方法。这个方法的第一个参数是 Axios 实例,第二个参数是一个可选的选项对象:
import type { AxiosInstance } from 'axios'
export interface MyPluginOptions {
// pass
}
export default {
install(client: AxiosInstance, options: MyPluginOptions = {}) {
// 1. 拓展全局配置
client.defaults.enableMyPlugin = true
// 2. 添加全局拦截器
client.interceptors.request.use(function (config) {
// 只有启用才能修改配置
if (config.enableMyPlugin) {
// 注意修改 common 作用域
config.headers.common['xxx'] = 'xxx'
}
return config
})
}
}
// 拓展 Axios 的请求配置
declare module 'axios' {
export interface AxiosRequestConfig {
// 添加配置
enableMyPlugin?: boolean
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
也支持直接导出一个函数
import type { AxiosInstance } from 'axios'
export interface MyPluginOptions {
// pass
}
export default function install(client: AxiosInstance, options: MyPluginOptions = {}) {
// 1. 拓展全局配置
client.defaults.enableMyPlugin = true
// 2. 添加全局拦截器
client.interceptors.request.use(function (config) {
// 只有启用才能修改配置
if (config.enableMyPlugin) {
// 注意修改 common 作用域
config.headers.common['xxx'] = 'xxx'
}
return config
})
}
// 拓展 Axios 的请求配置
declare module 'axios' {
export interface AxiosRequestConfig {
// 添加配置
enableMyPlugin?: boolean
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
使用插件
import http from '@zhengxs/axios-http'
import MyPlugin from 'my-plugin'
http.use(MyPlugin)
1
2
3
4
2
3
4