Malcolm Laing
Malcolm LaingJavaScript Consultant

Axios czy Fetch - czego lepiej używać?

Poznaj wady i zalety Axios i Fetch oraz zdecyduj, którego z tych klientów HTTP używać.
19.02.20203 min
Axios czy Fetch - czego lepiej używać?

Axios to słynny moduł JavaScript. Jest on klientem HTTP dla przeglądarek i NodeJS opartym na obietnicach (promise). Jeśli ktoś z Was pracował w ostatnich latach z JavaScript, to z pewnością go używał. 


W październiku 2019, Axios został pobrany z npm przez ponad 25 milionów użytkowników. 

A co jeśli powiedziałbym Ci, że to martwy projekt? Jeden z wątków na Reddicie tak właśnie sugeruje. 

Przesłanki ku temu są następujące:

  • Bardzo niska aktywność na Githubie
  • Github issues i Pull Requests są ignorowane
  • Nie ma komunikacji z głównym zespołem


Kontrowersyjna luka w bezpieczeństwie pogorszyła jeszcze sprawę. Snyk zaraportował lukę w 2017. Była ona jednak ignorowana przez twórców przez ponad dwa lata. 

Kiedy axios stał się popularny, nie było podobnego klienta dla przeglądarek, który byłby oparty na obietnicach. Naturalny interfejs żądania XML HTTP (XHR) był nędzny i ciężko się z nim pracowało. 

Programiści przylgnęli do Axiosa, ponieważ ułatwiał im życie. W 2015 został wydany Fetch. Dlaczego więc cały czas używamy Axiosa? 

Mniej boilerplate’u

Używając Fetch

fetch('https://jsonplaceholder.typicode.com/todos/1')
  .then(response => response.json())
  .then(json => console.log(json))

// {
//   "userId": 1,
//   "id": 1,
//   "title": "delectus aut autem",
//   "completed": false
// }


Używając Axiosa

axios.get("https://jsonplaceholder.typicode.com/todos/1")
  .then(response => console.log("response", response.data))

// {
//   "userId": 1,
//   "id": 1,
//   "title": "delectus aut autem",
//   "completed": false
// }


Pracując z Fetch musimy zająć się dwoma obietnicami. Pracując z Axiosem możemy z kolei bezpośrednio uzyskać dostęp do wyniku JSON bezpośrednio z obiektu odpowiedzi przez właściwość data.

Metoda json() o mixinu Body bierze strumień odpowiedzi i odczytuje go do końca. Zwraca wtedy obietnicę, która zostaje rozwiązana z ciałem odpowiedzi sparsowanym jako JSON.


Dodatkowy boilerplate jest wyraźniejszy kiedy pracujemy z żądaniami POST. 

Używając Fetch

fetch("https://jsonplaceholder.typicode.com/posts", {
  method: "POST",
  body: JSON.stringify({
    title: "Title of post",
    body: "Post Body"
  })
})
  .then(res => {
    if (!response.ok) throw Error(response.statusText);
    return response.json();
  })
  .then(data => console.log(data))
  .catch(error => console.log(error));


Używając Axiosa

axios
  .post("https://jsonplaceholder.typicode.com/posts", {
    title: "Title of post",
    body: "Body of post"
  })
  .then(response => console.log(response.data))
  .catch(error => console.log(error));


Pracując z Axiosem możesz uniknąć boilerplate’u i pisać czystszy i bardziej zwięzły kod.

Obsługa błędów

Używając fetch

fetch("https://jsonplaceholder.typicode.com/todos/100000")
  .then(response => {
    if (!response.ok) throw Error(response.statusText);
    return response.json();
  })
  .then(data => console.log("data", data))
  .catch(error => {
    console.log("error", error);
  });

// error Error: Not Found


Używając Axiosa

axios
  .get("https://jsonplaceholder.typicode.com/todos/100000")
  .then(response => {
    console.log("response", response);
  })
  .catch(error => {
    console.log("error", error);
  });

// error Error: Not Found


Fetch nie wyrzuca błędów sieciowych, a Axios już tak. Pracując z Fetch trzeba zawsze sprawdzać właściwość response.ok. Aby to ułatwić i móc używać tego w przyszłości, możesz wyciągnąć sprawdzanie błędów do funkcji. 

const checkForError = response => {
  if (!response.ok) throw Error(response.statusText);
  return response.json();
};

fetch("https://jsonplaceholder.typicode.com/todos/100000")
  .then(checkForError)
  .then(data => console.log("data", data))
  .catch(error => {
    console.log("error", error);
  });

Brakujące funkcje 

Axios może monitorować postęp ładowania danych. Nie jest to jednak możliwe z Fetch. Jeśli tworzysz aplikację która uploaduje video lub grafiki, monitorowanie postępu ładowania może być decydującym czynnikiem.

const config = {
  onUploadProgress: event => console.log(event.loaded)
};

axios.put("/api", data, config);

Alternatywne biblioteki

  • ky- mały i elegancki klient HTTP oparty na window.fetch
  • superagent- mała i progresywna biblioteka żądań HTTP działająca po stronie klienta w oparciu o XMLHttpRequest

Czego więc powinniśmy używać?

To zależy. Jeśli zależy Ci na śledzeniu postępu ładowania, wybierz Axiosa lub Superagent. Jeśli jesteś w stanie poradzić sobie z ograniczeniami Fetcha, to będzie Ci z nim lepiej. Aby usunąć trochę boilerplateu, wypróbuj wrapper typu ky.

<p>Loading...</p>