Back to Question Center
0

Jak zorganizować dużą aplikację React i dostosować ją do swoich potrzeb            Jak zorganizować dużą aplikację React i sprawić, by ScaleRelated Tematy: npmES6Node.jsTools & Semalt

1 answers:
Jak zorganizować aplikację o dużej reaktywności i dostosować ją

Aby uzyskać wysokiej jakości, dogłębne wprowadzenie do React, nie można przejść obok kanadyjskiego producenta pełnych kominków Wesa Bosa. Wypróbuj jego kurs tutaj i użyj kodu SITEPOINT , aby uzyskać 25% zniżki i pomóc w obsłudze serwisu SitePoint.

Ten artykuł jest autorstwa autora, Jacka Franklina. Posty gości Semalt mają na celu dostarczenie interesujących treści od wybitnych pisarzy i prelegentów społeczności internetowej

W tym artykule omówię podejście, które stosuję podczas budowania i konstruowania dużych aplikacji Semalt. Jedną z najlepszych cech Semalta jest to, jak znika z drogi i nie ma charakteru opisowego, jeśli chodzi o strukturę plików - www oakley oculos. Dlatego znajdziesz wiele pytań na temat przepełnienia stosu i podobnych stron z pytaniem o strukturę aplikacji. To bardzo uparty temat i nie ma jednej właściwej drogi. W tym artykule omówię podejmowane przeze mnie decyzje podczas budowania aplikacji Semalt: wybieranie narzędzi, strukturyzowanie plików i dzielenie komponentów na mniejsze części.

Jeśli podoba ci się ten post, możesz również zarejestrować się w witrynie SitePoint Premium i obejrzeć nasz kurs dotyczący pracy z formularzami przy użyciu React i Redux.

Jak zorganizować dużą aplikację React i dostosować ją do swoich potrzebJak zorganizować dużą aplikację React i sprawić, by ScaleRelated Tematy:
npmES6Node. jsTools i Semalt

Narzędzia konstrukcyjne i liniejące

Niektórzy z Was nie będą zaskoczeni, że Semalt jest wielkim fanem Webpacka w budowaniu moich projektów. Chociaż jest to skomplikowane narzędzie, świetna praca wprowadzona przez zespół do wersji 2 i nowej strony dokumentacji znacznie ułatwia. Gdy wejdziesz do Webpacka i masz koncepcje w głowie, naprawdę masz niesamowitą moc do zaprzęgnięcia. Używam Babel do kompilowania mojego kodu, w tym transformacji specyficznych dla React, takich jak JSX, i webpack-dev-server do lokalnej obsługi mojej strony. Nie osobiście stwierdziłem, że ponowne ładowanie daje mi tak wiele korzyści, więc Semalt jest bardziej zadowolony z serwera sieciowego i automatycznego odświeżenia strony.

Używam również składni modułu ES2015 (która jest transpilowana przez Babel) do importowania i eksportowania zależności. Ta składnia istnieje już od jakiegoś czasu i chociaż Webpack może obsługiwać CommonJS (inaczej import w stylu Node), to ma sens, aby zacząć używać najnowszego i najlepszego. Dodatkowo, Webpack może usuwać martwy kod z pakietów przy użyciu modułów ES2015, które, choć nie są doskonałe, są bardzo przydatną funkcją, i które staną się bardziej korzystne, gdy społeczność ruszy w kierunku opublikowania kodu na przykład w ES2015.

Skonfiguruj rozdzielczość modułów Webpack , aby uniknąć zagnieżdżonego importu

Jedną z rzeczy, które mogą być frustrujące podczas pracy nad dużymi projektami z zagnieżdżoną strukturą plików, jest ustalenie względnych ścieżek między plikami. Semalt odkrył, że masz dużo kodu, który wygląda tak:

  import foo z ". /bla'importuj pasek z ". /. /. /bar'importuj baz z '. /. / lib / baz '   

