Convenções de nomenclatura de projetos Node.js para arquivos e pastas

116

Quais são as convenções de nomenclatura para arquivos e pastas em um grande projeto Node.js.

Devo capitalizar, camelCase ou subestimar?

Ou seja, isso é considerado válido?

project-name
    app
        controllers
            someThings.js
            users.js
        models
                someThing.js
                user.js
        views
            some-things
                index.jade
            users
                logIn.jade
                signUp.jade
    ...
Rudiger
fonte
3
Altamente subjetivo, sua estrutura de diretório é sua. Pessoalmente, gosto de camelCase, pois é o que faço em JS
Chad
@Chad - no Node.js, requireusa a string do diretório como parâmetro, e é por isso que não é inteiramente sua. ie. require('../app/controllers/someThings');
Rudiger de
3
O Node não especifica nenhuma sugestão ou padrão para nomear módulos, contanto que sejam nomes de arquivo / diretório válidos e não tente substituir os nomes dos módulos principais . Para seus próprios módulos, ele usa uma mistura de abreviado ( fs), palavra única ( events), sublinhado ( child_process) e minúsculo ( querystring).
Jonathan Lonowski de
1
@Rudiger Então? Você pode especificar qualquer string que desejar e a estrutura de diretório que desejar (desde que seus nomes sejam nomes de arquivo válidos, é claro).
Chade,
Pelo que posso dizer ao examinar os projetos mais importantes, como nomes de arquivo mocha, como captain-awesome-file.js, parecem ser bastante comuns. É isso que vou usar pelo menos!
Charles Ferentchak

Respostas:

154

Depois de alguns anos com nó, posso dizer que existem convenções para a estrutura de diretório / arquivo. No entanto, a maioria dos aplicativos express (profissionais) usam uma configuração como:

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

Um exemplo que usa essa configuração é nodejs-starter .

Eu pessoalmente mudei essa configuração para:

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

Na minha opinião, o último combina melhor com a estrutura de diretórios no estilo Unix (enquanto o primeiro mistura isso um pouco).

Também gosto desse padrão para separar arquivos:

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

};

Isso permite separar perfeitamente todo o código-fonte sem ter que incomodar as dependências. Uma solução realmente boa para combater o Javascript desagradável. Um exemplo do mundo real próximo, que usa essa configuração.

Atualizar (nomes de arquivos):

Em relação aos nomes de arquivo, os mais comuns são nomes de arquivo curtos e em minúsculas . Se o seu arquivo só pode ser descrito com duas palavras, a maioria dos projetos JavaScript usa um sublinhado como delimitador.

Atualizar (variáveis):

Com relação às variáveis, as mesmas "regras" se aplicam aos nomes de arquivos. Protótipos ou classes, no entanto, devem usar camelCase .

Atualização (guias de estilo):

bodokaiser
fonte
27
Quão interessante e bem feita é sua resposta, está fora do tópico, o criador do tópico solicitou especificamente uma convenção de nomenclatura, não para estruturas de diretório. Quando chegarmos a este tópico, esperamos saber se os arquivos são melhor nomeados com travessões, sublinhados ou camelCase. Eu irei votar positivamente, se isso for adicionado a esta resposta.
Tronix117
3
@ Tronix117 qual é o problema? A questão pede "convenções de nomenclatura de projeto para arquivos e pastas?" e a nomenclatura não se limita ao nome do arquivo, pois também inclui o nome do caminho completo.
bodokaiser
24
é claro, mas o autor pergunta especificamente "Devo usar maiúscula, camelCase ou subestimar?". Ao escrever seu exemplo, ele colocou explicitamente 'algumas coisas' e 'algumas coisas' apenas para saber se isso pode ser considerado válido. Quando fui para este tópico, esperava obter a resposta a esta pergunta específica e saber o que é geralmente usado como nomenclatura de arquivo. Não digo que sua resposta esteja errada, é perfeita para o propósito, mas incompleta para mim porque ele realmente não responde à pergunta principal.
Tronix117 de
5
Acho que você me entendeu mal;). Eu só estava procurando por algo que não encontrei na resposta aceita, mas foi perguntado especificamente, não espalhando ódio de qualquer espécie, você está indo um pouco longe nisso. Eu só queria que você acrescentasse algumas informações sobre isso na resposta, para que as pessoas que buscarem isso no futuro não cheguem a um beco sem saída.
Tronix117 de
3
@ Tronix117 Na verdade, é exatamente por isso que me vi nesta página lendo esta resposta. Eu esperava não apenas uma estrutura de diretório, mas, mais importante ainda, convenções de nomes (travessões, sublinhados, camelCase, TitleCase, etc ...). Infelizmente, a resposta ainda não o contém, e parece bodokaiserque estou levando as coisas muito para o lado pessoal para eu pular e pedir que sua opinião sobre isso seja adicionada à sua resposta (como o OP inicialmente perguntou na pergunta deles) ( tosse tosse ).
Girar
97

Use kebab-casepara todos os nomes de pacotes, pastas e arquivos.

Por quê?

Você deve imaginar que qualquer pasta ou arquivo pode ser extraído para seu próprio pacote algum dia. Os pacotes não podem conter letras maiúsculas.

