Convenzioni di denominazione dei progetti Node.js per file e cartelle


116

Quali sono le convenzioni di denominazione per file e cartelle in un grande progetto Node.js?

Devo scrivere in maiuscolo, camelCase o under-score?

Vale a dire. è considerato valido?

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

3
Altamente soggettivo, la struttura della tua directory è tua. Personalmente mi piace camelCase poiché è quello che faccio in JS
Chad

@Chad - in Node.js, requireprende la stringa della directory come parametro, motivo per cui non è interamente tua. vale a dire. require('../app/controllers/someThings');
Rudiger

3
Il nodo non specifica alcun suggerimento o standard per la denominazione dei moduli, purché siano nomi di file / directory validi e non provi a sovrascrivere i nomi dei moduli principali . Per i propri moduli, utilizza una combinazione di abbreviated ( fs), single-word ( events), underscored ( child_process) e lowercase ( querystring).
Jonathan Lonowski

1
@Rudiger So? Puoi specificare la stringa che desideri e la struttura della directory che desideri (a condizione che i tuoi nomi siano nomi di file validi, ovviamente).
Ciad

Da quello che posso dire dal curiosare tra i progetti più chiave di volta come i nomi di file mocha come captain-awesome-file.js sembrano essere abbastanza comuni. Almeno questo è quello che userò!
Charles Ferentchak

Risposte:


154

Dopo alcuni anni con nodo, posso dire che non ci sono nessun convenzioni per la struttura di directory / file. Tuttavia, la maggior parte delle applicazioni express (professionali) utilizza una configurazione come:

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

Un esempio che utilizza questa configurazione è nodejs-starter .

Ho personalmente modificato questa configurazione in:

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

A mio parere, il secondo corrisponde meglio alla struttura delle directory in stile Unix (mentre il primo lo confonde un po ').

Mi piace anche questo modello per separare i file:

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 / statico / index.js

var express = require('express');

module.exports = function(app) {

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

};

Ciò consente di disaccoppiare ordinatamente tutto il codice sorgente senza doversi preoccupare delle dipendenze. Un'ottima soluzione per combattere i cattivi Javascript. Un esempio del mondo reale è nelle vicinanze che utilizza questa configurazione.

Aggiorna (nomi file):

Per quanto riguarda i nomi di file, i più comuni sono i nomi di file brevi e minuscoli . Se il tuo file può essere descritto solo con due parole, la maggior parte dei progetti JavaScript utilizza un trattino basso come delimitatore.

Aggiorna (variabili):

Per quanto riguarda le variabili, valgono le stesse "regole" dei nomi dei file. I prototipi o le classi, tuttavia, dovrebbero utilizzare camelCase .

Aggiornamento (styleguides):


27
Quanto è interessante e ben fatta la tua risposta, è fuori tema, il creatore dell'argomento ha chiesto specificamente la convenzione di denominazione non per le strutture di directory. Quando arriviamo a questo argomento, ci aspettiamo di sapere se i file sono meglio denominati con trattini, trattini bassi o camelCase. Voterò a favore, se questo viene aggiunto a questa risposta.
Tronix117

3
@ Tronix117 qual è il problema? La domanda chiede "convenzioni di denominazione del progetto per file e cartelle?" e la denominazione non è limitata al nome del file in quanto include anche il nome del percorso completo.
bodokaiser

24
certo, ma l'autore chiede espressamente "Devo scrivere in maiuscolo, camelCase o under-score?". Quando scrive il suo esempio, ha messo esplicitamente "alcune cose" e "alcune cose" solo per sapere se può essere considerato valido. Quando sono passato a questo argomento mi aspettavo di avere la risposta a questa domanda specifica e di sapere cosa viene solitamente utilizzato come denominazione dei file. Non dico che la tua risposta sia sbagliata, è perfetta per il suo scopo, ma incompleta nella mia mente perché lui non risponde veramente alla domanda principale.
Tronix117

5
Penso che tu mi abbia frainteso ;). Stavo solo cercando qualcosa che non ho trovato nella risposta accettata, ma mi è stato chiesto specificamente, non diffondendo odio di alcun tipo, stai andando un po 'lontano su questo. Volevo solo che aggiungessi alcune informazioni in merito alla risposta, in modo che le persone che lo cercheranno in futuro non finiranno in un vicolo cieco.
Tronix117