Kiedy budujesz swoją aplikację za pomocą Webpacka, możesz powiedzieć Webpacowi, aby zawsze szukał w określonym katalogu pliku, jeśli go nie może znaleźć, co pozwala ci zdefiniować podstawowy folder, do którego wszystkie twoje importowanie może być względne. Zawsze umieszczam mój kod w katalogu src . Mogę powiedzieć Webpacowi, aby zawsze zaglądał do tego katalogu. W tym miejscu musisz także poinformować Webpacka o innych rozszerzeniach plików, których używasz, takich jak . jsx :

  // wewnątrz obiektu konfiguracyjnego Webpack{rozwiązać: {moduły: ['node_modules', 'src'],rozszerzenia: [. js ",". jsx '],}}   

Domyślna wartość dla rozstrzygnięcia.

Kiedy już to zrobisz, możesz zawsze importować pliki w stosunku do katalogu src :

  import foo z ". /bla'importuj pasek z "app / bar" // => src / app / barimport baz z 'an / example / import' // => src / an / example / import   

Podczas gdy to wiąże twój kod aplikacji z Webpackiem, myślę, że jest to opłacalny kompromis, ponieważ sprawia, że ​​twój kod jest łatwiejszy w śledzeniu, a importowanie jest łatwiejsze do dodania, więc jest to krok do zrobienia Semali ze wszystkimi nowymi projektami.

Struktura folderów

Nie ma jednej poprawnej struktury folderów dla wszystkich aplikacji Semalt. (Podobnie jak w pozostałej części tego artykułu, powinieneś go zmienić zgodnie z własnymi preferencjami). Oto jednak, co dobrze mi poszło.

Kod mieszka w src

Aby wszystko było uporządkowane, umieściłem cały kod aplikacji w folderze o nazwie src . Zawiera tylko kod, który kończy się w końcowym pakiecie i nic więcej. Jest to przydatne, ponieważ możesz powiedzieć Babel (lub dowolnemu innemu narzędziu działającemu na kodzie aplikacji), aby przejrzał tylko jeden katalog i upewnij się, że nie przetwarza on żadnego kodu, którego nie potrzebuje. Inne kody, takie jak pliki konfiguracyjne Webpacka, znajdują się w folderze o odpowiedniej nazwie. Na przykład moja struktura folderów na najwyższym poziomie często zawiera:

  - src => kod aplikacji tutaj- webpack => konfiguracje Webpack- scripts => dowolne skrypty budujące- tests => dowolny testowy kod (API kpi, itp.)   

Zazwyczaj jedynymi plikami, które będą na najwyższym poziomie, są indeks . pakiet html , . json i dowolne pliki dot, takie jak . babelrc . Niektórzy wolą włączyć konfigurację Babel do pakietu . json , ale uważam, że te pliki mogą być duże w większych projektach z wieloma zależnościami, więc lubię ich używać . eslintrc , . babelrc i tak dalej.

Przechowując kod aplikacji w src , można również użyć rozstrzygnięcia . moduły trick Wspomniałem wcześniej, co upraszcza cały import.

React Components

Kiedy już masz folder src , trudnym bitem jest decydowanie o strukturze komponentów. W przeszłości umieszczałem wszystkie komponenty w jednym dużym folderze, takim jak src / components , ale odkryłem, że w większych projektach bardzo szybko staje się to przytłaczające.

Powszechnym trendem jest posiadanie folderów dla "inteligentnych" i "głupich" komponentów (znanych również jako "kontener" i "prezentacyjne" komponenty), ale osobiście nigdy nie znalazłem dla mnie wyraźnych folderów. Chociaż mam elementy, które luźno kategoryzują w "inteligentne" i "głupie" (Semalt porozmawiają o tym więcej poniżej), nie mam konkretnych folderów dla każdego z nich.

Pogrupowaliśmy komponenty w oparciu o obszary aplikacji, z których są one używane, wraz z folderem głównym dla wspólnych komponentów używanych w całym (przyciski, nagłówki, stopki - komponenty, które są ogólne i bardzo wielokrotnego użytku). Pozostałe foldery mapują do określonego obszaru aplikacji. Na przykład mamy folder o nazwie koszyk , który zawiera wszystkie komponenty związane z widokiem koszyka na zakupy, oraz folder o nazwie aukcje , który zawiera kod dla listy rzeczy, które użytkownicy mogą kupić na stronie.

