Conventions de dénomination des projets Node.js pour les fichiers et dossiers


116

Quelles sont les conventions de dénomination des fichiers et des dossiers dans un grand projet Node.js?

Dois-je capitaliser, camelCase ou sous-score?

C'est à dire. est-ce considéré comme valide?

project-name
    app
        controllers
            someThings.js
            users.js
        models
                someThing.js
                user.js
        views
            some-things
                index.jade
            users
                logIn.jade
                signUp.jade
    ...

3
Très subjective, votre structure de répertoires est la vôtre. Personnellement j'aime camelCase puisque c'est ce que je fais dans JS
Tchad

@Chad - dans Node.js, requireprend la chaîne de répertoire comme paramètre, c'est pourquoi elle n'est pas entièrement la vôtre. c'est à dire. require('../app/controllers/someThings');
Rudiger

3
Node ne spécifie aucune suggestion ou norme pour nommer les modules, du moment qu'ils sont des noms de fichier / répertoire valides et n'essayez pas de remplacer les noms de modules principaux . Pour ses propres modules, il utilise un mélange d'abréviation ( fs), de mot unique ( events), de soulignement ( child_process) et de minuscule ( querystring).
Jonathan Lonowski

1
@Rudiger Alors? Vous pouvez spécifier la chaîne de votre choix et la structure de répertoires souhaitée (à condition que vos noms soient des noms de fichiers valides bien sûr).
Chad

D'après ce que je peux dire de plus farfouillé des projets clés de voûte comme mocha noms de fichiers comme capitaine-super-file.js semblent être assez commun. C'est ce que je vais utiliser au moins!
Charles Ferentchak

Réponses:


154

Après quelques années avec node, je peux dire qu'il n'y a pas de conventions pour la structure répertoire / fichier. Cependant, la plupart des applications express (professionnelles) utilisent une configuration telle que:

/
  /bin - scripts, helpers, binaries
  /lib - your application
  /config - your configuration
  /public - your public files
  /test - your tests

Un exemple qui utilise cette configuration est nodejs-starter .

J'ai personnellement changé cette configuration en:

/
  /etc - contains configuration
  /app - front-end javascript files
    /config - loads config
    /models - loads models
  /bin - helper scripts
  /lib - back-end express files
    /config - loads config to app.settings
    /models - loads mongoose models
    /routes - sets up app.get('..')...
  /srv - contains public files
  /usr - contains templates
  /test - contains test files

À mon avis, ce dernier correspond mieux à la structure de répertoires de style Unix (alors que le premier mélange un peu cela).

J'aime aussi ce modèle pour séparer les fichiers:

lib / index.js

var http = require('http');
var express = require('express');

var app = express();

app.server = http.createServer(app);

require('./config')(app);

require('./models')(app);

require('./routes')(app);

app.server.listen(app.settings.port);

module.exports = app;

lib / static / index.js

var express = require('express');

module.exports = function(app) {

  app.use(express.static(app.settings.static.path));

};

Cela permet de découpler parfaitement tout le code source sans avoir à déranger les dépendances. Une très bonne solution pour lutter contre le mauvais Javascript. Un exemple du monde réel est à proximité qui utilise cette configuration.

Mise à jour (noms de fichiers):

En ce qui concerne les noms de fichiers , les noms de fichiers courts et minuscules sont les plus courants . Si votre fichier ne peut être décrit qu'avec deux mots, la plupart des projets JavaScript utilisent un trait de soulignement comme délimiteur.

Mise à jour (variables):

Concernant les variables, les mêmes «règles» s'appliquent que pour les noms de fichiers. Cependant, les prototypes ou les classes doivent utiliser camelCase .

Mise à jour (guides de style):


27
Comme votre réponse est intéressante et bien faite, c'est hors sujet, le créateur du sujet a spécifiquement demandé une convention de dénomination et non pas pour les structures de répertoires. Lorsque nous arrivons à ce sujet, nous nous attendons à savoir si les fichiers sont mieux nommés avec des tirets, des traits de soulignement ou camelCase. Je voterai pour, si cela est ajouté à cette réponse.
Tronix117

