Jak spakować i wdrożyć aplikację internetową Node.js + Express?

83

Jestem nowy w programowaniu Node.js i niedawno stworzyłem przykładową działającą aplikację internetową przy użyciu (Express, Backbone i inne bezpłatne technologie widoku, z mongoDB). Teraz jestem w punkcie, w którym chcę wdrożyć to samo w środowisku przejściowym i nie jestem pewien, jak spakować tę aplikację i dystrybuować to samo. [Potrafię zająć się mongoDb i skonfigurować go osobno]

Pochodzę ze świata Java i tam tworzymy jary dla bibliotek wielokrotnego użytku oraz pakiety war / ear dla aplikacji internetowych, które są wdrażane w kontenerze serwletów. W tym przypadku, skoro sam node.js działa również jako kontener sieciowy, jak spakować moją aplikację internetową?

  1. Czy istnieje standardowy format / wytyczne dotyczące tworzenia aplikacji internetowych dla węzłów tworzonych przy użyciu ekspresu? (Czy istnieje podobny system pakowania jar / war dla aplikacji node?)
  2. Jak wdrożyć go po spakowaniu? Czy stałby się exe, skoro jest także własnym pojemnikiem?

PS: Na razie myślę o ręcznym skopiowaniu wszystkich wymaganych plików źródłowych do środowiska pomostowego i uruchomieniu poleceń npm w celu pobrania wszystkich zależności na tym komputerze, a następnie użyciu „na zawsze” lub innego mechanizmu do uruchomienia mojego server.js. (Dodaj też jakiś rodzaj monitorowania, na wypadek awarii aplikacji i wiecznej awarii) Nie jestem pewien, czy to właściwy sposób? Jestem pewien, że musi istnieć jakiś znormalizowany sposób rozwiązania tego problemu.

KBJ
źródło
W moich projektach java używamy Mavena jako narzędzia do budowania / wdrażania. W przeszłości miałem nawet doświadczenie z mrówkami. Spojrzałem na Grunta dla Node.js, ale wszystko, co mogłem zrozumieć z jego zadań, to to, że wykonuje zadania preprocesingu (takie jak minifikacja, concat, JSHint itp.), Nie wspomniał o pakowaniu aplikacji, a następnie powiedział, że instaluje do repozytorium (tak jak robi to maven).
KBJ

Odpowiedzi:

45

Nie ma ustandaryzowanej drogi, ale jesteś na dobrej drodze. Jeśli twój package.jsonjest aktualny i dobrze utrzymany, możesz po prostu skopiować / zip / sklonować katalog aplikacji do systemu produkcyjnego, z wyłączeniem node_modules.

W systemie produkcyjnym uruchom, npm installaby zainstalować zależności, npm testjeśli masz testy i na koniecNODE_ENV=production node server.js

Kilka ostatnich slajdów, które uznałem za całkiem pomocne, a które zawierają również temat opakowań typu forever, można znaleźć tutaj .

Łagodnie Poważne
źródło
Przepraszamy za tak opóźnioną odpowiedź. Skończyło się na powyższej sugestii, po wypróbowaniu wszystkich możliwych kombinacji. Dzięki!
KBJ
5
A co jeśli nie chcę, żeby npm ściągał moduły z internetu. Zamiast tego chcę wysłać wszystko w paczce. Czy można również wysłać folder node_modules? Czy to działa? Pytam: moja aplikacja może działać w środowisku intranetowym, bez połączenia z Internetem.
Stefan
2
@Stefan Zależy od modułów, które z nim wysyłasz. Ponieważ niektóre moduły, które nie są czystym JS, muszą być zbudowane najpierw, może się zdarzyć, że przeniesienie ich do innego środowiska może je uszkodzić. Nie miałem jeszcze do czynienia z tym, ale być może użycie pamięci podręcznej npm zapewnia realne rozwiązanie, wypełniając pamięć podręczną pełną listą pakietów, a następnie instalując (i budując) z tego.
MildlySerious
89

Wdrażanie Node.jsaplikacji jest bardzo łatwe. W Maven jest pom.xml. Powiązana koncepcja w Node.jsjest package.json. Możesz określić swoje zależności od package.json. Możesz także przeprowadzić konfigurację środowiska na package.json. Na przykład w środowisku deweloperskim możesz tak powiedzieć

Chcę uruchomić testy jednostkowe.

ale w produkcji;

Chcę pominąć testy jednostkowe.

Masz lokalne repozytoria dla mavena w .m2folderze. W Node.js jestnode_modules folder w projekcie Node.js. Możesz zobaczyć foldery modułów wraz z ich nazwą.

Przejdźmy do gruntczęści tej odpowiedzi. Gruntto menedżer zadań dla zasobów frontendowych, html, javascript, css. Na przykład przed wdrożeniem możesz zminimalizować nawet obrazy html, css, javascript. Możesz również umieścić gruntfunkcje uruchamiania zadań wpackage.json .

Jeśli chcesz przyjrzeć się przykładowej aplikacji, możesz znaleźć tutaj przykładową aplikację blogową . Sprawdź strukturę folderów ipackage.json z nimi.