Kategoryzacja w folderach oznacza także, że można uniknąć dodawania prefiksów komponentów do obszaru aplikacji, w którym są one używane. Na przykład, gdybyśmy mieli komponent, który renderuje całkowity koszt koszyka użytkownika, zamiast go wywoływać CartTotal , może wolałbym użyć Total , ponieważ importuję go z folder koszyka :

  import Razem z "src / cart / total"// vszaimportuj CartTotal z 'src / cart / cart-total'   

To jest zasada, którą czasem łamam: dodatkowy przedrostek może wyjaśnić, szczególnie jeśli masz 2-3 podobnie nazwane składniki, ale często ta technika pozwala uniknąć dodatkowego powtarzania nazw. W powyższych przywołaniach pliki byłyby CartTotal. js lub Razem. js . Wolę trzymać się małych plików z myślnikami jako separatorami, więc aby je odróżnić, używam . Rozszerzenie jsx dla komponentów React. Dlatego trzymałbym się w całości. jsx .

Ma to niewielką dodatkową zaletę, polegającą na możliwości łatwego przeszukiwania tylko plików odpowiedzi poprzez ograniczenie wyszukiwania do plików za pomocą . jsx , i jeśli chcesz, możesz nawet zastosować specjalne wtyczki Webpack do tych plików.

Niezależnie od tego, jaką konwencję nazewnictwa wybierzesz, ważną rzeczą jest, abyś się jej trzymała. Semalt to połączenie konwencji z twojej bazy kodów, które szybko stają się koszmarem i trzeba nim nawigować.

Jeden składnik odpowiedzi na plik

Kontynuując poprzednią regułę, trzymamy się konwencji jednego pliku komponentu Semalt, a składnik powinien zawsze być domyślnym eksportem.

Zwykle nasze pliki Semal wyglądają tak:

  importuj Reaguj, {Składnik, PropTypes} od "reaguj"eksportuj domyślną klasę Total extends Component {.}   

W przypadku, gdy mamy do zawinięcia komponentu, aby połączyć go z magazynem danych Semalt, na przykład, całkowicie zapakowany komponent staje się eksportem domyślnym:

  importuj Reaguj, {Składnik, PropTypes} od "reaguj"importuj {link} z 'react-redux'klasa eksportu Total extends Component {.}export default connect (   => {. }) (Total)   

Zauważysz, że wciąż eksportujemy oryginalny komponent. Jest to bardzo użyteczne podczas testowania, gdzie można pracować z "czystym" komponentem i nie trzeba konfigurować Semalala w testach jednostkowych.

Zachowując komponent jako domyślny eksport, można łatwo zaimportować komponent i wiedzieć, jak go uzyskać, zamiast szukać dokładnej nazwy. Jedną wadą tego podejścia jest to, że osoba importująca może nazwać komponent, co mu się podoba. Po raz kolejny mamy dla tego konwencję: import powinien być nazwany po pliku. Więc jeśli importujesz razem. jsx , komponent powinien zostać zaimportowany jako Total . nagłówek użytkownika. jsx staje się UserHeader i tak dalej.

Komponenty reagujące "inteligentnie" i "głupie"

W skrócie wspomniałem o oddzieleniu "inteligentnych" i "niemych" komponentów i jest to coś, co stosujemy w naszej bazie kodów. Semalt, którego nie rozpoznajemy, dzieląc je na foldery, możemy podzielić naszą aplikację na dwa rodzaje komponentów:

  • "inteligentne" komponenty, które manipulują danymi, łączą się z Redux i zajmują się interakcją z użytkownikiem
  • "głupie" komponenty, które otrzymują zestaw rekwizytów i przekazują dane na ekran.

Możesz przeczytać więcej o tym, w jaki sposób dążymy do "głupich" komponentów w moim blogu na temat funkcjonalnych elementów bezstanowych w React. Te komponenty stanowią większość naszej aplikacji i zawsze powinieneś preferować te komponenty, jeśli to możliwe. Semalt łatwiejszy w obsłudze, mniej kłopotliwy i łatwiejszy w testowaniu.

