So organisieren Sie große Node.js-Projekte


82

Was sind einige gute Möglichkeiten, um große Node.js-Projekte zu organisieren?

Zum Beispiel eine App, die sowohl express.js als auch socket.io verwendet? Dies würde sowohl die logische Struktur der Anwendung als auch das Dateisystem umfassen.

Momentan schiebe ich eine Menge Code in eine einzelne Master-JS-Datei und platziere Code in einem riesigen globalen Objekt, und es fühlt sich ungezogen an.


2
Hast du Zeit, ein Buch zu lesen ?
Straseus

Ich muss dieses Buch vielleicht kaufen, danke!
Thomas Hunter II

Google "JavaScript Modules" oder "Modular JavaScript" :-)
Sri

1
Ich habe das von Straseus vorgeschlagene Buch gelesen und es gibt viele gute Ratschläge und Analysen, aber ich befürchte, dass sich nicht viel gut auf die Strukturierung einer Node.js-Anwendung mit Express übertragen lässt. Die Antwort von PuerkitoBio unten enthält Links zu einigen Vorschlägen für eine gute Struktur der Startdatei. Ich habe vor, nach Bedarf auf dieser Struktur aufzubauen.
Aaron

Antworten:


95

Ein Beispiel für Anfänger

Ich mag das ursprünglich von @ david-ellis überprüfte und Sie sollten es gründlich studieren, um es zu verstehen, da es ein gutes ist. Ich hätte es mir jedoch für Anfänger, die ein einfaches Beispiel sehen möchten, lieber vereinfacht. Folgendes hätte ich gerne gesehen, wenn mir jemand gezeigt hätte.

Geben wir ein typisches Szenario an, in dem Sie Express verwenden und viele Routen in Ihrer Datei app.js aufgeführt sind. Sein Inhalt würde ungefähr so ​​aussehen:

app.js.

// ... startup code omitted above

app.get('/', function(req, res) {
  res.render('index', { title : 'home' });
});
app.get('/contactus', function(req, res) {
  res.render('contactus', { title : 'contact us' });
});
app.get('/anotherpage', function(req, res) {
  res.render('anotherpage', { title : 'another page' });
});
// and so on...

Sie können sich vorstellen, dass diese Datei bei 50 Routen völlig außer Kontrolle geraten kann. Es wäre schön, etwas von dieser Unordnung aus der Datei app.js zu entfernen.

Sie würden in Ihrer App einen Ordner "Controller" erstellen, damit Ihre Struktur nun folgendermaßen aussieht:

app.js
/controllers

Erstellen Sie eine Datei in "/ controller" mit dem Namen "index.js" und geben Sie den folgenden Code ein.

/controllers/index.js

module.exports.set = function(app) {
   // copy your routes listed in your app.js directly into here
}

Schneiden Sie Ihre Routenlisten aus Ihrer Datei "app.js" aus und fügen Sie sie in die Datei "/controllers/index.js" ein.

Entfernen Sie in Ihrer app.js-Datei Ihre Routen und führen Sie stattdessen die folgenden Schritte aus.

app.js.

// remove your routes and replace with this code
var controllers = require('./controllers');
controllers.set(app);

Wenn Sie nun möchten, dass Ihre Datei "/controllers/index.js" ebenfalls aufgeteilt wird, fügen wir ein weiteres Beispiel hinzu, damit Sie sehen können, wie sich Node.js wirklich wie eine russische Puppe verhält, wenn es darum geht, den Code zu organisieren.

Fügen Sie in "/ controller" eine weitere Datei "accounts.js" hinzu und platzieren Sie Folgendes darin.

/controllers/account.js

module.exports.set = function(app) {
    // put more app route listings here
}

Fügen Sie nun in Ihrer Datei "/controllers/index.js" einen Verweis auf "account.js" ein.

/controllers/index.js

var account = require('./account.js');

module.exports.set = function(app) {
   // your routes here

   // let "account.js" set other routes
   account.set(app);
}

Wie Sie sich vorstellen können, können Sie die Dinge immer wieder in immer kleinere Teile aufteilen und mehr Ordner in Ordner legen und mit "erfordern" referenzieren, wenn Sie möchten. Sie können dasselbe Konzept für "/ lib" - oder Bibliotheksdateien verwenden. "node_modules" macht das schon.

Dies ist nur einer von vielen Gründen, warum es sehr angenehm ist, mit node.js zu programmieren.

Beispiel für verwaltbares Express 4-Routing

Hier ist ein weiterer Beitrag, auf den ich über etwa 4 Express-Routen geantwortet habe.

Ruhen Sie sich mit dem verschachtelten Router von Express.j aus


IMHO war es besser vor dem Update, Sie können vermeiden, jedem Controller einen Namen zu geben, indem Sie einen Aliasing-Mechanismus implementieren, bei dem eine Route in eine andere weitergeleitet wird. Dies hilft auch bei kanonischen URLs
Timo Huovinen

Der kanonische URL-Teil macht nichts aus, es war ein nachträglicher Gedanke. Mit kanonischer URL meinte ich das Hinzufügen einer kanonischen URL <link>zu etwas, /example/pathwenn ein Benutzer /example/path/in die Adressleiste eintritt (oder umgekehrt).
Timo Huovinen

