¿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.
Respuestas:
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í:
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
fuente
<link>
a algo como/example/path
cuando un usuario ingresa/example/path/
en la barra de direcciones (o al revés).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) .
fuente
Al igual que en la otra publicación del blog, escribí una específicamente sobre la organización de
Express
aplicaciones. 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
fuente
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.fuente
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
fuente
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.
fuente