J'utilise le framework Web ExpressJS pour NodeJS.
Les personnes utilisant ExpressJS mettent leurs environnements (développement, production, test ...), leurs itinéraires etc sur le app.js
. Je pense que ce n'est pas une belle façon car lorsque vous avez une grosse application, app.js est trop gros!
Je voudrais avoir cette structure de répertoires:
| my-application
| -- app.js
| -- config/
| -- environment.js
| -- routes.js
Voici mon code:
app.js
var express = require('express');
var app = module.exports = express.createServer();
require('./config/environment.js')(app, express);
require('./config/routes.js')(app);
app.listen(3000);
config / environment.js
module.exports = function(app, express){
app.configure(function() {
app.use(express.logger());
});
app.configure('development', function() {
app.use(express.errorHandler({
dumpExceptions: true,
showStack: true
}));
});
app.configure('production', function() {
app.use(express.errorHandler());
});
};
config / routes.js
module.exports = function(app) {
app.get('/', function(req, res) {
res.send('Hello world !');
});
};
Mon code fonctionne bien et je pense que la structure des répertoires est magnifique. Cependant, le code a dû être adapté et je ne suis pas sûr qu'il soit bon / beau.
Est-il préférable d'utiliser ma structure de répertoires et d'adapter le code ou d'utiliser simplement un fichier (app.js)?
Merci pour vos conseils!
Réponses:
OK, cela fait un moment et c'est une question populaire, alors j'ai continué et créé un référentiel github d'échafaudage avec du code JavaScript et un long README sur la façon dont j'aime structurer une application express.js de taille moyenne.
focusaurus / express_code_structure est le dépôt avec le dernier code pour cela. Les demandes de tirage sont les bienvenues.
Voici un instantané du fichier README puisque stackoverflow n'aime pas les réponses d'un simple lien. Je ferai quelques mises à jour car c'est un nouveau projet que je continuerai à mettre à jour, mais finalement le repo github sera le lieu à jour pour cette information.
Structure de code express
Ce projet est un exemple de la façon d'organiser une application Web express.js de taille moyenne.
Actuel au moins express v4.14 décembre 2016
Quelle est la taille de votre application?
Les applications Web ne sont pas toutes les mêmes, et il n'y a pas, à mon avis, une structure de code unique qui devrait être appliquée à toutes les applications express.js.
Si votre application est petite, vous n'avez pas besoin d'une structure de répertoire aussi profonde que celle illustrée ici. Restez simple et collez une poignée de
.js
fichiers à la racine de votre référentiel et vous avez terminé. Voilà.Si votre application est énorme, vous devez à un moment donné la diviser en packages npm distincts. En général, l'approche node.js semble favoriser de nombreux petits packages, au moins pour les bibliothèques, et vous devez créer votre application en utilisant plusieurs packages npm car cela commence à avoir un sens et à justifier la surcharge. Donc, à mesure que votre application se développe et qu'une partie du code devient clairement réutilisable en dehors de votre application ou est un sous-système clair, déplacez-le vers son propre référentiel git et transformez-le en un package npm autonome.
L' objectif de ce projet est donc d'illustrer une structure viable pour une application de taille moyenne.
Quelle est votre architecture globale
Il existe de nombreuses approches pour créer une application Web, telles que
Chacun d'entre eux s'intègre parfaitement dans une structure de répertoires différente. Pour les besoins de cet exemple, il s'agit simplement d'un échafaudage et non d'une application pleinement fonctionnelle, mais j'assume les points d'architecture clés suivants:
Et qu'en est-il de Ruby on Rails?
Ce sera un thème tout au long de ce projet que de nombreuses idées incarnées dans Ruby on Rails et les décisions "Convention sur la configuration" qu'ils ont adoptées, bien qu'elles soient largement acceptées et utilisées, ne sont en fait pas très utiles et sont parfois à l'opposé de ce que ce référentiel recommande.
Mon point principal ici est qu'il existe des principes sous-jacents à l'organisation du code, et sur la base de ces principes, les conventions Ruby on Rails ont un sens (principalement) pour la communauté Ruby on Rails. Cependant, le simple fait de réfléchir inconsciemment à ces conventions passe à côté. Une fois que vous aurez maîtrisé les principes de base, TOUS vos projets seront bien organisés et clairs: scripts shell, jeux, applications mobiles, projets d'entreprise, même votre répertoire personnel.
Pour la communauté Rails, ils veulent pouvoir faire passer un seul développeur Rails d'une application à une autre et être familier et à l'aise avec chaque fois. Cela a beaucoup de sens si vous êtes 37 signaux ou Pivotal Labs, et présente des avantages. Dans le monde JavaScript côté serveur, la philosophie globale est bien plus farfelue, et nous n'avons pas vraiment de problème avec cela. Voilà comment nous roulons. Nous y sommes habitués. Même dans express.js, c'est un proche parent de Sinatra, pas Rails, et prendre des conventions de Rails n'aide généralement rien. Je dirais même principes sur convention sur configuration .
Principes et motivations sous-jacents
app/node_modules
répertoire et ont despackage.json
fichiers dans les répertoires du proto-module pour faciliter cette transition et servir de rappel.app
répertoire, vous pouvez donccd
y exécuter run / grep / xargs / ag / ack / etc et ne pas être distrait par des correspondances tierceskebab-case
même si le nom de variable pour cela en JavaScript doit êtrecamelCase
parce que-
c'est un signe moins en JavaScript.kebab-case
transformé encamelCase
app/views
,app/controllers
,app/models
, etc.routes.rb
fichier de style rails est pratique si vous voulez un aperçu de tous les itinéraires dans l'application, mais lorsque vous créez des fonctionnalités et corrigez des bugs, vous ne vous souciez que des itinéraires pertinents pour la pièce que vous modifiez.app/users
car il n'y a pas un nid de logique métier couplée partout polluant la pureté de la base de code utilisateur.app/server.js:1
et vous pouvez voir tout ce qu'elle charge et exécute en suivant le code.magicRESTRouter.route(somecontroller, {except: 'POST'})
est une grande victoire pour vous sur 3 de baseapp.get
,app.put
,app.del
, les appels, vous êtes probablement construire une application monolithique qui est trop grand pour travailler efficacement. Obtenez fantaisie pour de GRANDES victoires, pas pour convertir 3 lignes simples en 1 ligne complexe.Utiliser des noms de fichiers en minuscules
Spécificités express.js
Ne pas utiliser
app.configure
. C'est presque entièrement inutile et vous n'en avez tout simplement pas besoin. C'est dans beaucoup de passe-partout en raison de copypasta stupide.app.use
pour l'ensemble de votre application si vous n'avez vraiment besoin que de ce middleware pour 2 routes (je vous regarde,body-parser
)server.js
et il sera clair comment ils sont commandés. Pour une application de taille moyenne, décomposer les choses en modules de routes séparés est bien, mais cela introduit un péril de middleware hors serviceL'astuce du lien symbolique de l'application
Il existe de nombreuses approches décrites et discutées longuement par la communauté dans le grand fond mieux chemins exigent locale () pour Node.js . Je vais peut-être bientôt décider de préférer soit "traiter avec beaucoup de ../../../ .." ou utiliser le module requireFrom. Cependant, pour le moment, j'utilise l'astuce de lien symbolique détaillée ci-dessous.
Donc, une façon d'éviter l'intra-projet nécessite des chemins relatifs ennuyeux comme
require("../../../config")
d'utiliser l'astuce suivante:.gitignore
fichiervar config = require("app/config");
var DealModel = require("app/deals/deal-model")
;Configuration
Généralement, codez les modules et les classes pour qu'ils n'attendent qu'un
options
objet JavaScript de base transmis. Seulapp/server.js
doit charger leapp/config.js
module. À partir de là, il peut synthétiser de petitsoptions
objets pour configurer les sous-systèmes selon les besoins, mais coupler chaque sous-système à un grand module de configuration global plein d'informations supplémentaires est un mauvais couplage.Essayez de centraliser la création de connexions de base de données et de les transmettre aux sous-systèmes plutôt que de passer des paramètres de connexion et de demander aux sous-systèmes d'établir eux-mêmes les connexions sortantes.
NODE_ENV
Ceci est une autre idée séduisante mais terrible transmise par Rails. Il devrait y avoir exactement 1 place dans votre application,
app/config.js
qui examine laNODE_ENV
variable d'environnement. Tout le reste doit prendre une option explicite comme argument de constructeur de classe ou paramètre de configuration de module.Si le module de messagerie a une option sur la façon de livrer des e-mails (SMTP, connectez-vous à stdout, mettez en file d'attente, etc.), il devrait prendre une option comme
{deliver: 'stdout'}
mais il ne devrait absolument pas vérifierNODE_ENV
.Les tests
Je garde maintenant mes fichiers de test dans le même répertoire que leur code correspondant et j'utilise les conventions de dénomination des extensions de nom de fichier pour distinguer les tests du code de production.
foo.js
a le code du module "foo"foo.tape.js
a les tests basés sur les nœuds pour foo et vit dans le même dirfoo.btape.js
peut être utilisé pour les tests qui doivent s'exécuter dans un environnement de navigateurJ'utilise des globes de système de fichiers et la
find . -name '*.tape.js'
commande pour accéder à tous mes tests si nécessaire.Comment organiser le code dans chaque
.js
fichier de moduleLa portée de ce projet concerne principalement la destination des fichiers et des répertoires, et je ne veux pas ajouter beaucoup d'autre portée, mais je mentionnerai simplement que j'organise mon code en 3 sections distinctes.
la source
MISE À JOUR (29/10/2013) : Veuillez également consulter mon autre réponse qui a JavaScript au lieu de CoffeeScript à la demande générale ainsi qu'un référentiel github standard et un README détaillé détaillant mes dernières recommandations sur ce sujet.
Config
Ce que tu fais est bien. J'aime avoir mon propre espace de noms de configuration dans un
config.coffee
fichier de niveau supérieur avec un espace de noms imbriqué comme celui-ci.C'est convivial pour l'édition sysadmin. Ensuite, quand j'ai besoin de quelque chose, comme les informations de connexion DB, c'est
Routes / Contrôleurs
J'aime laisser mes itinéraires à mes contrôleurs et les organiser dans un
app/controllers
sous-répertoire. Ensuite, je peux les charger et les laisser ajouter toutes les routes dont ils ont besoin.Dans mon
app/server.coffee
fichier coffeescript, je fais:J'ai donc des fichiers comme:
Et par exemple dans mon contrôleur de domaine, j'ai une
setup
fonction comme celle-ci.Vues
Mettre des points de vue
app/views
devient le lieu habituel. Je le présente comme ça.Fichiers statiques
Allez dans un
public
sous - répertoire.Github / Semver / NPM
Placez un fichier de démarque README.md à votre racine git repo pour github.
Placez un fichier package.json avec un numéro de version sémantique dans votre racine git repo pour NPM.
la source
app.put route, api.needId
Go
et inclus lebin
fichier dans la structure. Comment exécutez-vous cego
fichierbin
?Ce qui suit est la réponse textuellement de Peter Lyons, porté sur vanilla JS de Coffeescript, comme demandé par plusieurs autres. La réponse de Peter est très compétente, et toute personne qui vote sur ma réponse devrait également voter sur la sienne.
Config
Ce que tu fais est bien. J'aime avoir mon propre espace de noms de configuration dans un
config.js
fichier de niveau supérieur avec un espace de noms imbriqué comme celui-ci.C'est convivial pour l'édition sysadmin. Ensuite, quand j'ai besoin de quelque chose, comme les informations de connexion DB, c'est
Routes / Contrôleurs
J'aime laisser mes itinéraires à mes contrôleurs et les organiser dans un
app/controllers
sous-répertoire. Ensuite, je peux les charger et les laisser ajouter toutes les routes dont ils ont besoin.Dans mon
app/server.js
fichier javascript je fais:J'ai donc des fichiers comme:
Et par exemple dans mon contrôleur de domaine, j'ai une
setup
fonction comme celle-ci.Vues
Mettre des points de vue
app/views
devient le lieu habituel. Je le présente comme ça.Fichiers statiques
Allez dans un
public
sous - répertoire.Github / Semver / NPM
Placez un fichier de démarque README.md à votre racine git repo pour github.
Placez un fichier package.json avec un numéro de version sémantique dans votre racine git repo pour NPM.
la source
Ma question a été introduite en avril 2011, elle est calme depuis longtemps. Pendant ce temps, j'ai pu améliorer mon expérience avec Express.js et comment l'architecture d'une application écrite à l'aide de cette bibliothèque. Je partage donc ici mon expérience.
Voici ma structure de répertoire:
App.js
Le but du
app.js
fichier est d'amorcer l'application expressjs. Il charge le module de configuration, le module d'enregistreur, attend la connexion à la base de données, ... et exécute le serveur express.itinéraires /
Le répertoire des routes a un
index.js
fichier. Son objectif est d'introduire une sorte de magie pour charger tous les autres fichiers dans leroutes/
répertoire. Voici l'implémentation:Avec ce module, créer une nouvelle définition et implémentation de route est vraiment facile. Pour des exemples,
hello.js
:Chaque module de route est autonome .
la source
J'aime utiliser une "application" globale, plutôt que d'exporter une fonction, etc.
la source
Je pense que c'est une excellente façon de le faire. Non limité à exprimer, mais j'ai vu un certain nombre de projets node.js sur github faire la même chose. Ils suppriment les paramètres de configuration + les modules plus petits (dans certains cas, chaque URI) sont pris en compte dans des fichiers séparés.
Je recommanderais de passer par des projets spécifiques à express sur github pour avoir une idée. IMO la façon dont vous faites est correcte.
la source
c'est maintenant fin 2015 et après avoir développé ma structure pendant 3 ans et en petits et grands projets. Conclusion?
Ne faites pas un grand MVC, mais séparez-le en modules
Donc...
Pourquoi?
Habituellement, on travaille sur un module (par exemple, les produits), que vous pouvez modifier indépendamment.
Vous êtes capable de réutiliser des modules
Vous pouvez le tester séparément
Vous pouvez le remplacer séparément
Ils ont des interfaces claires (stables)
-Au plus tard, si plusieurs développeurs travaillaient, la séparation des modules aide
Le projet nodebootstrap a une approche similaire à ma structure finale. ( github )
À quoi ressemble cette structure?
Petits modules capsulés , chacun avec MVC séparé
Chaque module a un package.json
Test dans le cadre de la structure (dans chaque module)
Configuration globale , bibliothèques et services
Docker intégré, cluster, pour toujours
Présentation du dossier (voir le dossier lib pour les modules):
la source
Je donne la structure de dossier de style MVC, veuillez trouver ci-dessous.
Nous avons utilisé la structure de dossiers ci-dessous pour nos applications Web grandes et moyennes.
J'ai créé un module npm pour la structuration de dossiers mvc express de génération.
Veuillez trouver le https://www.npmjs.com/package/express-mvc-generator ci-dessous
Des étapes simples pour générer et utiliser ces modules.
i) installer le module
npm install express-mvc-generator -g
ii) vérifier les options
express -h
iii) Générer une structure mvc express
express myapp
iv) Installer les dépendances
npm install
::v) Ouvrez votre config / database.js, veuillez configurer votre mongo db.
vi) Exécutez l'application
node app
ounodemon app
vii) Vérifiez l'URL http: // localhost: 8042 / signup OU http: // yourip: 8042 / signup
la source
Cela fait un bon moment depuis la dernière réponse à cette question et Express a également récemment publié la version 4, qui a ajouté quelques éléments utiles pour organiser la structure de votre application.
Vous trouverez ci-dessous un long article de blog à jour sur les meilleures pratiques pour structurer votre application Express. http://www.terlici.com/2014/08/25/best-practices-express-structure.html
Il existe également un référentiel GitHub appliquant les conseils de l'article. Il est toujours à jour avec la dernière version Express.
https://github.com/terlici/base-express
la source
Je ne pense pas que ce soit une bonne approche pour ajouter des routes à la configuration. Une meilleure structure pourrait être quelque chose comme ceci:
Ainsi, products.js et users.js contiendront toutes vos routes et toute la logique à l'intérieur.
la source
Eh bien, je mets mes itinéraires sous forme de fichier json, que j'ai lu au début, et dans une boucle for dans app.js, j'ai configuré les itinéraires. Le fichier route.json inclut la vue à appeler et la clé des valeurs qui seront envoyées à la route.
Cela fonctionne pour de nombreux cas simples, mais j'ai dû créer manuellement des itinéraires pour des cas spéciaux.
la source
J'ai écrit un article exactement à ce sujet. Il utilise essentiellement un
routeRegistrar
qui itère dans les fichiers du dossier/controllers
appelant sa fonctioninit
. La fonctioninit
prend laapp
variable express comme paramètre afin que vous puissiez enregistrer vos itinéraires comme vous le souhaitez.la source
Cela peut être intéressant:
https://github.com/flatiron/nconf
la source
1) Votre système de fichiers de projet Express peut ressembler à:
app.js - votre conteneur d'applications global
2) Fichier principal du module (lib / mymodule / index.js):
3) Connectez le module dans app.js principal
4) Exemple de logique
tj dit / montre sur Vimeo une idée intéressante comment modulariser une application express - Applications web modulaires avec Node.js et Express . Puissant et simple.
la source
http://locomotivejs.org/ fournit un moyen de structurer une application construite avec Node.js et Express.
Depuis le site Web:
la source
J'ai récemment adopté des modules en tant que mini-applications indépendantes.
Maintenant, pour tout routage de module (# .js), les vues (* .ejs), js, css et assets sont côte à côte. le routage des sous-modules est configuré dans le parent # .js avec deux lignes supplémentaires
De cette façon, même des sous-modules sont possibles.
N'oubliez pas de définir la vue dans le répertoire src
la source
Voici à quoi ressemble la plupart de ma structure de répertoire de projet express.
Je fais habituellement un
express dirname
pour initialiser le projet, pardonnez ma paresse, mais c'est très flexible et extensible. PS - vous devez vous en procurerexpress-generator
(pour ceux qui le recherchentsudo npm install -g express-generator
, sudo parce que vous l'installez mondialement)Vous devez vous demander pourquoi les fichiers .env? Parce qu'ils fonctionnent! J'utilise le
dotenv
module dans mes projets (beaucoup récemment) et ça marche! Insérez ces 2 déclarations dansapp.js
ouwww
Et une autre ligne à définir rapidement
/bower_components
pour diffuser du contenu statique sous la ressource/ext
Cela peut probablement convenir aux personnes qui cherchent à utiliser Express et Angular ensemble, ou tout simplement à exprimer sans cette
javascripts
hiérarchie bien sûr.la source
Ma structure express 4. https://github.com/odirleiborgert/borgert-express-boilerplate
Paquets
Structure
la source
Un moyen simple de structurer votre application express:
Dans index.js principal, l'ordre suivant doit être conservé.
la source
Meilleur moyen de structure MVC pour le projet ExpressJs avec guidon et Passportjs
la source