Convenciones de nomenclatura de proyectos de Node.js para archivos y carpetas

116

¿Cuáles son las convenciones de nomenclatura para archivos y carpetas en un proyecto grande de Node.js?

¿Debo usar mayúsculas, camelCase o subvalorar?

Es decir. ¿Esto se considera 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
fuente
3
Altamente subjetivo, la estructura de su directorio es la suya. Personalmente me gusta camelCase ya que eso es lo que hago en JS
Chad
@Chad: en Node.js, requiretoma la cadena del directorio como parámetro, por lo que no es del todo tuyo. es decir. require('../app/controllers/someThings');
Rudiger
3
Node no especifica ninguna sugerencia o estándar para nombrar módulos, siempre que sean nombres de archivos / directorios válidos y no intenten anular los nombres de los módulos centrales . Para sus propios módulos, utiliza una combinación de abreviados ( fs), una sola palabra ( events), subrayados ( child_process) y minúsculas ( querystring).
Jonathan Lonowski
1
@Rudiger ¿Entonces? Puede especificar la cadena que desee y la estructura de directorio que desee puede tener (siempre que sus nombres sean nombres de archivo válidos, por supuesto).
Chad
Por lo que puedo decir de hurgar en los proyectos más clave, como los nombres de archivos mocha como captain-awesome-file.js, parecen ser lo suficientemente comunes. ¡Eso es lo que voy a usar al menos!
Charles Ferentchak

Respuestas:

154

Después de algunos años con el nodo, puedo decir que no hay convenciones para la estructura de directorios / archivos. Sin embargo, la mayoría de las aplicaciones express (profesionales) utilizan una configuración como:

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

Un ejemplo que usa esta configuración es nodejs-starter .

Personalmente cambié esta configuración a:

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

En mi opinión, el último encaja mejor con la estructura de directorios estilo Unix (mientras que el primero mezcla esto un poco).

También me gusta este patrón para separar archivos:

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

};

Esto permite desacoplar perfectamente todo el código fuente sin tener que molestar a las dependencias. Una muy buena solución para luchar contra el desagradable Javascript. Un ejemplo del mundo real está cerca que usa esta configuración.

Actualizar (nombres de archivo):

En cuanto a los nombres de archivo, los más comunes son los nombres de archivo cortos y en minúsculas . Si su archivo solo se puede describir con dos palabras, la mayoría de los proyectos de JavaScript utilizan un guión bajo como delimitador.

Actualización (variables):

En cuanto a las variables, se aplican las mismas "reglas" que para los nombres de archivo. Los prototipos o clases, sin embargo, deben usar camelCase .

Actualización (guías de estilo):

bodokaiser
fuente
26
Qué interesante y bien hecha es su respuesta, está fuera de tema, el creador del tema solicitó específicamente la convención de nomenclatura, no las estructuras de directorio. Cuando lleguemos a este tema, esperamos saber si los archivos se nombran mejor con guiones, guiones bajos o camelCase. Votaré a favor, si esto se agrega a esta respuesta.
Tronix117
3
@ Tronix117 ¿cuál es el problema? La pregunta pide "¿convenciones de nomenclatura de proyectos para archivos y carpetas?" y la denominación no se limita al nombre del archivo, ya que también incluye el nombre completo de la ruta.
bodokaiser
23
por supuesto, pero el autor pregunta específicamente "¿Debo usar mayúsculas, camelCase o subvalorar?". Cuando escribió su ejemplo, puso explícitamente 'algunas cosas' y 'algunas cosas' solo para saber si se puede considerar válido. Cuando fui a este tema, esperaba tener la respuesta a esta pregunta específica y saber qué se usa generalmente como nombre de archivo. No digo que tu respuesta sea incorrecta, es perfecta para su propósito, pero en mi mente está incompleta porque él realmente no responde a la pregunta principal.
Tronix117
5
Creo que me has malentendido ;). Solo estaba buscando algo que no encontré en la respuesta aceptada, pero que me preguntaron específicamente, sin difundir odio de ningún tipo, estás yendo un poco lejos en este caso. Solo quería que agregaras algo de información sobre eso en la respuesta, para que las personas que lo busquen en el futuro no se encuentren en un callejón sin salida.
Tronix117
2
@ Tronix117 En realidad, esta es específicamente la razón por la que me encontré en esta página leyendo esta respuesta. Esperaba no solo la estructura de directorios, sino, lo que es más importante, las convenciones de nombres (guiones, guiones bajos, camelCase, TitleCase, etc.). Desafortunadamente, la respuesta aún no lo contiene, y parece que bodokaiserme estoy tomando las cosas demasiado personalmente como para intervenir y solicitar que su opinión al respecto se agregue a su respuesta (como el OP preguntó inicialmente en su pregunta) ( tos tos ).
Swivel
97

Úselo kebab-casepara todos los nombres de paquetes, carpetas y archivos.

¿Por qué?

Debe imaginarse que algún día cualquier carpeta o archivo podría extraerse a su propio paquete. Los paquetes no pueden contener letras mayúsculas.

