Olá, Allan. Como vai?
Sua linha de pensamento está totalmente correta e reflete muito bem o cenário atual do desenvolvimento front-end. O que você descobriu na sua pesquisa é uma realidade consolidada no mercado.
O fetch foi introduzido nativamente nos navegadores para substituir o antigo e complexo XMLHttpRequest. No início, ele era muito simples, o que fazia o Axios ser a escolha favorita por entregar facilidades prontas, como a conversão automática para JSON e suporte a interceptadores. No entanto, o JavaScript evoluiu muito.
Hoje, a API fetch é extremamente poderosa, robusta e está disponível nativamente tanto no navegador quanto no Node.js (a partir da versão 18), dispensando a necessidade de instalar pacotes de terceiros para fazer requisições HTTP básicas.
Ainda assim, o Axios continua muito relevante. A decisão entre usar um ou outro geralmente depende do tamanho e da complexidade do projeto.
Quando o Fetch brilha?
- Projetos pequenos e médios: Evita inflar o tamanho do seu projeto (
bundle size) com dependências externas. - Aplicações Modernas (Next.js, Remix): Frameworks modernos estendem o comportamento do
fetch nativo para adicionar recursos de cache e revalidação de dados diretamente no servidor. - Microserviços e Serverless: Onde cada milissegundo de inicialização importa, não carregar bibliotecas externas é uma grande vantagem.
Quando o Axios ainda faz sentido?
- Projetos grandes e corporativos: Onde a organização da arquitetura de rede é fundamental.
- Interceptadores de Requisição/Resposta (Interceptors): O Axios permite centralizar lógicas globais de forma muito simples. Um exemplo clássico é injetar um token de autenticação em todas as requisições ou tratar erros de forma global (como redirecionar o usuário para o login caso o servidor retorne o status 401).
- Cancelamento de requisições simplificado: Embora o
fetch use o AbortController, o Axios oferece uma sintaxe historicamente mais amigável para cancelar requisições duplicadas ou obsoletas. - Transformação de dados automática: Ele transforma objetos JavaScript em JSON e vice-versa automaticamente, além de tratar erros HTTP (como status 400 ou 500) diretamente no bloco
catch, enquanto o fetch exige que você verifique manualmente a propriedade response.ok.
Para resumir e ilustrar essa diferença na prática de organização de código que você mencionou, veja como a mesma requisição com tratamento de erro e conversão de dados é feita em ambos:
Com Fetch nativo:
async function buscarDados() {
try {
const resposta = await fetch('https://api.exemplo.com/dados');
// O fetch não rejeita a Promise em erros 400 ou 500, precisa validar manualmente
if (!resposta.ok) {
throw new Error(`Erro no servidor: ${resposta.status}`);
}
// É necessário converter manualmente para JSON
const dados = await resposta.json();
console.log(dados);
} catch (erro) {
console.error('Erro na requisição:', erro.message);
}
}
Com Axios:
import axios from 'axios';
async function buscarDados() {
try {
// Conversão para JSON é automática e erros HTTP caem direto no catch
const resposta = await axios.get('https://api.exemplo.com/dados');
console.log(resposta.data);
} catch (erro) {
console.error('Erro na requisição:', erro.message);
}
}
Portanto, você está coberto de razão: o Axios não morreu, mas deixou de ser uma obrigação e passou a ser uma escolha arquitetural para projetos que necessitam de gerenciamento avançado de requisições.
Espero que possa ter lhe ajudado!