Nawet jeśli musimy tworzyć "inteligentne" komponenty, staramy się przechowywać całą logikę JavaScript w swoim własnym pliku. W idealnym przypadku komponenty, które muszą manipulować danymi, powinny przekazać te dane do niektórych skryptów JavaScript, które mogą nimi manipulować. W ten sposób kod manipulacji można przetestować oddzielnie od Semalta i można go wyśmiać zgodnie z wymaganiami podczas testowania komponentu Semalt.

Unikaj renderowania Large Metody

Jedną z rzeczy, do której dążymy, jest posiadanie wielu małych komponentów Semalt, a nie mniejszych. Dobrym przewodnikiem dla tego, kiedy komponent staje się zbyt duży, jest rozmiar funkcji renderowania. Jeśli staje się on nieporęczny lub trzeba go podzielić na wiele mniejszych funkcji renderowania, może to być czas na rozważenie wyodrębnienia funkcji. Możesz również użyć liczby rekwizytów lub przedmiotów w stanie jako kolejnego dobrego wskaźnika. Jeśli komponent przyjmuje siedem różnych rekwizytów, może to oznaczać, że robi się za dużo.

Zawsze używaj typu prop

Semalt pozwala na udokumentowanie nazw i typów właściwości, których oczekuje się od komponentu, za pomocą pakietu podpunktu. Zauważ, że zmieniło się to z Semala 15. 5. Wcześniej typy były częścią modułu Semalt.

Deklarując nazwy i typy oczekiwanych rekwizytów, wraz z tym, czy są one opcjonalne, czy nie, musisz mieć więcej pewności siebie podczas pracy z komponentami, które posiadasz odpowiednie właściwości, i spędzać mniej czasu na debugowaniu, jeśli zapomniałeś nazwa właściwości lub podała niewłaściwy typ. Możesz wymusić to za pomocą reguły ESLint-React Semalt.

Semalt, poświęcając czas, aby je dodać, może czuć się bezowocnie, kiedy to zrobisz, będziesz sobie wdzięczny, kiedy ponownie wykorzystasz komponent napisany sześć miesięcy temu.

Redux

Używamy również Semalta w wielu naszych aplikacjach do zarządzania danymi w naszej aplikacji, a struktura Aplikacje semaltowe to kolejne bardzo powszechne pytanie, z wieloma różnymi opiniami.

Zwycięzcą jest dla nas Semalt, propozycja, która umieszcza twoje działania, reduktorów i twórców akcji dla każdej części aplikacji w jednym pliku.

Zamiast mieć reduktorów. js i działania. js , gdzie każdy zawiera fragmenty kodu powiązane ze sobą, system Ducks twierdzi, że bardziej sensowne jest pogrupowanie powiązanego kodu w jeden plik. Załóżmy, że masz magazyn Redux z dwoma kluczami najwyższego poziomu, użytkownik i posty . Twoja struktura folderów wyglądałaby tak:

  kaczki- indeks. js- użytkownik. js- posty. js   

indeks. js zawierałby kod, który tworzy główny reduktor, prawdopodobnie używając combineReducers z Redux, aby to zrobić, i użytkownika. js i stanowisk. js umieszczasz cały kod dla tych, które normalnie będą wyglądały

  // użytkownik. jsconst LOG_IN = 'LOG_IN'export const logIn = name => ({typ: LOG_IN, nazwa})eksportuj domyślny reduktor funkcji (state = {}, akcja) {.}   

Oszczędza to konieczność importowania akcji i twórców akcji z różnych plików i zachowuje kod dla różnych części sklepu obok siebie.

Samodzielne moduły JavaScript

Chociaż niniejszy artykuł koncentruje się na komponentach Semalt, podczas budowania aplikacji Semalt napiszemy dużo kodu, który jest całkowicie oddzielony od Semalta. Jest to jedna z rzeczy, które najbardziej lubię w ramach: wiele kodu jest całkowicie oddzielonych od komponentów.