Do wdrożenia proponuję wdrożenie heroku dla aplikacji startowych. Możesz znaleźć instrukcje tutaj . To jest proste wdrożenie oparte na git.

W części uruchamiającej projekt wystarczy ustawić środowisko NODE_ENV=developmenti node app.js. Tutajapp.js jest twój projekt.

Oto relatywna koncepcja dla java i nodejs;

  1. maven clean install => npm install
  2. .m2folder => node_modules(W folderze projektu)
  3. mvn test=> npm test(sekcja testowa napackage.json )
  4. junit, powermock, ... => mokka , węzeł-unit , ...
  5. Spring MVC=> Express.JS
  6. pom.xml => package.json
  7. import package => require('module_name')
Hüseyin BABAL
źródło
Bardzo przydatne. Czy w pliku package.json można określić wersję, aby zminimalizować możliwość zerwania z powodu zmian w zależnościach?
mikijov
2
@MikiJ oczywiście, możesz określić wersję dla modułów (zależności). Wersjonowanie semantyczne jest używane w pliku package.json, więcej szczegółów można znaleźć tutaj
Hüseyin BABAL
Ładna Java - porównanie węzłów. Świetny!! Dzięki!!
Alejandro Teixeira Muñoz
Świetny.!! Czy istnieje odpowiednik pliku War w Javie? Ponieważ wdrożylibyśmy tylko pliki klas zamiast pliku źródłowego, czy istnieje coś takiego w węźle zamiast wdrażać całe pliki JS.
Mdumanoj
@ HüseyinBABAL twoja analogia nie jest całkowicie poprawna. ponieważ mvn clean installtworzy dołączony plik .war, który można łatwo wdrożyć na dowolnym serwerze na świecie i java -jar *.warwykonać go na serwerze. Ale jak mogę utworzyć pakiet plików dla mojego projektu węzła !! i jak mogę to wykonać na serwerze !!
KNDheeraj
6
  1. Czy istnieje standardowy format / wytyczne dotyczące tworzenia aplikacji internetowych dla węzłów tworzonych przy użyciu usługi Express? (Czy istnieje podobny system pakowania jar / war dla aplikacji node?)

Tak, specyfikacja pakietów CommonJS :

Ta specyfikacja opisuje format pakietu CommonJS do dystrybucji programów i bibliotek CommonJS. Pakiet CommonJS to spójne opakowanie kolekcji modułów, kodu i innych zasobów w jednym formularzu. Stanowi podstawę do wygodnej dostawy, instalacji i zarządzania komponentami CommonJS.

Na następne pytanie:

2. Jak wdrożyć go po spakowaniu? Czy stałby się exe, skoro jest także własnym pojemnikiem?

Druga sugestia Hüseyina, aby wdrożyć na Heroku do produkcji. Do programowania i przemieszczania używam odpowiednio Node-Appliance z VirtualBox i Amazon EC2:

Ten program wykorzystuje maszynę Debiana zbudowaną przez build-debian-cloud lub Debian-VirtualBox-Appliance i zamienia ją w „urządzenie” Node.js, zdolne do uruchomienia aplikacji Node wdrożonej przez git.

Twoja aplikacja internetowa nie stanie się exe.

David Braun
źródło
1
Dziękuję, że nie zrobiłeś nic więcej niż tylko udzielenie odpowiedzi na daggone pytanie.
monsto
6

Mam nadzieję, że może to być pomocne dla kogoś szukającego rozwiązania. Pakowanie aplikacji Node js można wykonać za pomocą polecenia „npm pack”. Tworzy plik zip aplikacji, który można uruchomić w środowisku produkcyjnym / przejściowym.

naveen kumar
źródło
5

kilka sposobów podejścia do tego:

  • Wciśnij swój kod do repozytorium Git, wykluczając wszystko, co nie jest Twoim kodem ( node_modules/**), a następnie ściągnij go do swojego środowiska przejściowego, uruchom, npm installaby przywrócić wszystkie zależności

  • utwórz z niego pakiet NPM, zainstaluj go npmw swoim środowisku przejściowym (powinno to również zająć się wszystkimi zależnościami)

  • ręczne kopiowanie / ssh plików do środowiska pomostowego (można to zautomatyzować za pomocą Grunt ), niż przywracanie zależności za pośrednictwemnpm

dark_ruby
źródło
2

Użyłem modułu pkg firmy Zeit. Może tworzyć materiały dostarczane na wiele platform dla linux / win / macos. Właściwie użyłem go w produkcji i działa dobrze bez żadnych problemów.

Pobiera wszystkie skrypty js i pakuje je do jednego pliku.

Powodem, dla którego go użyłem, jest to, że pomaga w zabezpieczeniu kodu źródłowego. W ten sposób w środowisku produkcyjnym w środowisku klienta będą mieli dostęp do aplikacji, ale nie do kodu źródłowego.

Jedną z zalet jest również to, że w środowisku produkcyjnym nie ma potrzeby instalowania klienta node.js, ponieważ pliki binarne węzła również są pakowane w kompilacji.

https://www.npmjs.com/package/pkg

varad11
źródło