Wie packe und implementiere ich die Node.js + Express-Webanwendung?

83

Ich bin neu in der Programmierung von Node.j und habe kürzlich eine funktionierende Webanwendung erstellt, die (Express-, Backbone- und andere kostenlose Ansichtstechnologien mit MongoDB) verwendet. Jetzt bin ich an einem Punkt angelangt, an dem ich dasselbe in einer Staging-Umgebung bereitstellen möchte, und ich bin nicht sicher, wie ich diese Anwendung verpacken und verteilen soll. [Ich kann mich um mongoDb kümmern und es separat einrichten]

Ich komme aus der Java-Welt und dort erstellen wir Jars für wiederverwendbare Bibliotheken und War / Ear-Pakete für Webanwendungen, die in einem Servlet-Container bereitgestellt werden. Wie verpacke ich in diesem Fall meine Webanwendung, da node.js selbst auch als Webcontainer fungiert?

  1. Gibt es Standardformate / -richtlinien für mit Express erstellte Webapps für Verpackungsknoten? (Gibt es ein ähnliches Jar / War-Verpackungssystem für Node-Apps?)
  2. Wie stelle ich es nach dem Packen bereit? Würde es eine Exe werden, da es auch ein eigener Container ist?

PS: Ab sofort denke ich daran, alle erforderlichen Quelldateien manuell in die Staging-Umgebung zu kopieren und npm-Befehle auszuführen, um alle Abhängigkeiten von diesem Computer herunterzuladen, und dann "forever" oder einen anderen Mechanismus zum Ausführen meiner server.js zu verwenden. (Fügen Sie außerdem eine Art Überwachung hinzu, falls die App abstürzt und für immer ausfällt.) Ich bin mir nicht sicher, ob dies der richtige Weg ist. Ich bin sicher, dass es einen standardisierten Weg geben muss, um dieses Problem anzugehen.

KBJ
quelle
Für meine Java-Projekte verwenden wir Maven als Build / Deploy-Tool. In der Vergangenheit habe ich sogar Erfahrung mit Ameisen. Ich habe mir Grunt für Node.js angesehen, aber alles, was ich aus seinen Aufgaben verstehen konnte, war, dass es Vorverarbeitungsaufgaben (wie Minifizierung, Concat, JSHint usw.) ausführt, nichts über das Packen der App erwähnt und dann die Installation sagt in ein Repository (wie es Maven tut).
KBJ

Antworten:

44

Es gibt keinen standardisierten Weg, aber Sie sind auf dem richtigen Weg. Wenn Ihr package.jsonApp aktuell und gepflegt ist, können Sie Ihr App-Verzeichnis einfach in das Produktionssystem kopieren / zipen / klonen, ausgenommen das node_modules.

Führen Sie npm installauf Ihrem Produktionssystem aus, um Ihre Abhängigkeiten zu installieren, npm testwenn Sie Tests haben und schließlichNODE_ENV=production node server.js

Einige aktuelle Folien, die ich als sehr hilfreich erachtet habe und die auch das Thema Wrapper wie für immer enthalten, finden Sie hier .

MildlySerious
quelle
Entschuldigung für diese verspätete Antwort. Nachdem ich alle möglichen Kombinationen ausprobiert hatte, kam ich zu dem obigen Vorschlag. Vielen Dank!
KBJ
4
Was ist, wenn ich nicht möchte, dass npm die Module aus dem Internet herunterlädt? Stattdessen möchte ich alles innerhalb des Pakets versenden. Ist es möglich, den Ordner node_modules auch zu versenden? Funktioniert es? Der Grund, den ich frage, ist: Meine Anwendung kann in einer Intranetumgebung ohne Internetverbindung ausgeführt werden.
Stefan
2
@Stefan Hängt von den Modulen ab, die Sie damit liefern. Da einige Module, die kein reines JS sind, zuerst erstellt werden müssen, kann es sein, dass sie durch Verschieben in eine andere Umgebung beschädigt werden. Ich musste mich noch nicht damit befassen, aber vielleicht bietet die Verwendung des npm-Cache eine praktikable Lösung, indem der Cache mit der vollständigen Liste der Pakete gefüllt und anschließend installiert (und erstellt) wird.
MildlySerious
89

Das Bereitstellen von Node.jsAnwendungen ist sehr einfach. In Maven gibt es pom.xml. Verwandte Konzept in Node.jsist package.json. Sie können Ihre Abhängigkeiten angeben package.json. Sie können die Umgebung auch einrichten package.json. Zum Beispiel kann man das in einer Entwicklungsumgebung sagen

Ich möchte Unit-Tests durchführen.

aber in der Produktion;

Ich möchte Unit-Tests überspringen.

Sie haben lokale Repositorys für Maven unter .m2Ordner. In Node.js befindet sich node_modulesunter Ihrem Node.js-Projekt ein Ordner. Sie können Modulordner mit ihrem Namen sehen.

Kommen wir zum gruntTeil dieser Antwort. Gruntist ein Task-Manager für Ihre Frontend-Assets, HTML, Javascript, CSS. Beispielsweise können Sie vor der Bereitstellung HTML-, CSS- und Javascript-Bilder minimieren. Sie können auch gruntTask-Run-Funktionen einfügen package.json.

Wenn Sie an einer Beispielanwendung suchen möchten, können Sie ein Beispiel Blog - Anwendung finden hier . Überprüfen Sie die Ordnerstruktur und package.jsonals Referenz.

