Metody oddzielania frontu i zaplecza za pomocą pełnego javascript?

31

Załóżmy, że mam interfejs, który jest w większości jednostronicową aplikacją napisaną za pomocą kątownika, pomruku i altany. Przypuśćmy, że mam backend, który jest w większości po prostu interfejsem API REST umieszczonym na ORM, który przechowuje / pobiera obiekty z bazy danych, używając takich funkcji, jak chrząknięcie, ekspresowe i sekwencjonowanie.

Aplikacja kątowa wykonuje wszystkie wizualne rzeczy, które widzi użytkownik, ale robi to, będąc graficznym interfejsem użytkownika w stosunku do usług świadczonych przez back-end.

Pożądane byłoby podzielenie ich na dwie różne bazy kodowe, aby umożliwić niezależny rozwój, wersjonowanie, ciągłą integrację, usprawnianie itp.

Moje pytanie brzmi: jakie są dostępne metody robienia tego w czysty sposób? Czy są zalecane najlepsze praktyki dotyczące javascript z pełnym stosem?

Opcja nr 1 wydaje się być monolitem, tzn. „Nie rozdzielaj ich”. Zaletą jest to, że łańcuch kompilacji jest prosty i wszystko jest w jednym miejscu - ale wydaje się, że istnieje wiele wad; trudniejsza do samodzielnej wersji, zepsuty przód oznacza nierozkładalny tył i tak dalej.

Opcja nr 2 wydaje się quasi-monolitem, w którym łańcuch kompilacji frontonu powoduje zapisanie kilku plików na zapleczu. distKatalog na front-end będzie odnosić się do jakiegoś katalogu na back-end, więc zasadniczo, gdy przednie minifies końcowe, uglifies, etc, to kończy się publikowania na back-end, czyli wszystko.

Opcja nr 3 wydaje się być całkowicie oddzielna: front-end i back-end uruchamiają własne serwery na różnych portach i są to w pełni osobne projekty. Wadą wydaje się, że muszą być skonfigurowane tak, aby wiedzieć o swoich portach; back-end musi zezwalać na CORS z frontonu, a front-end musi wiedzieć, gdzie powinny się znajdować wszystkie te punkty końcowe.

Opcją # 4 może być użycie czegoś w rodzaju dokowania-komponowania, aby połączyć całość.

Jestem pewien, że istnieją inne opcje. Jaka jest zalecana najlepsza praktyka?

FrobberOfBits
źródło

Odpowiedzi:

18

Jest to aplikacja typu front-end, z interfejsem REST pomiędzy nimi. Masz już pełną separację.

Głosuję za opcją nr 3. Wygląda na to, że martwisz się konfiguracją, ale o to w tym wszystkim chodzi. Konfiguracja pozwala na pełną separację bez konieczności ścisłego powiązania kodu. Jeśli martwisz się o CORS, umieść wszystko w jednej domenie. Jeśli musisz mieć CORS, najlepszym sposobem na zarządzanie jest konfiguracja.

Ale tutaj nie ma „najlepszych praktyk”. Najlepszą praktyką jest ta, która najlepiej spełni twoje konkretne potrzeby.

Robert Harvey
źródło
2
Jak umieściłbyś wszystko w jednej domenie, gdyby były to dwa osobne serwery? Nawet gdyby działały na tym samym hoście, musiałyby znajdować się w różnych portach, co czyni je innym źródłem.
FrobberOfBits,
1
Jeśli nie ma najlepszej praktyki, czy są dostępne przykłady wykonania tej konfiguracji?
FrobberOfBits,
7
Możesz umieścić odwrotny serwer proxy (nginx) przed aplikacją i zamontować /lokalizację na localhost:3000(serwer frontonu) i /api/na localhost:3001(serwer interfejsu API). nginx będzie wtedy nasłuchiwał na domyślnym porcie http.
nvartolomei
@nvartolomei Zgadzam się na używanie odwrotnego proxy. Czy istnieje sposób na czyste udostępnianie niektórych informacji między zapleczem, interfejsem użytkownika, takich jak informacje o trasach? Czy łatwo jest skierować zwrotny serwer proxy do CDN?
Andrew Allbright,
6

Tak, należy je rozdzielić i traktować aplikację frontonu jak aplikację innej firmy - możesz w końcu dodać kolejnego klienta, na przykład aplikację mobilną, a jeśli pierwszy klient został zbudowany w ten sposób, Twoje życie będzie łatwiejsze.

Korzystanie z kontenerów dokowanych lub innego systemu wdrażania dotyczy głównie zaplecza, ponieważ interfejs użytkownika to tylko zasoby statyczne, które należy rozwiązać. Możesz hostować te zasoby statycznie na swoim serwerze lub w innym miejscu, takim jak CDN, takim jak cloudfront.

Unikanie corsów pozwoli ci zaoszczędzić trochę konfiguracji, ale jak wspomniano powyżej, jest to w pewnym sensie kwestia. Korzystanie z cors (i uwierzytelniania tokena) lepiej przygotuje backend również dla innych klientów.

Edycja: jeśli chodzi o najlepsze praktyki js pełnego stosu - powiedziałbym to, bądź konsekwentny. Jeśli używasz obietnic (i powinieneś), rób to po obu stronach. Zachowaj ten sam styl i formatowanie js, używaj tych samych bibliotek testowych (jeśli to możliwe) itp.

MaxWell
źródło