Os novos pacotes não devem ter letras maiúsculas no nome. https://docs.npmjs.com/files/package.json#name

Portanto, camelCasenunca deve ser usado. Isso deixa snake_casee kebab-case.

kebab-caseé de longe a convenção mais comum hoje. O único uso de sublinhados é para pacotes de nós internos, e isso é simplesmente uma convenção desde os primeiros dias.

Vaughan
fonte
2
você esqueceu o ponto? como socket.io
Roee
1
.2c, poderia fazer uma automação simples de kebab-case para kebabCase em qualquer script ou aplicativo em qualquer linguagem usando regex - faça isso o tempo todo 🙃
rob2d
63

Não existem convenções. Existem algumas estruturas lógicas.

A única coisa que posso dizer: nunca use nomes de arquivos e diretórios camelCase. Por quê? Funciona, mas no Mac e no Windows não há diferença entre someAction e alguma ação. Eu conheci esse problema, e não uma vez. Eu exigi um arquivo como este:

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

Mas, infelizmente, eu criei um arquivo com cheio de minúsculas: lib/ishidden.js. Funcionou para mim no mac. Funcionou bem no mac do meu colega de trabalho. Os testes são executados sem erros. Após a implantação, recebemos um grande erro:

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

Oh sim. É uma caixa Linux. Portanto, a estrutura de diretórios do camelCase pode ser perigosa. É o suficiente para um colega que está desenvolvendo no Windows ou Mac.

Portanto, use o separador de sublinhado (_) ou traço (-), se necessário.

yitsushi
fonte
4
+1, acrescente o fato de que renomear pastas com distinção entre maiúsculas e minúsculas no git em um sistema não cs é um verdadeiro aborrecimento.
máx.
4
Eu realmente não entendo o problema com o camelCase aqui. O problema não seria resolvido nomeando o arquivo corretamente em primeiro lugar (lib / isHidden.js)?
Mike
Ei, Mike, a questão é que o camelCase vai quebrar na implantação em alguns sistemas. Fiquei confuso sobre por que meus diretórios estavam recebendo 404s quando implantei do Mac em uma caixa Linux com um pacote chamado "groupPages". Tive que mudar para páginas de grupo para consertar as coisas.
tempranova
3
Pior ainda: crie uma versão em caixa baixa de um nome de arquivo e peça a um colega descuidado que crie uma versão em caixa baixa no mesmo diretório. Agora faça uma verificação em um sistema operacional sem distinção entre maiúsculas e minúsculas e tente descobrir por que diabos seu aplicativo não está funcionando. E sim, isso aconteceu.
L0LN1NJ4
Gostei dessa resposta, mas quero apontar que o traço (-) também pode ter alguns problemas. Por exemplo, usando a estrutura de teste Nighwatch, criei um objeto de página denominado admin-login.js. Então tentei acessá-lo a partir do script de teste usando const loginPage = browser.page.admin-login(). Eu tenho um erro ReferenceError: login is not defined. O uso de sublinhado (_) no nome do arquivo resolveu o problema. Também posso imaginar que usar nomes de arquivos com traço na linha de comando também pode causar alguns problemas. Portanto, eu diria que o sublinhado é o separador mais seguro para nomes de arquivo em geral.
Dragan Nikolic
15

Baseado no ' Guia de estilo do Google JavaScript '

Os nomes dos arquivos devem ser todos minúsculos e podem incluir sublinhados (_) ou travessões (-), mas nenhuma pontuação adicional. Siga a convenção que seu projeto usa. A extensão dos nomes de arquivo deve ser .js.

Vlad Bezden
fonte
3

A maioria das pessoas usa camelCaseem JS. Se você quiser abrir o código de algo, sugiro que use este :-)

Mathieu Amiot
fonte
Alguns projetos, como Locomotive.js, estão usando camelCasepara arquivos de controlador. :-) Apenas depende. Costumo usar PascalCasepara arquivos do tipo classe.
Mathieu Amiot
@yitsushi parece levantar uma grande preocupação com a nomenclatura de caixas de camelo (e pascal), se você deseja criar uma caixa de camelo com módulos portáteis, certamente parece uma má ideia?
gumaflux
0

Node.js não impõe nenhuma convenção de nomenclatura de arquivo (exceto index.js). E a linguagem Javascript em geral também não. Você pode encontrar dezenas de tópicos aqui que sugerem camelCase, hífens e sublinhados, qualquer um dos quais funciona perfeitamente bem. Então a escolha é sua. Escolha um e fique com ele.

Subhas
fonte
1
Não é realmente o que o nó 'impõe', por favor leia isto: nodejs.org/api/modules.html#modules_folders_as_modules
moka
0

De acordo com mim: Para arquivos, use a caixa de camelo inferior se module.exports for um objeto, quero dizer um módulo singleton. Isso também se aplica a arquivos JSON, pois eles também são de uma forma única. Use maiúsculas e minúsculas se module.exports retornar uma função construtora onde atua como uma classe.

Para pastas, use nomes curtos. Se houver necessidade de várias palavras, deixe-as totalmente em minúsculas separadas por "-" para que funcione em todas as plataformas de forma consistente.

arunram
fonte