react-native-fetch-client vs. Axios
Axios was engineered over a decade ago for browser XMLHttpRequests. In modern React Native with Hermes and Bridgeless architecture, react-native-fetch-client provides native C++ execution, 0 dependencies, and mobile-resilient primitives built right in.
1. The Architectural Paradigm Shift
Hermes C++ vs. XHR Bridge
Axios relies on XMLHttpRequest, forcing React Native to serialize data across the bridge. react-native-fetch-client binds directly to Hermes C++ fetch without serialization bottlenecks.
401 Auth Mutex Lock
Handling expired JWT tokens in Axios with interceptors frequently causes race conditions where 5 parallel calls trigger 5 refresh mutations. Our client pauses parallel requests in an atomic lock, refreshes once, and replays all.
Zero Third-Party Surface
To match our features in Axios, teams install 4–6 plugins (axios-cache-interceptor, axios-retry, mutexes). Each adds bundle weight and supply-chain risk. We provide all resilience primitives with strict zero dependencies.
2. Side-by-Side Code Comparison
A. Client Initialization & 401 Token Refresh
// Axios (Manual configuration & boilerplate)
import axios from 'axios';
const api = axios.create({
baseURL: 'https://api.example.com',
timeout: 10000,
});
// Manual auth injection
api.interceptors.request.use(async (config) => {
const token = await getAuthToken();
if (token) config.headers.Authorization = `Bearer ${token}`;
return config;
});
// Race-prone 401 refresh logic requires custom locks, queues, and retries
let isRefreshing = false;
let failedQueue: any[] = [];
api.interceptors.response.use(
(res) => res,
async (err) => {
// 50+ lines of custom mutex code needed to prevent multiple refresh calls...
}
);// react-native-fetch-client (Zero dependencies, built-in primitives)
import { createClient } from 'react-native-fetch-client';
const api = createClient({
baseURL: 'https://api.example.com',
timeout: 10000,
// 1. Dynamic Token Injection
bearerToken: async () => await getAuthToken(),
// 2. Built-in Single-Flight 401 Refresh Mutex (Zero Race Conditions!)
auth: {
refresh: async () => {
const { newToken } = await refreshAuthSession();
await saveAuthToken(newToken);
return newToken;
},
},
// 3. Built-in GET Deduplication & SWR Caching
dedupe: true,
});B. Consuming Endpoints & Error Handling
// Axios: Always throws on 4xx/5xx errors
try {
const response = await api.get('/user/profile');
console.log(response.data);
} catch (error) {
if (axios.isAxiosError(error)) {
console.error(error.response?.status, error.message);
}
}// react-native-fetch-client: Go/Rust-style Safe Tuples
const [data, error] = await api.safe.get('/user/profile');
if (error) {
console.error(error.status, error.message);
return;
}
console.log(data); // Fully typed, no try/catch wrapper needed3. Detailed Technical Matrix
| Capability | react-native-fetch-client | Axios | Mobile Impact |
|---|---|---|---|
| Runtime Architecture | Native Hermes C++ Fetch (TurboModule / Bridgeless) | Legacy XMLHttpRequest (XHR) Bridge Wrapper | Lower memory, zero thread hopping, native streaming |
| Package Footprint | ~15.6 KB (Zero runtime dependencies) | ~40 KB core (+ plugin ecosystem: ~150 KB) | Faster app cold startup and zero supply-chain drift |
| Single-Flight 401 Auth Mutex | Built-in (Atomic Lock & Request Queue) | Manual user-land code (Extremely race-prone) | Eliminates duplicate token refreshes and logouts |
| In-Flight GET Deduplication | Built-in (dedupe: true) | Requires 3rd-party cache plugin | Saves mobile battery & redundant cellular requests |
| Stale-While-Revalidate (SWR) Caching | Built-in with MMKV / AsyncStorage adapter | Requires axios-cache-interceptor (~60 KB) | 0ms instant offline screens with background updates |
| Go/Rust Safe Tuple Return (api.safe) | Built-in ([data, error]) | Not supported (throws on 4xx/5xx) | Eliminates repetitive nested try/catch blocks |
| Circuit Breaker Pattern | Built-in fail-fast protection | None | Shields degraded backends from thundering herd |
| Server-Sent Events & AI Streaming | Built-in WHATWG ReadableStream | Broken/limited on mobile XHR bridge | First-class support for OpenAI/Claude token streaming |
| Node.js < 18 Compatibility | Requires Node 18+ or fetch polyfill | Supported (http/https modules) | Legacy Node environments still use Axios |
Ready to Migrate?
Migrate from Axios in less than 5 minutes
We provide a 1-to-1 configuration cheatsheet covering interceptors, timeout mappings, and response structures.