3
@ Tronix117 quel est le problème? La question demande "les conventions de dénomination des projets pour les fichiers et dossiers?" et la dénomination n'est pas limitée au nom de fichier car elle inclut également le nom de chemin complet.
bodokaiser

24
bien sûr, mais l'auteur demande spécifiquement "Dois-je capitaliser, camelCase ou sous-score?". Quand il écrit son exemple, il met explicitement «someThings» et «some-things» juste pour savoir s'il peut être considéré comme valide. Quand je suis allé sur ce sujet, je m'attendais à avoir la réponse à cette question spécifique et à savoir ce qui est habituellement utilisé comme nom de fichier. Je ne dis pas que votre réponse est fausse, elle est parfaite pour son objectif, mais incomplète dans mon esprit car il ne répond pas vraiment à la question principale.
Tronix117

5
Je pense que vous m'avez mal compris ;). Je cherchais juste quelque chose que je n'ai pas trouvé sur la réponse acceptée, mais qui a été spécifiquement demandé, ne répandant aucune haine, vous allez un peu loin sur celui-ci. Je voulais juste que vous ajoutiez quelques informations à ce sujet dans la réponse, afin que les personnes qui chercheront cela à l'avenir ne se retrouvent pas dans une impasse.
Tronix117

3
@ Tronix117 En fait, c'est précisément pourquoi je me suis retrouvé sur cette page en train de lire cette réponse. J'espérais non seulement la structure des répertoires, mais surtout les conventions de nom (tirets, traits de soulignement, camelCase, TitleCase, etc ...). Malheureusement, la réponse ne la contient toujours pas, et il semble que je bodokaiserprenne les choses trop personnellement pour que j'intervienne et que je demande que son opinion à ce sujet soit ajoutée à sa réponse (comme l'OP l'a initialement demandé dans leur question) ( toux, toux ).
Pivoter le

97

À utiliser kebab-casepour tous les noms de package, de dossier et de fichier.

Pourquoi?

Vous devriez imaginer que n'importe quel dossier ou fichier pourrait être extrait un jour dans son propre package. Les packages ne peuvent pas contenir de lettres majuscules.

Les nouveaux packages ne doivent pas comporter de lettres majuscules dans le nom. https://docs.npmjs.com/files/package.json#name

Par conséquent, camelCasene doit jamais être utilisé. Cela laisse snake_caseet kebab-case.

kebab-caseest de loin la convention la plus courante aujourd'hui. La seule utilisation des traits de soulignement concerne les packages de nœuds internes, et il s'agit simplement d'une convention des premiers jours.


2
vous avez oublié le point? comme socket.io
Roee

1
.2c, pourrait faire une automatisation simple de kebab-case à kebabCase dans n'importe quel script ou application dans n'importe quelle langue en utilisant regex - faites-le tout le temps 🙃
rob2d

63

Il n'y a pas de conventions. Il existe une structure logique.

La seule chose que je puisse dire: n'utilisez jamais de noms de fichiers et de répertoires camelCase. Pourquoi? Cela fonctionne mais sur Mac et Windows, il n'y a pas de différence entre someAction et certaines actions. J'ai rencontré ce problème, et pas une seule fois. J'ai besoin d'un fichier comme celui-ci:

var isHidden = require('./lib/isHidden');

Mais malheureusement , je créé un fichier avec plein de minuscules: lib/ishidden.js. Cela a fonctionné pour moi sur mac. Cela a bien fonctionné sur le mac de mon collègue. Les tests s'exécutent sans erreur. Après le déploiement, nous avons eu une énorme erreur:

Error: Cannot find module './lib/isHidden'