Los paquetes nuevos no deben tener letras mayúsculas en el nombre. https://docs.npmjs.com/files/package.json#name

Por lo tanto, camelCasenunca debe usarse. Esto deja snake_casey kebab-case.

kebab-casees, con mucho, la convención más común en la actualidad. El único uso de guiones bajos es para paquetes de nodos internos, y esto es simplemente una convención de los primeros días.

vaughan
fuente
2
te olvidaste de dot? como socket.io
Roee
1
2C, podría hacer una simple automatización de kebab caso para kebabCase en cualquier script o aplicación en cualquier idioma usando expresiones regulares - lo hace todo el tiempo 🙃
rob2d
63

No hay convenciones. Hay alguna estructura lógica.

Lo único que puedo decir: nunca use nombres de directorio y archivo camelCase. ¿Por qué? Funciona, pero en Mac y Windows no hay diferencias entre alguna acción y alguna acción. Me encontré con este problema, y ​​ni una sola vez. Necesito un archivo como este:

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

Pero, lamentablemente, he creado un archivo con lleno de minúsculas: lib/ishidden.js. Funcionó para mí en mac. Funcionó bien en mac de mi compañero de trabajo. Las pruebas se ejecutan sin errores. Después de la implementación, obtuvimos un gran error:

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

Oh si. Es una caja de Linux. Así que la estructura de directorios de camelCase podría ser peligrosa. Es suficiente para un colega que está desarrollando en Windows o Mac.

Por lo tanto, use un guión bajo (_) o un guión (-) como separador si lo necesita.

yitsushi
fuente
4
+1, agregue el hecho de que cambiar el nombre de las carpetas que distinguen entre mayúsculas y minúsculas en git en un sistema que no es cs es una verdadera molestia.
máximo
4
Realmente no entiendo el problema con camelCase aquí. ¿No se resolvería el problema nombrando el archivo correctamente en primer lugar (lib / isHidden.js)?
Mike
Hola Mike, el punto es que camelCase se romperá con la implementación en algunos sistemas. Estaba confundido acerca de por qué todos mis directorios recibían 404 cuando lo implementé desde Mac en una caja de Linux con un paquete llamado "groupPages". Tuve que cambiarme a páginas de grupo para arreglar las cosas.
tempranova
3
Peor aún: cree una versión camelcase de un nombre de archivo y pídale a un colega descuidado que cree una versión en minúsculas en el mismo directorio. Ahora verifique en un sistema operativo que no distinga mayúsculas de minúsculas y trate de averiguar por qué diablos su aplicación no funciona. Y sí, sucedió esto.
L0LN1NJ4
Me gusta esta respuesta, sin embargo, quiero señalar que el guión (-) también puede tener algunos problemas. Por ejemplo, usando el marco de prueba de Nighwatch, creé un objeto de página llamado admin-login.js. Luego intenté acceder a él desde el script de prueba usando const loginPage = browser.page.admin-login(). Tengo un error ReferenceError: login is not defined. El uso de subrayado (_) para el nombre del archivo resolvió el problema. También puedo imaginar que el uso de nombres de archivo con guiones en la línea de comandos también puede generar algunos problemas. Por lo tanto, diría que el subrayado es el separador más seguro para los nombres de archivos en general.
Dragan Nikolic
15

Basado en la " Guía de estilo de JavaScript de Google "

Los nombres de los archivos deben estar todos en minúsculas y pueden incluir guiones bajos (_) o guiones (-), pero sin puntuación adicional. Siga la convención que usa su proyecto. La extensión de los nombres de archivo debe ser .js.

Vlad Bezden
fuente
3

La mayoría de la gente usa camelCaseen JS. Si desea abrir cualquier código, le sugiero que use este :-)

Mathieu Amiot
fuente
Algunos proyectos, como Locomotive.js, se utilizan camelCasepara archivos de controlador. :-) Solo depende. Tiendo a usarlo PascalCasepara archivos de clase.
Mathieu Amiot
@yitsushi parece plantear una gran preocupación con la denominación de casos de camello (y pascal), si desea crear módulos portátiles, el caso de camello seguramente le parece una mala idea.
gumaflux
0

Node.js no aplica ningún convenio de nomenclatura de archivos (excepto index.js). Y el lenguaje Javascript en general tampoco. Puede encontrar docenas de hilos aquí que sugieren camelCase, guiones y guiones bajos, cualquiera de los cuales funciona perfectamente bien. Eso depende de ti. Elija uno y apéguese a él.

Subhas
fuente
1
En realidad, no es lo que el nodo 'aplica', lea esto: nodejs.org/api/modules.html#modules_folders_as_modules
moka
0

Según yo: para archivos, use minúsculas camel si module.exports es un objeto, me refiero a un módulo singleton. Esto también se aplica a los archivos JSON, ya que también son de una sola tonelada. Use mayúsculas y minúsculas si module.exports devuelve una función de constructor donde actúa como una clase.

Para carpetas, use nombres cortos. Si es necesario tener varias palabras, déjelas en minúsculas separadas por "-" para que funcione en todas las plataformas de manera consistente.

arunram
fuente