Moj react native, moj react native, moj preveliki react native
Moja mala avantura s React Nativom (RN) započela je prije skoro tri godine. Negdje u veljači 2018. godine pružila nam se prilika raditi na mobilnoj aplikaciji koja je kombinacija platforme za nagrađivanje vjernosti kupaca te plaćanja robe korištenjem mobilnih telefona. Već iz inicijalnih razgovora bilo nam je jasno da klijent nema budžet za razvoj dvije native mobilne aplikacije, iako je bilo ključno pokriti obje platformem zbog njegovog položaja na tržištu. Ovo se poklopilo s našom potragom za platformom koja bi nam omogućila jedinstveni razvoj za iOS i Android. Na papiru se je React Native činio kao odličan odabir, i tako je započela naša avantura, interno poznatija pod kodnim imenom “Danteov pakao”.
Iako je na papiru, a i u našim glavama, sve izgledalo gotovo idealno, problemi su počeli već kod razvoja inicijalne verzije aplikacije. Stvari koje su trebale biti brze i jednostavne postale su malo manje jednostavne i komplicirane. Jedan dio problema, svakako je bio uzrokovan našim nerazumijevanjem tehnologije, ali veliki dio problema bio je uzrokovan i samom tehnologijom. Već kod izrade osnovnih layouta ekrana, došla je do izražaja činjenica da RN koristi native kontrole za izgradnju UI. To dalje za posljedicu ima da se native kontrole različito ponašaju na različitim platformama, što opet za posljedicu ima hrpu koda koji provjerava na kojoj se platformi aplikacija izvršava i sukladno tome primjenjuje stilove na kontrolu.
Osim suptilnih razlika u stiliziranju kontrola, meni je ozbiljniji problem ćudljivost Debuggera koji ponekad radi, ponekad djelomično radi, a ponekad uopće ne radi. Na kraju se u većini slučajeva debugiranje svodi na pisanje tone console.log linija u kodu i praćenje output logova. Ovo me podsjeća na programiranje mikrokontrolera preko RS232. Fale mi samo debug LEDice na busovima, da bih mogao pratiti stanja portova. Tehnologija koja bi trebala omogućiti lako uključivanje novih developera treba raditi out of the box, a to podrazumijeva i debugger koji radi bez nekog mambo-jumba.
Kad sam se već pomirio da mi debugger više ne radi nego radi, došlo je vrijeme za nadogradnju projekta sa RN 0.58.1 na RN 0.62.2. E sad, naivni promatrač bi zaključio da sigurno postoji alat koji se pokrene i koji nekom magijom nadogradi projekt. Wrooong! Takav alat ne postoji. Postoji divna web aplikacija u kojoj odaberete verziju na kojoj se vaš projekt nalazi, nakon toga odaberete verziju na koju se želite dići i divan alat vam izbaci diffove u 40+ datoteka koje morate sami dodati u svoj kod. Nakon 2 dana copy/paste programiranja, kad počnete slaviti jer ste pri kraju, vaši problemi tek počinju. Sada vam je ostalo još samo natjerati projekt da se builda na obje platforme. Ovisno o složenosti projekta i bibliotekama koje koristite, to je još dodatnih par dana po platformi. Barem je bilo, dok RN team nije uveo divnu stvar koja se zove autolinking. Sada je ovaj korak ipak malo jednostavniji i humaniji.
E sad, ako baš nemate sreće, u jednoj od tri migracije naletjet ćete na neki problem u nekoj od native biblioteka, koje će vas tražiti da jako dobro poznajete interne stvari native platforme. I tu zapravo prestaje sva magija multiplatformskog razvoja. Dakle, da bi čovjek bio odličan RN developer, mora odlično baratati i TypeScriptom i native frameworcima na obje platforme.
I konačno, zadnje veselje koje nam se dogodilo na jednom projektu je nadogradnja XCodea. Iz nekog nepoznatog razloga, kod zadnje nadogradnje XCodea na verziju 12.2 prestala je raditi Image kontrola u RN (mislim da je naš projekt tada bio na verziji 0.62.2). Uglavnom, klijent traži hitnu izmjenu, a nama se u aplikaciji ne vidi niti jedna slika. Imamo dvije opcije, dignuti projekt na zadnju verziju RN (0.63.3) u kojoj je ovaj bug ispravljen ili patchati C datoteku u našoj verziji u bridgeu prema native kodu. Jedna opcija mi izgleda kao pucanje Coltom u lijevu nogu, druga kao pucanje u desnu nogu. Ovaj put smo odabrali desnu nogu i sada čekamo kada će nam se sve to razbiti u glavu.
I tako smo došli do limita koji sam si zadao za članak, a da nisam uspio istresti sve stvari koje me tište. Mislim da mogu zaključiti da RN na papiru izgleda kao odlična tehnologija i kao magično rješenje problema multiplatform developmenta. Iako je prisutna poprilično dugo na tržištu i iako iza nje stoji i FB i vrlo aktivan community, prepuna je nedostataka, nedorečenosti i potencijalnih zamki u koje ćete se sigurno uhvatiti. Jasno mi je da FB cilja ovom tehnologijom približiti razvoj mobilnih aplikacija web developerima, ali opet, da bi bili uspješni u tome, em moraju savladati sve tinejdžerske bolesti RN-a, em moraju u konačnici dobro poznavati i native da bi se izvukli iz problema u koje ih RN može uvući.
U konačnici, mi smo na RN-u odradili samo dva projekta i to je točno dva previše. Svi naši novi projekti rađeni su na Flutteru koji nam je, za razliku od RN, sjeo odlično. O ljubavi između Fluttera i Dreama možete više pročitati i u članku na Netokraciji (https://www.netokracija.com/flutter-171427).
Ok, skužili ste da React Native nije dobar fit za projekt koji želite plasirati na tržište i treba vam netko da vam pomogne implementirati snove u tehnologiji koja je magic bullet za sve vaše probleme. A da nam se javite?
Let's talk