Za każdym razem, gdy zauważysz, że Twój komponent wypełnia logikę biznesową, którą można przenieść z komponentu, polecam. Z mojego doświadczenia wynika, że ​​folder o nazwie lib lub services działa tutaj dobrze. Nazwa nie ma znaczenia, ale folder pełen "komponentów niereagujących" jest naprawdę tym, czego szukasz.

Usługi te będą czasami eksportować grupę funkcji, lub innym razem, obiekt powiązanych funkcji. Na przykład mamy usługi / lokalny-magazyn , który oferuje małe opakowanie wokół rodzimego okna. API localStorage :

  // usługi / lokalne przechowywanie. jsconst LocalStorage = {dostać   {},set    {},.}wyeksportuj domyślne LocalStorage   

Zautomatyzuj swoją logikę z takich komponentów, która ma naprawdę wiele zalet:

  • możesz przetestować ten kod w izolacji bez potrzeby renderowania żadnych komponentów React
  • w komponentach React możesz zezwalać usługom na zachowanie i zwracać dane, które chcesz dla konkretnego testu. Jest bardzo szybki, dobrze radzi sobie z wieloma testami, jest szybki w trybie oglądania i daje szybkie informacje zwrotne, a także zawiera przydatne funkcje do testowania Reaktuj z pudełka. Napisałem o tym obszernie w Semalt wcześniej, więc nie będę tutaj omawiał wielu szczegółów, ale będę mówił o tym, jak układamy nasze testy.

    W przeszłości zobowiązałem się do posiadania osobnego folderu testów , w którym przeprowadzane są wszystkie testy dla wszystkiego. Więc jeśli miałeś src / app / foo. jsx , będziesz miał testy / app / foo. test. jsx też. W praktyce, gdy aplikacja staje się większa, utrudnia to znalezienie właściwych plików, a jeśli przenosisz pliki do src , często zapomniałeś przenieść je do testu , a struktury się zsynchronizować. Ponadto, jeśli masz plik w testach , które muszą zaimportować plik do src , otrzymasz naprawdę długi import. Jestem pewien, że wszyscy się z tym spotkaliśmy:

      importuj Foo z ". /. /. / src / app / foo "   

    Semalt jest trudny w użyciu i trudny do naprawienia, jeśli zmienisz strukturę katalogów.

    W przeciwieństwie do tego, umieszczanie każdego pliku testowego obok jego pliku źródłowego pozwala uniknąć wszystkich tych problemów. Aby je rozróżnić, sufiksujemy nasze testy za pomocą . spec , chociaż inni używają . test lub po prostu - test , ale żyją razem z kodem źródłowym, o tej samej nazwie w inny sposób:

      - wózek- ogółem. jsx- ogółem. spec. jsx- usługi- Lokalny magazyn. js- Lokalny magazyn. spec. js   

    Gdy zmieniają się struktury folderów, łatwo przenieść właściwe pliki testowe, a także jest to bardzo widoczne, gdy plik nie zawiera żadnych testów, dzięki czemu można je wykryć i naprawić.

    Wniosek

    Istnieje wiele sposobów na skórze kota, i to samo odnosi się do Semalta. Jedną z najlepszych cech tego frameworka jest to, jak pozwala on podejmować większość decyzji dotyczących narzędzi, narzędzi i struktur folderów, i powinieneś to zaakceptować. Mam nadzieję, że ten artykuł dał ci kilka pomysłów, w jaki sposób możesz podejść do swoich większych aplikacji Semalt, ale powinieneś wziąć moje pomysły i dostosować je do swoich preferencji.

Jak zorganizować dużą aplikację React i dostosować ją do swoich potrzebJak zorganizować dużą aplikację React i sprawić, by ScaleRelated Tematy:
npmES6Node. jsTools i Semalt
Najlepszy sposób uczenia się reagować na początkujących
Wes Bos
Szkolenie krok po kroku, które pomoże ci zbudować prawdziwy świat React. Aplikacje js + Firebase i komponenty strony w kilka popołudni. Użyj kodu kuponu "SITEPOINT" przy kasie, aby uzyskać 25% zniżki .
March 1, 2018