Adaptacja zewnętrznego pakietu npm do natywnych funkcji przeglądarki
Utrzymując starsze aplikacje napisane w języku JS prędzej czy później zauważysz podczas instalacji, że niektóre pakiety oznaczone są jako deprecated. Czasami powodem tego oznaczenia jest to, że funkcje pakietu zostały zaimplementowane w najnowszych wersjach przeglądarek i autorzy rezygnują z rozwijania biblioteki na rzecz funkcji natywnych:
WARN deprecated stable@0.1.8: Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility
Często zastąpienie takich funkcji natywnymi pozwala na znaczne zmniejszenie rozmiaru dostarczanej aplikacji
i zapewnia większe wsparcie w przypadku potencjalnych błędów. Taka adaptacja jest możliwa dzięki skonfigurowaniu
nadpisanych zależności w pliku package.json w polu overrides:
{
"overrides": {
"baz": {
"bar": {
"foo": "1.0.0"
}
}
}
}
Operacja ta jest bezpieczna pod warunkiem, że nowa wersja pakietu będzie kompatybilna z pakietami zależnymi. Warto pamiętać o tym przy aktualizacji pakietów zależnych (przykładowo mogą one nagle wymagać wersji, która nie jest kompatybilna z adaptacją pakietu). Z powyższego wynika więc minus, jakim jest potencjalne utrudnienie w utrzymywaniu aplikacji.
Na przykładzie pakietu react-static pokażę Ci jak zastąpić pośrednią zależność od pakietu axios funkcją natywną fetch
zaimplementowaną w przeglądarce, jak i w NodeJS.
Adaptacja pakietu npm
Definicja pakietu react-static@7.6.2
wymaga w drzewie zależności pakietu axios@^0.21.1. Właściwie jednak jedynie funkcja axios.get() jest wykorzystywana w całym narzędziu
i to tylko w dwóch miejscach – jako hook Reacta
dostarczający dane strony oraz do prefetchu strony.
Axios jest pakietem, który oferuje dużo więcej funkcjonalności niż natywny fetch, wspierając jednocześnie więcej przeglądarek. Z drugiej strony, funkcję fetch znajdziemy już obecnie w większości nowszych przeglądarek, a pakiet axios dokłada jakkolwiek niewielką cegiełkę do rozmiaru aplikacji.
Standardowo po instalacji pakietów potrzebnych do react-static, znajdziesz pakiet axios w folderze node_modules/axios relatywnie do swojego projektu.
W celu podmiany własną adaptacją polecam skopiowanie zawartości do korzenia projektu. Następnie w definicji pakietu usuń niepotrzebne zależności i
dodając informacje o zmianach względem oryginału:
{
"name": "axios",
"version": "0.0.0",
"description": "Promise based HTTP client for the browser and node.js. MODIFIED: Customized as a wrapper for fetch GET.",
"main": "index.js",
"author": "Matt Zabriskie",
"license": "MIT"
}
Plikiem wejściowym pakietu jest index.js (module.exports = require('./lib/axios');), wskazany w polu main.
Docelowy plik lib/axios.js zawiera eksport modułu. Adaptujemy go, implementując jedynie funkcję get(),
odwołując się bezpośrednio do natywnej funkcji fetch. Aby zachować domyślne zachowanie, dodaj nagłówek Accept,
oczekując w pierwszej kolejności formatu JSON, do którego zamienimy otrzymaną odpowiedź:
'use strict';
var axios = {
get: (path) => {
return fetch(path, {
method: "GET",
headers: {
'Accept': 'application/json, text/plain, */*'
}
})
.then(response => response.json())
.then(data => ({data}));
}
}
module.exports = axios;
Teraz wystarczy, że podmienimy namiary na pakiet w pliku package.json w polu resolutions (lub też w polu dependencies, jeśli również z niego korzystamy).
Globalne nadpisanie adaptacji pakietu znajdującej się teraz lokalnie w folderze src/axios (polecenie npm install ./src/axios dla pola dependencies) będzie wyglądać tak:
{
"resolutions": {
"axios": "link:src/axios"
}
}
Przy ręcznym dodaniu zależności pozostaje jedynie wywołanie polecenia npm install w celu aktualizacji pliku package-lock.json.
Na sam koniec spróbuj przygotować kilka przypadków testowych, aby zweryfikować wszystkie przypadki użycia Twojej adaptacji.