Sie wissen, als Programmierer ist es selbstverständlich, diese Art von organisierter Hierarchie zu wollen, aber es eignet sich praktisch nicht gut, wenn Sie eine Datei öffnen oder ein Check-in lesen. Sie werden am Ende eine große Anzahl von "index.js" haben, deren Arbeit schnell schmerzhaft wird.
Abhinav Gujjar

Ein Jahr später ein wertvoller Beitrag für mich. Ich starte gerade node.js, um es für ein Wochenendprojekt zu verwenden.
Masfenix

@ JasonSebring Es gibt so viele Informationen und ich bin so neu! Ich bin gerade sehr verloren. Als Student in Mathematik mache ich viel Matlab / R / Mathematica, aber das letzte Mal, als ich ein Web / Desktop-Framework berührte, war in den .net 2.0-Tagen.
Masfenix

10

Ich habe vor ein paar Tagen einen Blog-Beitrag zu diesem Thema geschrieben, und obwohl der Artikel auf Französisch ist, habe ich ein GitHub-Repo (auf Englisch) eingerichtet, um ein funktionierendes Beispiel für die von mir verwendete Struktur zu zeigen.

Natürlich gibt es keine endgültige Antwort auf diese Frage, aber es ist interessant zu sehen, was andere tun, und ich bin gespannt auf andere Meinungen zu diesem Thema (das auch hier besprochen wurde , wo Sie eine Zusammenfassung meiner Vorschläge sehen können). .


Vielen Dank für diesen Link. Es war eine gute Lektüre (mithilfe von Google Translate). Ich bin sicher, dass ich einige Ihrer Vorschläge bei der Gestaltung der Organisation des Projekts befolgen werde, an dem ich gerade arbeite.
Aaron

Können Sie den Link reparieren?
Yevhenii Herasymchuk

2

Ähnlich wie in dem anderen Blog-Beitrag habe ich einen speziell über das Organisieren von ExpressAnwendungen geschrieben. Es ist die Methode, die ich seit ungefähr anderthalb Jahren verwende. Organisieren Sie Ihre Anwendungen grundsätzlich nach Ihren Dateneinheiten oder anderen Kernelementen. Platzieren Sie die Logik für jedes dieser Elemente in ihren eigenen Verzeichnissen. Ich habe versucht, viel von Python zu leihen.

http://rycole.com/2013/01/28/organizing-nodejs-express.html


1

Seine Artikel sind nicht mehr online, aber Eric Satterwhites Knotenserie empfahl eine Struktur wie unten aufgeführt.

# Project 
. 
|-- packages/
|   |-- project-core
|   |   |-- lib/
|   |   |-- commands/
|   |   |-- startup/
|   |   |-- conf/
|   |   |-- test/
|   |   |-- package.json
|   |   |-- README.md
|   |   |-- events.js
|   |   |-- .npmignore
|   |   `-- index.js
|-- package.json
`-- index.js

Der packages/Ordner wird aus Modularitätsgründen zu Ihrer Quelle.


0

Wenn Sie ein Anfänger in diesem Bereich sind, empfehle ich Ihnen, sich bestehende Projekte anzusehen, die von Entwicklern geliebt werden. Einige von ihnen sind:

  • Sails.js - 18k Sterne. Unter dem von mir angegebenen Link können Sie einen Blick darauf werfen, wie sie die APP-Struktur organisiert haben. Eine großartige Website enthält eine Erklärung für jeden Ordner in der Struktur.

  • Express.js Generator - 800 Sterne. Es gibt die großartige und einfache Vorlage, mit der Sie mit Express.js arbeiten können. Hier können Sie feststellen, wie sie Routen von der App trennen.

Übrigens haben so viele Entwickler Ihren Fall schon einmal bearbeitet, und Sie können ihn einfach teilen und aktualisieren.

  • Kioska . Sehen Sie, wie sie Ereignisse im events/Ordner in verschiedene Dateien aufteilen.

  • Ballons.io 2.3k Sterne. Leider haben sie den gesamten Socket-Server in einer Datei, aber Sie können die gesamte Struktur der App mit node.js und socket.io lernen


0

Wenn Sie nichts dagegen haben, können Sie jederzeit Typoskript lernen und https://nestjs.com/ aufrufen.

Wenn Sie bei JS bleiben möchten, empfehle ich dringend, die Zwiebelarchitektur zu verwenden. Die beste Vorgehensweise besteht darin, getrennte Geschäftslogik, Controller und sogar Bibliotheken beizubehalten (diese sollten in einige Klassen / Helfer eingeschlossen sein) - nur für den Fall, dass Sie in eine andere Bibliothek migrieren müssen (anderer CSV-Parser usw.).

Bei der Zwiebelarchitektur ist es Ihnen egal, woher die Anfragen kommen. Es werden nicht viele Änderungen vorgenommen, um auch nur einen Nachrichtenbroker hinzuzufügen.

Versuchen Sie auch dieses https://en.wikipedia.org/wiki/Domain-driven_design

ESLint kann bei der richtigen Projektorganisation helfen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.