Natrag na Blog
Blog

PRESTANITE slijepo koristiti Redux!

Mar 9, 2023·4 min read·Palomi Jain
#Front End Development#React#React Query#Redux#Web Development
PRESTANITE slijepo koristiti Redux!

PRESTANI SLIJEPO KORISTITI Redux!

Kao lijen programer — nisam se kupio na to. Osjećao sam da je korištenje zadane stanja i konteksta daleko bolje. Bilo je previše šablonskog koda u Reduxu i odvajanje odgovornosti, iako valjano, moglo se jednako lako postići koristeći prilagođeni hook. Također smo koristili redux-saga za interakciju s backendima. Što se meni činilo kao još jedan nepotreban teret.

Ali sam bio na početku karijere — pa sam pomislio da bih mu trebao dati poštenu priliku. Koristio sam redux i redux-saga oko godinu dana. I moji argumenti protiv toga su se samo pojačali. Neprestano sam pitao — zašto koristimo redux, a moji stariji kolege su mi dali odgovore poput —

  1. Čini kod testljivijim
  2. Odvaja poslovnu logiku od logike komponente
  3. Preporučuje se ne koristiti useState za kompleksne tipove podataka (kao što su objekti ili nizovi objekata)
  4. redux-saga vam može dati više kontrole nad stanjem API-ja
  5. Mogu koristiti kontekst, ali u koliko će kontekstnih providera umotati svoju aplikaciju?

Na sve to sam imao odgovore, ali nisu bili super-uvjerljivi. Mislim, redux je redux — koriste ga milijuni programera i velike kompanije — a ja sam bio samo junior inženjer softvera frustriran šablonskim kodom.

Sada, nakon rada kao Team Lead, mogu sa sigurnošću reći, svi moji stariji kolege su bili u krivu — i sami bi se složili. Razlog zašto pišem ovaj članak je što čak i danas ima toliko mnogo tvrtki koje koriste redux i prihvaćaju ga kao slijepi standard. Trebamo stati i pogledati alternative koje imamo!

Za početak, razmotrimo problem koji imam s reduxom jasnije. Evo količine koda koju bismo trebali napisati za jednostavno stanje brojanja koristeći redux. Očito, ovo je samo primjer — ne pokazuje pravu aplikaciju, ali je prilično učinkovit.

// src/actionConstants.js

const ACTION_CONSTANTS = {

INCREMENT_COUNT: "INCREMENT_COUNT",

DECREMENT_COUNT: "DECREMENT_COUNT",

RESET_COUNT: "RESET_COUNT"

}
// src/store/countStore/reducer.js const initialState = { count: 0 } export const countReducer = (state = initialState, action) => { switch (action.type){ case ACTION_CONSTANTS.INCREMENT_COUNT: return { count: state.count + 1 }; case ACTION_CONSTANTS.DECREMENT_COUNT: return { count: state.count - 1 }; case ACTION_CONSTANTS.RESET_COUNT: return initialState; } } // src/store/countStore/selectors.js export const useCountReducer = () => { return useSelector(store => store.countReducer) } // src/store/countStore/actions.js export const incrementCount = () => ({ type: ACTION_CONSTANTS.INCREMENT_COUNT }) export const decrementCount = () => ({ type: ACTION_CONSTANTS.DECREMENT_COUNT }) export const resetCount = () => ({ type: ACTION_CONSTANTS.RESET_COUNT }) // src/store/index.js const rootReducer = combineReducers({ countReducer: countReducer, ... });

Nije li to jednostavno criminalno? Ovo ne uzima u obzir kod koji ide u vašu sagu ili thunk pri interakciji s backendom — ovo je samo za redovnu dijeljenu varijablu stanja — brojanje. Zamislite količinu problema kroz koje trebate proći samo da napravite manju izmjenu u logici — skokomiceći s jedne datoteke na drugu i osiguravajući da su te promjene konzistentne u datotekama.

Redux je namijenjen biti globalna spremišta. Trebao bi se koristiti za dijeljenje stanja u svim komponentama u vašoj aplikaciji. Ali problem je što se, kada tvrtke počnu koristiti redux, oni imaju tendenciju pohraniti svo svoje stanje API-ja (koje se 'možda' trebalo dijeliti u budućnosti) koristeći redux. To ima smisla za projekt gdje će raditi mnogo ljudi — i želite imati jedan konzistentan način pisanja koda. Međutim, povećava veličinu koda i drastično smanjuje njegovu održivost.

Iako su uveli redux-toolkit i to čini kod malo čistijim — to se i dalje ne može usporediti s mnogim drugim bibliotekama koje bi obavile posao na mnogo bolje. Evo stack-a koji koristimo na My Next Developer:

React-Query: Koristim react-query za upravljanje svim stanjem API-ja u mojim aplikacijama. Interno upravlja stanjem učitavanja, greške i uspjeha za sve API pozive, keširuje rezultate kako bi se izbjeglo ponovno dohvaćanje i čini super lako pristupiti podacima u više komponenti. Ovo je prekrasan alat — jednom kada ga koristiš, obećavam da se nećeš vratiti. Jednostavna dokumentacija i implementacija temeljeno na hook-ovima čini je vrlo čistom. Evo popularne YouTube playlistice od React Query Tutorial za početnike od Codevolution kako bi naučio react-query.

Kontekst: Postoji vrlo malo slučajeva gdje imamo globalno stanje koje nije temeljeno na API-ju koje se trebalo dijeliti u više komponenti. U tim rijetkim slučajevima, kontekst je najjednostavnije za implementaciju. Također nepotrebno ne dodaje drugu biblioteku u kombinaciju.

Ne slažeš se? Voljela bih čuti tvoje misli!