Oh oui. C'est une boîte Linux. La structure des répertoires de camelCase peut donc être dangereuse. C'est suffisant pour un collègue qui développe sous Windows ou Mac.

Utilisez donc le séparateur de soulignement (_) ou de tiret (-) si vous en avez besoin.


4
+1, ajoutez le fait que renommer les dossiers sensibles à la casse dans git sur un système non-cs est un véritable problème.
max

4
Je ne comprends pas vraiment le problème avec camelCase ici. Le problème ne serait-il pas résolu en nommant le fichier correctement en premier lieu (lib / isHidden.js)?
Mike

Hey Mike, le fait est que camelCase va s'arrêter lors du déploiement sur certains systèmes. Je ne savais pas pourquoi mes répertoires recevaient tous des 404 lorsque j'ai déployé depuis Mac sur une machine Linux avec un package nommé "groupPages". J'ai dû passer aux pages de groupe pour réparer les choses.
tempranova

3
Pire encore: créez une version camelcase d'un nom de fichier et demandez à un collègue imprudent de créer une version minuscule dans le même répertoire. Maintenant, faites une vérification dans un système d'exploitation non sensible à la casse et essayez de comprendre pourquoi votre application ne fonctionne pas. Et oui, c'est arrivé.
L0LN1NJ4

J'aime cette réponse, mais je tiens à souligner que le tiret (-) peut également avoir des problèmes. Par exemple, en utilisant le framework de test Nighwatch, j'ai créé un objet de page nommé admin-login.js. Ensuite, j'ai essayé d'y accéder à partir du script de test en utilisant const loginPage = browser.page.admin-login(). J'ai eu une erreur ReferenceError: login is not defined. L'utilisation du trait de soulignement (_) pour le nom de fichier a résolu le problème. Je peux également imaginer que l'utilisation de noms de fichiers avec un tiret en ligne de commande peut également entraîner des problèmes. Par conséquent, je dirais que le trait de soulignement est le séparateur le plus sûr pour les noms de fichiers en général.
Dragan Nikolic

15

Basé sur " Google JavaScript Style Guide "

Les noms de fichiers doivent être tous en minuscules et peuvent inclure des traits de soulignement (_) ou des tirets (-), mais pas de ponctuation supplémentaire. Suivez la convention utilisée par votre projet. L'extension des noms de fichiers doit être .js.


3

La plupart des gens utilisent camelCasedans JS. Si vous souhaitez ouvrir quelque chose en open-source, je vous suggère d'utiliser celui-ci :-)


Certains projets, tels que Locomotive.js, utilisent camelCasepour les fichiers de contrôleur. :-) Ça dépend. J'ai tendance à utiliser PascalCasepour les fichiers de type classe.
Mathieu Amiot

@yitsushi semble soulever un problème avec la dénomination des cas de chameau (et pascal), si vous voulez créer des modules portables, l'étui de chameau semble sûrement une mauvaise idée?
gumaflux

0

Node.js n'applique aucune convention de dénomination de fichier (sauf index.js). Et le langage Javascript en général non plus. Vous pouvez trouver des dizaines de fils ici qui suggèrent camelCase, traits d'union et traits de soulignement, qui fonctionnent parfaitement bien. C'est à vous de répondre. Choisissez-en un et respectez-le.


1
Ce n'est pas vraiment ce que le nœud 'applique', veuillez lire ceci: nodejs.org/api/modules.html#modules_folders_as_modules
moka

0

Selon moi: pour les fichiers, utilisez la casse inférieure du chameau si module.exports est un objet, je veux dire un module singleton. Cela s'applique également aux fichiers JSON car ils sont également d'une seule tonne. Utilisez la casse supérieure du camel si module.exports renvoie une fonction constructeur où elle agit comme une classe.

Pour les dossiers, utilisez des noms courts. S'il est nécessaire d'avoir plusieurs mots, laissez-les complètement en minuscules séparés par "-" afin que cela fonctionne de manière cohérente sur toutes les plates-formes.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.