Cómo organizar grandes proyectos de Node.js

82

¿Cuáles son algunas buenas formas de organizar grandes proyectos de Node.js?

Por ejemplo, ¿una aplicación que utiliza express.js y socket.io? Esto incluiría tanto la estructura lógica de la aplicación como el sistema de archivos.

Actualmente, me encuentro metiendo una tonelada de código en un solo archivo maestro js y colocando código en un objeto global gigante, y se siente mal.

Thomas Hunter II
fuente
2
¿Tienes tiempo para leer un libro ?
Straseus
Puede que tenga que comprar este libro, ¡gracias!
Thomas Hunter II
"Módulos JavaScript" de Google o "JavaScript modular" :-)
Sri
1
He leído el libro sugerido por Straseus, y ofrece muchos buenos consejos y análisis, pero me temo que no muchos se transfieren bien a la estructuración de una aplicación Node.js con express. La respuesta de PuerkitoBio a continuación enlaza con algunas sugerencias de una buena estructura de archivo inicial; Planeo construir sobre esa estructura según sea necesario.
Aaron

Respuestas:

97

Un ejemplo para principiantes

Me gusta el originalmente verificado de @ david-ellis y deberías estudiarlo en profundidad para entenderlo, ya que es bueno. Sin embargo, me hubiera gustado que estuviera más simplificado para los principiantes que deseen ver un ejemplo sencillo. Esto es lo que me hubiera gustado que alguien me mostrara.

Démosle un escenario típico en el que está utilizando express y tiene muchas rutas enumeradas en su archivo app.js. Su contenido se vería así:

app.js

// ... startup code omitted above

app.get('/', function(req, res) {
  res.render('index', { title : 'home' });
});
app.get('/contactus', function(req, res) {
  res.render('contactus', { title : 'contact us' });
});
app.get('/anotherpage', function(req, res) {
  res.render('anotherpage', { title : 'another page' });
});
// and so on...

Puede imaginar que si tiene 50 rutas, este archivo puede salirse de control. Sería bueno eliminar parte de este desorden del archivo app.js.

Lo que haría es crear una carpeta de "controladores" en su aplicación para que su estructura ahora se vea así:

app.js
/controllers

Crea un archivo dentro de "/ controllers" llamado "index.js" y luego coloca el siguiente código.

/controllers/index.js

module.exports.set = function(app) {
   // copy your routes listed in your app.js directly into here
}

Corta y pega tus listados de rutas de tu archivo "app.js" y colócalos en el archivo "/controllers/index.js".

En su archivo app.js, elimine sus rutas y en lugar de ellas haga lo siguiente.

app.js

// remove your routes and replace with this code
var controllers = require('./controllers');
controllers.set(app);

Ahora, si desea que su archivo "/controllers/index.js" también se divida, agreguemos un ejemplo más para que pueda ver cómo Node.js realmente actúa como una muñeca rusa en cómo se puede organizar su código.

Dentro de "/ controllers" agregue un archivo más "accounts.js" y coloque lo siguiente dentro de él.

/controllers/account.js

module.exports.set = function(app) {
    // put more app route listings here
}

Ahora, dentro de su archivo "/controllers/index.js, coloque una referencia a" account.js "

/controllers/index.js

var account = require('./account.js');

module.exports.set = function(app) {
   // your routes here

   // let "account.js" set other routes
   account.set(app);
}

Como puede imaginar, puede seguir dividiendo las cosas en partes cada vez más pequeñas y poner más carpetas dentro de las carpetas y hacer referencia con "require" si lo desea. Puede utilizar el mismo concepto para "/ lib" o archivos de biblioteca. "node_modules" ya está haciendo esto.

Esa es solo una de las muchas razones por las que es muy agradable programar con node.js.

Ejemplo de enrutamiento Express 4 administrable

Aquí hay otra publicación a la que respondí sobre las 4 rutas express que se relaciona con esto.

Descanse con el enrutador anidado Express.js

