Stan React Native w 2018 roku
Ta strona została przetłumaczona przez PageTurner AI (beta). Nie jest oficjalnie zatwierdzona przez projekt. Znalazłeś błąd? Zgłoś problem →
Minęło trochę czasu od naszego ostatniego raportu o stanie React Native.
W Facebooku używamy React Native bardziej niż kiedykolwiek w wielu ważnych projektach. Jednym z naszych najpopularniejszych produktów jest Marketplace – jedna z głównych zakładek w naszej aplikacji, z której korzysta 800 milionów osób miesięcznie. Od momentu powstania w 2015 roku cały Marketplace został zbudowany w React Native, obejmując ponad sto pełnoekranowych widoków w różnych częściach aplikacji.
React Native wykorzystujemy także w wielu nowych sekcjach aplikacji. Jeśli oglądaliście zeszłomiesięczny keynote F8, rozpoznacie funkcje takie jak Krwiodawstwo, Reagowanie na kryzysy, Skróty prywatności i Kontrole zdrowia – wszystkie niedawno wprowadzone i zbudowane w React Native. Projekty poza główną aplikacją Facebooka również korzystają z React Native. Nowe gogle VR Oculus Go zawierają aplikację mobilną towarzyszącą w całości zbudowaną w React Native, nie wspominając już o React VR napędzającym wiele funkcji w samych goglach.
Naturalnie korzystamy też z wielu innych technologii do budowania naszych aplikacji. Litho i ComponentKit to dwie biblioteki, których szeroko używamy; obie zapewniają API komponentów podobne do Reacta do budowania natywnych ekranów. React Native nigdy nie miał zastąpić wszystkich innych technologii – skupiamy się na ulepszaniu samego React Native, ale cieszymy się, gdy inne zespoły zapożyczają nasze pomysły, jak wprowadzenie natychmiastowego przeładowania do kodu niebędącego JavaScriptem.
Architektura
Gdy w 2013 roku rozpoczynaliśmy projekt React Native, zaprojektowaliśmy go z pojedynczym "mostem" między JavaScriptem a kodem natywnym, który jest asynchroniczny, możliwy do serializacji i przetwarzany wsadowo. Tak jak React DOM przekształca aktualizacje stanu w imperatywne wywołania API DOM typu document.createElement(attrs) i .appendChild(), tak React Native został zaprojektowany do zwracania pojedynczej wiadomości JSON listującej mutacje do wykonania, jak [["createView", attrs], ["manageChildren", ...]]. Zaprojektowaliśmy cały system tak, by nigdy nie polegał na synchronicznej odpowiedzi i by zapewnić pełną serializowalność całej listy do JSONa i z powrotem. Zrobiliśmy to dla elastyczności: na tej architekturze zbudowaliśmy narzędzia takie jak debugowanie w Chrome, które asynchronicznie wykonuje cały kod JavaScript przez połączenie WebSocket.
Przez ostatnie 5 lat odkryliśmy, że te początkowe założenia utrudniają implementację niektórych funkcji. Asynchroniczny most uniemożliwia bezpośrednią integrację logiki JavaScript z wieloma natywnymi API oczekującymi synchronicznych odpowiedzi. Wsadowe przetwarzanie wywołań natywnych utrudnia wywoływanie z aplikacji React Native funkcji zaimplementowanych natywnie. A serializowalny most oznacza niepotrzebne kopiowanie zamiast bezpośredniego współdzielenia pamięci między obu światami. Dla aplikacji całkowicie zbudowanych w React Native te ograniczenia są zwykle akceptowalne. Ale dla aplikacji z złożoną integracją między React Native a istniejącym kodem są frustrujące.
Pracujemy nad dużą przebudową architektury React Native, aby framework był bardziej elastyczny i lepiej integrował się z natywną infrastrukturą w hybrydowych aplikacjach JavaScript/natywnych. W tym projekcie zastosujemy wiedzę zdobytą przez ostatnie 5 lat i stopniowo przejdziemy do nowocześniejszej architektury. Przepisujemy wiele wewnętrznych elementów React Native, ale większość zmian odbywa się pod maską: istniejące aplikacje React Native będą działać z niewielkimi modyfikacjami lub bez nich.
Aby React Native był lżejszy i lepiej integrował się z istniejącymi natywnymi aplikacjami, ta rearchitektura wprowadza trzy główne wewnętrzne zmiany. Po pierwsze, zmieniamy model wątkowości. Zamiast wymagać od każdej aktualizacji UI pracy na trzech różnych wątkach, będzie możliwe synchroniczne wywoływanie JavaScriptu z dowolnego wątku dla wysokopriorytetowych aktualizacji, przy jednoczesnym utrzymaniu niskopriorytetowych zadań poza wątkiem głównym dla zachowania responsywności. Po drugie, włączamy możliwości async rendering do React Native, co umożliwi wielopoziomowe priorytety renderowania i uprości obsługę asynchronicznych danych. Wreszcie, upraszczamy nasz mostek, aby był szybszy i lżejszy; bezpośrednie wywołania między natywnym kodem a JavaScriptem są bardziej wydajne i ułatwią budowę narzędzi debugujących takich jak ślady stosu międzyjęzykowego.
Po wprowadzeniu tych zmian możliwe będą ściślejsze integracje. Obecnie włączenie natywnej nawigacji, obsługi gestów czy komponentów takich jak UICollectionView i RecyclerView bez skomplikowanych obejść jest niemożliwe. Po zmianach w modelu wątkowości tworzenie takich funkcji stanie się proste.
Udostępnimy więcej szczegółów na temat tej pracy później w tym roku, gdy będzie bliżej ukończenia.
Społeczność
Oprócz wewnętrznej społeczności w Facebooku, cieszymy się, że na zewnątrz istnieje prężna społeczność użytkowników i współtwórców React Native. Chcemy lepiej wspierać społeczność React Native, zarówno lepiej służąc użytkownikom, jak i ułatwiając współtworzenie projektu.
Tak jak nasze zmiany architektoniczne pomogą React Native czyściej współdziałać z inną natywną infrastrukturą, React Native powinien być szczuplejszy po stronie JavaScriptu, aby lepiej pasować do ekosystemu JavaScript – w tym umożliwiając wymianę maszyny wirtualnej i bundlera. Wiemy, że tempo zmian łamiących kompatybilność może być trudne do nadążenia, więc chcemy znaleźć sposoby na rzadsze wydawanie wersji głównych. Wreszcie, wiemy że niektóre zespoły poszukują bardziej dogłębnej dokumentacji w tematach takich jak optymalizacja uruchamiania, gdzie nasza ekspertyza nie została jeszcze spisana. Spodziewajcie się takich zmian w nadchodzącym roku.
Jeśli używasz React Native, jesteś częścią naszej społeczności – dziel się z nami swoimi przemyśleniami, jak możemy ulepszyć React Native dla Ciebie.
React Native to tylko jedno z narzędzi w zestawie developera mobilnego, ale wierzymy w nie mocno – i ulepszamy je każdego dnia, z ponad 2500 commitami w ostatnim roku od 500+ współtwórców.