Für die Bereitstellung empfehle ich Ihnen die Heroku-Bereitstellung für Startanwendungen. Anleitungen finden Sie hier . Dies ist eine einfache git-basierte Bereitstellung.

Stellen Sie im Projektlauf einfach Ihre Umgebung NODE_ENV=developmentund ein node app.js. Hier app.jsist in Ihrem Projekt.

Hier ist das relative Konzept für Java und NodeJs;

  1. maven clean install => npm install
  2. .m2Ordner => node_modules(Unter Projektordner)
  3. mvn test=> npm test(Testabschnitt auf package.json)
  4. junit, powermock, ... => Mokka , node-Einheit , ...
  5. Spring MVC=> Express.JS
  6. pom.xml => package.json
  7. import package => require('module_name')
Hüseyin BABAL
quelle
Sehr hilfreich. Gibt es in package.json eine Möglichkeit, die Version anzugeben, um die Möglichkeit von Unterbrechungen aufgrund von Änderungen in Abhängigkeiten zu minimieren?
Mikijov
2
@MikiJ sicher, Sie können die Version für die Module angeben (Abhängigkeiten). Semantische Versionierung wird in der package.json verwendet, Sie können hier für weitere Details sehen
Hüseyin BABAL
Schöner Java - Node Vergleich. Toll!! Vielen Dank!!
Alejandro Teixeira Muñoz
Toll.!! Gibt es etwas, das der War-Datei in Java entspricht? Da wir nur Klassendateien anstelle von Quelldateien bereitstellen würden, gibt es im Knoten so etwas, anstatt ganze JS-Dateien bereitzustellen.
Mdumanoj
@ HüseyinBABAL deine Analogie ist nicht ganz richtig. weil mvn clean installerstellt eine gebündelte .war-Datei, die einfach auf jedem Server der Welt bereitgestellt werden kann und java -jar *.warauf dem Server ausgeführt wird. Aber wie kann ich eine gebündelte Datei für mein Knotenprojekt erstellen !! und wie kann ich es auf dem Server ausführen !!
KNDheeraj
6
  1. Gibt es ein Standardformat / Richtlinien für Verpackungsknoten-Webanwendungen, die mit Express erstellt wurden? (Gibt es ein ähnliches Jar / War-Verpackungssystem für Node-Apps?)

Ja, die CommonJS-Paketspezifikation :

Diese Spezifikation beschreibt das CommonJS-Paketformat für die Verteilung von CommonJS-Programmen und -Bibliotheken. Ein CommonJS-Paket ist eine zusammenhängende Zusammenfassung einer Sammlung von Modulen, Code und anderen Assets in einem einzigen Formular. Es bietet die Grundlage für die bequeme Lieferung, Installation und Verwaltung von CommonJS-Komponenten.

Für Ihre nächste Frage:

2. Wie stelle ich es nach dem Packen bereit? Würde es eine Exe werden, da es auch ein eigener Container ist?

Ich stimme Hüseyins Vorschlag zu, Heroku für die Produktion einzusetzen . Für die Entwicklung und Bereitstellung verwende ich Node-Appliance mit VirtualBox bzw. Amazon EC2:

Dieses Programm verwendet einen Debian-Computer, der von Build-Debian-Cloud oder Debian-VirtualBox-Appliance erstellt wurde, und verwandelt ihn in eine "Appliance" von Node.j, mit der eine über git bereitgestellte Node-Anwendung ausgeführt werden kann.

Ihre Webapp wird nicht zu einer exe.

David Braun
quelle
1
Vielen Dank, dass Sie nichts weiter getan haben, als nur die Daggone-Frage zu beantworten.
Montag,
6

Ich hoffe, dies ist hilfreich für jemanden, der nach einer Lösung sucht. Das Packen von Node js-Apps kann mit dem Befehl "npm pack" durchgeführt werden. Es wird eine Zip-Datei Ihrer Anwendung erstellt, die in einer Produktions- / Staging-Umgebung ausgeführt werden kann.

Naveen Kumar
quelle
5

Einige Möglichkeiten, dies zu erreichen:

  • Schieben Sie Ihren Code in das Git-Repository, schließen Sie alles aus, was nicht Ihr Code ist ( node_modules/**), ziehen Sie ihn dann in Ihre Staging-Umgebung und führen Sie ihn aus npm install, um alle Abhängigkeiten wiederherzustellen

  • Erstellen Sie daraus ein NPM-Paket und installieren Sie es über npmin Ihrer Staging-Umgebung (dies sollte auch alle Abhängigkeiten berücksichtigen).

  • manuelle Kopier- / SSH-Dateien in Ihre Staging-Umgebung (dies kann automatisiert werden Grunt), bevor Sie Ihre Abhängigkeiten über wiederherstellennpm

dark_ruby
quelle
2

Ich habe das pkg-Modul von zeit verwendet. Es kann plattformübergreifende Ergebnisse für Linux / Win / Macos erstellen. Wird tatsächlich in der Produktion verwendet und funktioniert problemlos.

Es nimmt alle js-Skripte auf und packt sie in eine einzige Datei.

Der Grund, warum ich es verwendet habe, ist, dass es bei der Sicherung Ihres Quellcodes hilft. Auf diese Weise haben sie in der Produktion in der Kundenumgebung Zugriff auf die Anwendung, jedoch nicht auf den Quellcode.

Einer der Vorteile ist auch, dass der Kunde in der Produktionsumgebung nicht unbedingt node.js installieren muss, da die Knoten-Binärdateien auch im Build gepackt werden.

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

varad11
quelle