85 votes

Comment organiser de grands projets Node.js

Quels sont les bons moyens d’organiser de grands projets Node.js?

Par exemple, une application utilisant à la fois express.js et socket.io? Cela comprend à la fois la structure logique de l'application et le système de fichiers.

Actuellement, je me retrouve à mettre une tonne de code dans un seul fichier maître js et à placer le code dans un objet global géant, et cela semble vilain.

100voto

Jason Sebring Points 4309

Un Exemple Les Débutants

J'aime l'objet d'une réponse, mais c'est raté pour les débutants qui veulent voir un simple exemple. Voici ce que j'aurais aimé avoir vu quelqu'un me montrer.

Prenons un scénario typique où vous utilisez express et que vous avez beaucoup de routes figurant sur votre app.js fichier. Son contenu devrait ressembler à quelque chose comme ceci:

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...

Vous pouvez imaginer si vous avez 50 pages, ce fichier peut être tout à fait hors de la main. Il serait bon de supprimer certains de ces interruptions de la app.js fichier.

Ce que vous voulez faire est de créer un "contrôleurs" dans le dossier de votre application de sorte que votre structure serait maintenant ressembler à ceci:

app.js
/controllers

Créer un fichier dans "/controllers" nommé "index.js" puis placez le code suivant.

/controllers/index.js

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

Couper et coller votre itinéraire inscriptions à partir de votre "app.js" fichier et le placer dans "/controllers/index.js" fichier.

Sur votre app.js fichier, supprimez votre parcours et à la place de faire le suivant.

app.js

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

Maintenant, si vous voulez avoir votre "/controllers/index.js" fichier peut également être scindée, nous allons ajouter un exemple de plus de sorte que vous pouvez voir comment Node.js vraiment agit comme une Poupée russe dans la façon dont son code peut être organisé.

Dans "/controllers" ajouter un fichier "accounts.js" et placer celui-ci en son sein.

/controllers/account.js

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

Maintenant dans votre "/controllers/index.js fichier, mettre une référence à "account.js"

/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);
}

Comme vous pouvez l'imaginer, vous pouvez garder la rupture des choses en plus petits et de plus petites pièces et mettre plus de dossiers dans des dossiers et de la référence à "exiger" si vous le souhaitez. Vous pouvez utiliser la même notion de "/lib" ou les fichiers de bibliothèque. "node_modules" est déjà cela.

C'est juste une des nombreuses raisons node.js est très agréable à programmer avec.

Mise à JOUR

Parce que j'ai utilisé l'exemple ci-dessus, j'ai voulu modifier le présent avec quelque chose que j'ai commencé à le faire quand il y a des tonnes de routes qui est assez efficace. Bien que cet exemple est bon à démontrer la poupée russe concept de maintenabilité avec "besoin", je voulais aussi ajouter que je suis en utilisant un concept avec un seul fichier de route de l'utiliser avec "besoin" et un fichier séparé(s) pour le contrôleur(s). La raison pour cela est que je peut utiliser le même contrôleur à plusieurs reprises par des voies différentes, donc mon "main" du code pour lier les deux, c'est juste une boucle for qui est plus simple. Par exemple:

/controllers
    index.js   (has controllers mapped in a lookup object)
    routes.js  (maps routes to controllers as a string lookup)

Au sein de routes.js ses comme

module.exports = [
{ path : '/', method : 'home' },
{ path : '/faq', method : 'content' },
{ verb : 'post', path : '/contact-us', method : 'contactus' },
{ path : /-lb$/, method : 'lightbox' },
{ path : '/customize', method : 'landing' },
    // etc  (very long)

Au sein de index.js

var controllers = {};
// add controllers as needed
controllers.home = function(req, res) {   
   // code
};  
controllers.content = function(req, res) {   
   // code
};
controllers.contactus = function(req, res) {   
   // code
};

// etc
// you could also have another file for more controllers like so:
// require('./account.js').set(controllers);

// then after declaring controllers, loop through routes to bind them
var i, verb;
for(i = 0; i < routes.length; i++) {
  verb = (routes[i].verb) ? routes[i].verb : 'get';
  app[verb](routes[i].path, controllers[routes[i].method]);
}

Vous pourriez quand même avoir vos contrôleurs de rompre avec "l'exigent" etc, mais je voulais juste montrer aux gens ce pour les routes que c'est agaçant quand il devient grand dans tous les sens.

35voto

David Ellis Points 4278

Je vous recommande de penser en termes de bibliothèques. npm est un excellent outil pour l'accaparement des bibliothèques, et de votre code probablement le fait tout le temps. Alors pourquoi ne pas regarder ce que vous écrivez, et pense que "ce que les parties de cette je préfère être require-ing une bibliothèque pour ce faire, à la place?

Ensuite, vous pouvez d'abord la recherche d'une telle bibliothèque, et vous avez soudainement coupé vers le bas sur le code que vous devez écrire. Si vous ne pouvez pas trouver une telle bibliothèque, vous pouvez écrire votre propre, et ensuite décider si oui ou non vous souhaitez publier sous la forme d'une bibliothèque open source, ou de le garder fermé.

Si vous avez, disons, assez complexe de l'objet que vous souhaitez utiliser dans votre code, mais pense que c'est trop personnalisé pour le site particulier, vous êtes en train de travailler pour être admissible à titre de bibliothèque, n'oubliez pas que vous pouvez toujours var myObj = require('./relative/path/to/javascript/file'); et déplacez-le dans son propre fichier pour travailler avec, vous permettant d'organiser votre code dans un mode similaire au C/C++/Java code, ainsi.

Mais encore une fois, le problème a été résolu dans aussi générique que possible, est préférable, car il encourage la réutilisation de code et test mieux de votre code (surtout si c'est open source et d'autres pourraient peut-être l'utiliser).

10voto

PuerkitoBio Points 4721

J'ai écrit un billet de blog sur ce sujet il y a quelques jours, et bien que l'article est en français, j'ai créé un dépôt GitHub (en anglais) pour montrer un exemple de fonctionnement de la structure que j'utilise.

Évidemment, il n'y a pas de réponse définitive à cette question, mais il est intéressant de voir ce que les autres font, et je suis preneuse d'autres avis sur le sujet (qui a également été discuté ici, où vous pouvez voir un résumé de ce que je propose).

2voto

Ryan Points 1323

Semblable à l'autre blog, j'ai écrit un spécifiquement sur l'organisation de Express applications. C'est la méthode que j'ai utilisé pendant environ un an et demi. Fondamentalement, organiser vos applications autour de votre entités de données ou tous autres éléments de base. Lieu logique pour chacun de ces éléments dans leurs propres répertoires. J'ai essayé d'emprunter beaucoup de Python.

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

1voto

David Guttman Points 11

Si vous souhaitez utiliser des fichiers distincts pour différents points de terminaison route / api, consultez la question suivante: Comment inclure des gestionnaires de routage dans plusieurs fichiers dans Express

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X