3
@ Tronix117 In realtà, questo è esattamente il motivo per cui mi sono trovato in questa pagina a leggere questa risposta. Speravo non solo nella struttura delle directory, ma soprattutto nelle convenzioni sui nomi (trattini, trattini bassi, camelCase, TitleCase, ecc ...). Sfortunatamente, la risposta ancora non lo contiene, e sembra che bodokaiserstia prendendo le cose troppo sul personale per farmi intervenire e chiedere che la sua opinione su questo sia aggiunta alla sua risposta (come l'OP ha inizialmente chiesto nella loro domanda) ( tosse tosse ).
Girevole

97

Utilizzare kebab-caseper tutti i nomi di pacchetti, cartelle e file.

Perché?

Dovresti immaginare che un giorno qualsiasi cartella o file potrebbe essere estratto nel proprio pacchetto. I pacchetti non possono contenere lettere maiuscole.

I nuovi pacchetti non devono contenere lettere maiuscole nel nome. https://docs.npmjs.com/files/package.json#name

Pertanto, camelCasenon dovrebbe mai essere utilizzato. Questo lascia snake_casee kebab-case.

kebab-caseè di gran lunga la convenzione più comune oggi. L'unico uso di trattini bassi è per i pacchetti di nodi interni, e questa è semplicemente una convenzione dei primi giorni.


2
hai dimenticato il punto? come socket.io
Roee

1
.2c, potrebbe fare una semplice automazione da kebab-case a kebabCase in qualsiasi script o app in qualsiasi lingua usando regex - fallo sempre 🙃
rob2d

63

Non ci sono convenzioni. Ci sono alcune strutture logiche.

L'unica cosa che posso dire: non usare mai nomi di file e directory camelCase. Perché? Funziona ma su Mac e Windows non ci sono differenze tra alcune azioni e alcune azioni. Ho incontrato questo problema, e non una volta. Ho bisogno di un file come questo:

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

Ma purtroppo ho creato un file con pieno di minuscole: lib/ishidden.js. Ha funzionato per me su Mac. Ha funzionato bene sul Mac del mio collega. I test vengono eseguiti senza errori. Dopo la distribuzione abbiamo ricevuto un errore enorme:

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

O si. È una scatola Linux. Quindi la struttura delle directory camelCase potrebbe essere pericolosa. È sufficiente per un collega che sta sviluppando su Windows o Mac.

Quindi usa il carattere di sottolineatura (_) o il trattino (-) se necessario.


4
+1, aggiungi il fatto che rinominare le cartelle con distinzione tra maiuscole e minuscole in git su un sistema non CS è una vera seccatura.
max

4
Non capisco davvero il problema con camelCase qui. Il problema non sarebbe stato risolto nominando il file correttamente in primo luogo (lib / isHidden.js)?
Mike

Ehi Mike, il punto è che camelCase si interromperà durante la distribuzione su alcuni sistemi. Ero confuso sul motivo per cui le mie directory ricevevano tutti i 404 quando ho distribuito da Mac su una macchina Linux con un pacchetto chiamato "groupPages". Ho dovuto passare alle pagine di gruppo per sistemare le cose.
tempranova

3
Peggio ancora: crea una versione camelcase di un nome file e chiedi a un collega sbadato di creare una versione minuscola nella stessa directory. Ora fai un controllo in un sistema operativo non sensibile al maiuscolo / minuscolo e prova a capire perché diavolo la tua applicazione non funziona. E sì, è successo.
L0LN1NJ4

Mi piace questa risposta, tuttavia voglio sottolineare che anche il trattino (-) potrebbe avere alcuni problemi. Ad esempio, utilizzando il framework di test Nighwatch ho creato un oggetto pagina denominato admin-login.js. Quindi ho provato ad accedervi dallo script di test usando const loginPage = browser.page.admin-login(). Ho un errore ReferenceError: login is not defined. L'uso del carattere di sottolineatura (_) per il nome del file ha risolto il problema. Posso anche immaginare che l'utilizzo di nomi di file con trattino nella riga di comando possa anche portare ad alcuni problemi. Pertanto, direi che il carattere di sottolineatura è il separatore più sicuro per i nomi di file in generale.
Dragan Nikolic

15

Basato sulla " Guida allo stile di Google JavaScript "

I nomi dei file devono essere tutti minuscoli e possono includere trattini bassi (_) o trattini (-), ma non punteggiatura aggiuntiva. Segui la convenzione utilizzata dal tuo progetto. L'estensione dei nomi dei file deve essere .js.


3

La maggior parte delle persone usa camelCasein JS. Se vuoi rendere open source qualcosa, ti consiglio di usare questo :-)


Alcuni progetti, come Locomotive.js, utilizzano i camelCasefile del controller. :-) Dipende solo. Tendo a usare PascalCaseper file di classe.
Mathieu Amiot

@yitsushi sembra sollevare un bel problema con la denominazione dei casi di cammello (e pascal), se vuoi creare moduli portatili il caso di cammello sembra sicuramente una cattiva idea?
gumaflux

0

Node.js non applica alcuna convenzione di denominazione dei file (tranne index.js). E nemmeno il linguaggio Javascript in generale. Puoi trovare dozzine di thread qui che suggeriscono camelCase, trattini e trattini bassi, ognuno dei quali funziona perfettamente. Quindi sta a te. Scegline uno e resta fedele.


1
In realtà non è ciò che il nodo 'impone', per favore leggi questo: nodejs.org/api/modules.html#modules_folders_as_modules
moka

0

Secondo me: per i file, usa minuscolo camel se module.exports è un oggetto, intendo un modulo singleton. Questo è applicabile anche ai file JSON in quanto sono anche in un modo singolo tonnellata. Usa maiuscolo camel se module.exports restituisce una funzione di costruzione in cui agisce come una classe.

Per le cartelle utilizzare nomi brevi. Se è necessario avere più parole, lasciare che siano completamente minuscole separate da "-" in modo che funzioni in modo coerente su tutte le piattaforme.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.