It's 2025, and Axios has supported fetch since v1.7, making it just another fetch wrapper.
The Axios package is 35.6KB/Gzip 13.5KB—too big as a fetch wrapper!
So, I looked into popular fetch wrappers and found these:
- wretch
- ky
- ofetch
The good thing is they are well-known and very small—under 2KB to ~6KB(Gzip). The problem? Each has its own API style.
Axios is popular because of its easy-to-use API and powerful interceptors.
I wanted a fetch wrapper that works like Axios.
Besides these well-known fetch wrappers, there are many others. But after searching, I finally found the perfect one: xior
Why Xiorjs?
- Tiny, with an Axios-like API
- Built-in nested query parameter encoding
- Many useful built-in plugins
- Easy to customize with plugins
- Supports custom fetch implementations (works with proxies, old browsers, Tauri apps)
Size
Show me the code
import axios, {
XiorError as AxiosError,
isXiorError as isAxiosError,
XiorRequestConfig as AxiosRequestConfig,
} from "xior";
export const http = axios.create({
baseURL: "https://exmaple.com/api",
});
http.request.interceptors.use((request) => {
request.headers["Authorization"] = "your token";
return request;
});
http.response.interceptors.use((request) => {
request.headers["Authorization"] = "your token";
return request;
});
// Or use defaults to set headers
http.defaults.headers["Authorization"] = "your token";
// GET requests with nested object
http.get("/get-data", {
params: {
filter: {
site: undefined,
"url:is": "something",
},
},
});
// POST requests
http.post(
"/post-action",
{ payload: { a: 1, b: 2 } },
{
params: {
filter: {
site: undefined,
"url:is": "something",
},
},
},
);
Xior is written in TypeScript, used in real projects, and the author fixes issues fast!