Jason Sebring
fuente
En mi humilde opinión, era mejor antes de la actualización, puede evitar tener que dar un nombre a cada controlador implementando un mecanismo de alias, donde una ruta se enruta a otra, esto también ayuda con las URL canónicas
Timo Huovinen
No importa la parte de las URL canónicas, fue una ocurrencia tardía. Por URL canónica me refiero a agregar una canónica <link>a algo como /example/pathcuando un usuario ingresa /example/path/en la barra de direcciones (o al revés).
Timo Huovinen
Ya sabes, como programador es natural querer este tipo de jerarquía organizada, pero no se presta bien en términos prácticos al abrir un archivo o leer un registro. Terminará con una gran cantidad de "index.js" con los que rápidamente se vuelve difícil trabajar.
Abhinav Gujjar
Un año después, un post valioso para mí. Estoy comenzando a usar node.js para un proyecto de fin de semana.
masfenix
@JasonSebring ¡Hay tanta información y soy tan nuevo! Estoy muy perdido ahora mismo. Como estudiante de posgrado en matemáticas, hago mucho matlab / R / mathica, PERO la última vez que toqué un marco web / de escritorio fue en los días de .net 2.0.
masfenix
10

Escribí una publicación de blog sobre este mismo tema hace unos días, y aunque el artículo está en francés, configuré un repositorio de GitHub (en inglés) para mostrar un ejemplo funcional de la estructura que uso.

Obviamente, no hay una respuesta definitiva a esta pregunta, pero es interesante ver qué están haciendo los demás, y estoy atento a otras opiniones sobre el tema (que también se discutió aquí , donde se puede ver un resumen de lo que sugiero) .

mna
fuente
Gracias por ese enlace, fue una buena lectura (con la ayuda de Google Translate), y estoy seguro de que seguiré algunas de sus sugerencias para diseñar la organización del proyecto en el que estoy trabajando actualmente.
Aaron
¿Puedes arreglar el enlace?
Yevhenii Herasymchuk
2

Al igual que en la otra publicación del blog, escribí una específicamente sobre la organización de Expressaplicaciones. Es el método que he estado usando durante aproximadamente un año y medio. Básicamente, organice sus aplicaciones en torno a sus entidades de datos o cualquier otro elemento central. Coloque la lógica para cada uno de esos elementos en sus propios directorios. Traté de pedir prestado mucho a Python.

http://rycole.com/2013/01/28/organizing-nodejs-express.html

Ryan
fuente
1

Sus artículos ya no están en línea, pero la serie de nodos de Eric Satterwhite recomendó una estructura como se indica a continuación.

# Project 
. 
|-- packages/
|   |-- project-core
|   |   |-- lib/
|   |   |-- commands/
|   |   |-- startup/
|   |   |-- conf/
|   |   |-- test/
|   |   |-- package.json
|   |   |-- README.md
|   |   |-- events.js
|   |   |-- .npmignore
|   |   `-- index.js
|-- package.json
`-- index.js

Con la packages/carpeta convirtiéndose en su fuente de modularidad.

Devnetics
fuente
0

Si eres un principiante en esta área, te sugiero que eches un vistazo a los proyectos existentes que aman a los desarrolladores. Algunos de ellos son:

  • Sails.js - 18k estrellas. Puede ver cómo organizaron la estructura de la aplicación en el enlace que proporcioné. Un gran sitio web tiene una explicación para cada carpeta en la estructura.

  • Generador Express.js - 800 estrellas. Existe la gran y sencilla plantilla para empezar a trabajar con Express.js. Aquí puedes notar cómo dividen las rutas desde la aplicación.

Por cierto, muchos desarrolladores hicieron su caso antes, y puede bifurcarlo y actualizarlo.

  • Kioska . Mira cómo separan los eventos en diferentes archivos en la events/carpeta.

  • Ballons.io 2.3k estrellas. Desafortunadamente, tienen todo el servidor de socket en un archivo, pero puedes aprender la estructura completa de la aplicación con node.js y socket.io

Yevhenii Herasymchuk
fuente
0

Si no le importa, siempre puede aprender mecanografiado e ir a https://nestjs.com/

Si desea seguir con JS, le recomiendo encarecidamente utilizar la arquitectura de cebolla. La mejor práctica es mantener la lógica empresarial, los controladores e incluso las bibliotecas separados (deben estar envueltos dentro de algunas clases / ayudantes), por si acaso, si tendrá que migrar a otra biblioteca (analizador CSV diferente, etc.).

Con la arquitectura de cebolla, no le importa de dónde vienen las solicitudes, no habrá muchos cambios para agregar incluso algún agente de mensajes.

Prueba también este https://en.wikipedia.org/wiki/Domain-driven_design

ESLint puede ayudar con la organización adecuada del proyecto.

Krzysztof Szostak
fuente