Vue3 官方宣布淘汰 Axios,擁抱新趨勢(shì)
大家好,我是林三心,用最通俗易懂的話講最難的知識(shí)點(diǎn)是我的座右銘,基礎(chǔ)是進(jìn)階的前提是我的初心~
過(guò)去十年,Axios 憑借其簡(jiǎn)潔的API設(shè)計(jì)和瀏覽器/Node.js雙環(huán)境支持,成為前端開(kāi)發(fā)者的首選請(qǐng)求庫(kù)。但隨著現(xiàn)代前端框架的演進(jìn)和工程化需求的升級(jí),Alova.js 以更輕量、更智能、更符合現(xiàn)代開(kāi)發(fā)范式的姿態(tài)登場(chǎng)。
Axios的四大時(shí)代痛點(diǎn)
1. 冗余的適配邏輯
// Axios的通用配置(但實(shí)際你可能只用瀏覽器端)
axios.create({ adapter: isNode ? nodeAdapter : xhrAdapter })
2. 弱TypeScript支持
// Axios需要手動(dòng)定義響應(yīng)類型
interface Response<T> { data: T }
axios.get<Response<User>>('/api/user') // 仍需手動(dòng)解構(gòu)data
3. 過(guò)度封裝的反模式
// 層層攔截器疊加導(dǎo)致調(diào)試?yán)щy
axios.interceptors.request.use(config => {
// 權(quán)限校驗(yàn)攔截器
})
axios.interceptors.response.use(response => {
// 全局錯(cuò)誤處理攔截器
})
4. 生態(tài)割裂
需要額外引入第三方庫(kù)實(shí)現(xiàn)緩存、隊(duì)列等高級(jí)功能,增加維護(hù)成本
Alova.js 的核心優(yōu)勢(shì)
1. 極致的輕量與性能
- Tree-shaking優(yōu)化:僅打包使用到的功能模塊
- 零依賴:基礎(chǔ)包僅 4KB(Axios 12KB)
2. 智能請(qǐng)求管理(開(kāi)箱即用)
// 一個(gè)配置實(shí)現(xiàn)請(qǐng)求競(jìng)態(tài)取消+重復(fù)請(qǐng)求合并+錯(cuò)誤重試
const { data } = useRequest(userInfoAPI, {
abortOnUnmount: true, // 組件卸載自動(dòng)取消請(qǐng)求
dedupe: true, // 自動(dòng)合并重復(fù)請(qǐng)求
retry: 3 // 自動(dòng)重試3次
})
3. 聲明式編程范式
與 React/Vue 深度集成,提供Hooks風(fēng)格API:
// Vue3示例:自動(dòng)管理loading/error狀態(tài)
const {
data,
loading,
error,
send: fetchUser
} = useRequest(() => userAPI.get({ id: 1 }))
4. 多場(chǎng)景解決方案內(nèi)置
- SSR友好:服務(wù)端渲染直出數(shù)據(jù)
- 文件分片上傳:內(nèi)置進(jìn)度監(jiān)聽(tīng)和暫?;謴?fù)
- 數(shù)據(jù)緩存:支持內(nèi)存/SessionStorage多級(jí)緩存策略
實(shí)戰(zhàn)遷移指南
1. 基礎(chǔ)請(qǐng)求改造
Axios:
axios.get('/api/user', { params: { id: 1 } })
.then(res => console.log(res.data))
Alova:
// 定義API模塊(享受類型提示)
const userAPI = {
get: (id) => alova.Get('/api/user', { params: { id } })
}
// 發(fā)起請(qǐng)求(自動(dòng)推導(dǎo)user類型?。?const { data: user } = useRequest(userAPI.get(1))
2. 復(fù)雜攔截器遷移
Axios的混亂攔截:
// 請(qǐng)求攔截
axios.interceptors.request.use(config => {
config.headers.token = localStorage.getItem('token')
return config
})
// 響應(yīng)攔截
axios.interceptors.response.use(
response => response.data,
error => Promise.reject(error.response)
)
Alova的優(yōu)雅中間件:
// 全局統(tǒng)一邏輯(類型安全?。?const alova = createAlova({
beforeRequest: (method) => {
method.config.headers.token = localStorage.getItem('token')
},
responded: (response) => response.json() // 自動(dòng)解析JSON
})
遷移成本高?Alova給你保底方案
// 兼容模式:在Alova中使用Axios適配器
import { axiosAdapter } from '@alova/adapter-axios'
const alova = createAlova({
requestAdapter: axiosAdapter(axios)
})