Express, Koa, Meteor, Sails.js: cuatro marcos del Apocalipsis

Publicado: 2022-03-11

JavaScript definitivamente se ha convertido en uno de los lenguajes más populares en los últimos años, debido a la enorme demanda de aplicaciones web. Mientras se codifica para múltiples navegadores, JavaScript es casi la única opción para los desarrolladores front-end. Se puede argumentar que existen CoffeeScript, TypeScript o Dart como alternativas. Sin embargo, la verdad es que CoffeeScript se ve principalmente como un azúcar sintáctico que eventualmente se reduce a JavaScript. TypeScript es simplemente un superconjunto de JavaScript que incluye varias funciones de lenguaje orientado a objetos, como tipos estáticos opcionales, clases e interfaces, y aún está en sus inicios. Dart también es un lenguaje orientado a objetos que tiene una sintaxis similar a C, pero aún se compila en JavaScript para los navegadores principales.

Con el nacimiento y el rápido crecimiento de Node.js, JavaScript ya no se limita al desarrollo de front-end, y el desarrollo de back-end ya no es una ciencia espacial para los programadores de front-end. La gente tiende a pensar en JavaScript como una panacea que se adapta a todas las situaciones: front-end, servidor web, aplicación de escritorio, sistema integrado, bases de datos... la lista se hace cada vez más larga. De hecho, dada la amplia audiencia de JavaScript, Node.js+MongoDB+AngularJS/React ha creado una gran cantidad de desarrolladores web de pila completa. Sin embargo, Node.js está diseñado para ser liviano y proporciona solo funcionalidades fundamentales como servidor web para aumentar la velocidad de desarrollo de aplicaciones web. Uno de los marcos listos para usar que están disponibles como paquetes npm sería una mejor opción en el mundo real.

En esta publicación, analizaremos algunos de estos marcos de Node.js bien conocidos y probados que han evitado que los desarrolladores tengan que reinventar la rueda una y otra vez. Para ser más específicos, en este artículo echaremos un vistazo a Express, Koa, Meteor y Sails.js. En lugar de tratar de averiguar cómo se compara cada uno de estos marcos, veremos las áreas clave en las que sobresale cada uno de estos marcos y cómo son relevantes para las diversas necesidades del proyecto.

Express: un marco web minimalista

No hace falta decir que Express es el mayor negocio para el negocio de Node.js. Cada jugador de Node.js ha oído hablar de él y lo está usando con o sin darse cuenta. Actualmente se encuentra en su cuarta generación y hay bastantes marcos Node.js creados en base a él o inspirados en sus conceptos.

Rendimiento

La mayoría de los desarrolladores adoran a Node.js por su velocidad bruta, y cuando se trata de la selección del marco, un perfeccionista puede desdeñar cualquier riesgo de rendimiento. Express proporciona una capa delgada sobre Node.js con funciones de aplicaciones web, como enrutamiento básico, middleware, motor de plantillas y servicio de archivos estáticos, por lo que el rendimiento de E/S drástico de Node.js no se ve comprometido.

Express es un marco mínimo y sin opiniones. no aplica ninguno de los patrones de diseño predominantes, como MVC, MVP, MVVM o lo que sea que esté de moda. Para los fanáticos de la simplicidad, esta es una gran ventaja entre todos los demás marcos porque puede crear su aplicación con su propia preferencia y sin una curva de aprendizaje innecesaria. Esto es especialmente ventajoso cuando se crea un nuevo proyecto personal sin carga histórica, pero a medida que crece el proyecto o el equipo de desarrollo, la falta de estandarización puede generar trabajo adicional para la gestión del proyecto/código y, en el peor de los casos, puede conducir a la incapacidad de mantener .

Generador

Aunque el marco no tiene opiniones, tiene el generador que genera una estructura de carpeta de proyecto específica. Después de instalar el paquete express-generator npm y crear el esqueleto de la aplicación con el comando del generador, se creará una carpeta de la aplicación con una jerarquía clara para ayudarlo a organizar imágenes, JavaScript estático de front-end, archivos de hojas de estilo y archivos de plantilla HTML.

 npm install express-generator -g express helloapp
 create : helloapp create : helloapp/package.json create : helloapp/app.js create : helloapp/public create : helloapp/public/images create : helloapp/routes create : helloapp/routes/index.js create : helloapp/routes/users.js create : helloapp/public/stylesheets create : helloapp/public/stylesheets/style.css create : helloapp/views create : helloapp/views/index.jade create : helloapp/views/layout.jade create : helloapp/views/error.jade create : helloapp/bin create : helloapp/bin/www install dependencies: $ cd helloapp && npm install run the app: $ DEBUG=helloapp:* npm start create : helloapp/public/javascripts

software intermedio

El middleware son básicamente funciones que tienen acceso completo a los objetos de solicitud y respuesta.

Pila de manejo de solicitudes

Como su nombre lo indica, el middleware aplica algunas instrucciones de filtrado antes de entregar el control a la lógica comercial real o al siguiente nivel de middleware. Algunas tareas comunes, como verificar el estado de inicio de sesión del usuario, validar la autoridad del usuario o prevenir ataques entre sitios, se extraen mejor como middleware.

 var app = express(); app.use(cookieParser()); app.use(bodyParser()); app.use(logger()); app.use(authentication()); app.get('/', function (req, res) { // ... }); app.listen(3000);

Una aplicación Express es esencialmente Node.js con una gran cantidad de funciones de middleware, ya sea que desee personalizar su propio middleware o aprovechar los middleware integrados del marco, Express hizo que el proceso fuera natural e intuitivo.

Motor de plantillas

Los motores de plantilla permiten que el desarrollador incruste variables de back-end en archivos HTML y, cuando se solicite, el archivo de plantilla se representará en formato HTML sin formato con las variables interpoladas con sus valores reales. De forma predeterminada, el generador Express utiliza el motor de plantillas Pug (originalmente conocido como Jade), pero otras opciones como Moustache y EJS también funcionan con Express sin problemas.

Integración de base de datos

Como marco mínimo, Express no considera la integración de la base de datos como un aspecto requerido dentro de su paquete, por lo que se inclina hacia ningún uso específico de la base de datos. Al adoptar una tecnología de almacenamiento de datos en particular, ya sea MySQL, MongoDB, PostgreSQL, Redis, ElasticSearch u otra, solo es cuestión de instalar el paquete npm en particular como controlador de base de datos. Estos controladores de bases de datos de terceros no se ajustan a la sintaxis unificada cuando se ejecutan las instrucciones CRUD, lo que hace que cambiar de base de datos sea una gran molestia y propensa a errores.

Koa: Utilización de funciones de JavaScript de última generación

Koa es desarrollado por el equipo detrás de Express, y su objetivo es minimizar el Express minimalista al no incluir ningún middleware dentro de su núcleo. Además de no tener middleware, Koa se parece mucho a Express, es liviano y sin opiniones. Sin embargo, lo que hace que Koa realmente se destaque es su forma de deshacerse por completo de la devolución de llamada mediante el uso de la función ES6 Generator.

Flujo de control elegante

Javascript es un lenguaje de programación asincrónico, y con tal instinto del lenguaje en sí mismo y el mecanismo de Node.js basado en eventos de un solo subproceso, la devolución de llamada está por todas partes, de ahí el notorio infierno de devolución de llamada.

Una forma de aplanar el anidamiento de devolución de llamada es usar Async.js. Async.js proporciona técnicas para mapear, paralelizar, serializar o iterar múltiples funciones sin tener que incrustar una en otra y luego pasar el flujo de control con una función de devolución de llamada, una devolución de llamada y una función de manejo de errores son suficientes para la mayor parte de las funciones agrupadas. por un método Async.js. Sin embargo, Async.js no puede eliminar las devoluciones de llamadas por completo. Al escribir código Node.js con Async.js, la sangría del código aún tiende a desplazarse hacia la derecha, pero no tan profunda.

Escape del infierno de devolución de llamada

Otra forma más limpia es usar Promesas entonces capaces. Algunas bibliotecas de Promise de terceros con reputación son bluebird y q. En la última edición de JavaScript, ES6, Promise se ha incorporado como una estandarización. Para resumir, Promise garantiza que las funciones se ejecuten y devuelvan de forma secuencial al conectar los bloques/funciones de implementación con un montón de funciones de Promise "entonces". O "resuelve" al final de cada bloque/función de implementación para que se ejecute la siguiente función "entonces", o "rechaza" la siguiente implementación para que el flujo de control salte directamente al manejo de errores. De esta manera, agrega todas las funciones de manejo de errores en un solo lugar y se deshace de las devoluciones de llamadas por completo.

Ahora ES6 trae un cambio de juego a la mesa: ES6 Generator. Esta noción es nueva en JavaScript, pero no nueva en el mundo de la programación. ES6 Generator es como una interrupción en C, en lugar de ejecutar líneas de código de arriba a abajo, ES6 Generator presenta un medio para ejecutar->detener y ejecutar otra cosa->volver para terminar lo que sobra.

Koa utiliza generadores ES6 para proporcionar una forma elegante de hacer frente a la programación asincrónica de JavaScript, por lo que no puede ver las devoluciones de llamada en una aplicación Koa pura. Un caso de uso típico de ES6 Generator en Koa es la cascada de middleware, que permite que el middleware personalizado se ejecute uno tras otro sin devoluciones de llamada desagradables.

 var app = koa(); function* responseTimeLogger(next){ var start = new Date; yield next; var ms = new Date - start; console.log(this.method + ' ' + this.url + ': ' + ms); } app.use(responseTimeLogger); // ... app.listen(3000);

No podemos sacar conclusiones precipitadas afirmando que esta técnica de vanguardia es superior a las soluciones de la vieja escuela como Async.js, Promise o event emitter, pero una cosa es segura: este nuevo concepto requiere algún tiempo para acostumbrarse. Con la secuencia de flujo de control no convencional, podría traer una dificultad adicional para la depuración del código.

Meteor: Framework para web, móvil y escritorio

Meteor es un marco de JavaScript todo en uno. A diferencia de la filosofía de simplificación de Express y Koa, se va al otro extremo al definirse a sí mismo como un marco de trabajo completo, un paquete completo que cubre aplicaciones de servidor, móviles, de escritorio y web.

Paquete uno para todos

Si observa detenidamente debajo del capó, notará que Meteor es en realidad Node.js+Blaze/AngularJS/React+Cordova+MongoDB. Node.js y MongoDB son respectivamente responsables de la lógica comercial del lado del servidor y el almacenamiento de datos. Uno de Blaze, AngularJS o React se encarga de la interfaz de usuario de front-end. Y Cordova, como la solución HTML más famosa para aplicaciones móviles híbridas, une las páginas web con las vistas móviles.

Sincronización de datos

El proceso principal para que backend y front-end compartan datos es el siguiente:

  • El cliente solicita datos o cierta vista HTML
  • El servidor recupera datos de la base de datos, los mezcla con la vista HTML utilizando algún motor de plantillas y los envía de vuelta al front-end
  • El cliente representa y muestra los datos/vistas de una manera fácil de usar

Una aplicación web moderna de una sola página modifica un poco el proceso anterior. Tome AngularJS como ejemplo, coloca las plantillas HTML como archivos estáticos junto con otros activos, como archivos front-end JavaScript, hojas de estilo e imágenes. Luego, AngularJS completa los datos en las plantillas HTML solicitando datos al back-end utilizando la API RESTful de Ajax. De cualquier manera, los desarrolladores de back-end son totalmente responsables de manejar las solicitudes de cambio de datos desde el front-end y guardar los cambios en la base de datos.

sincronización de datos bidireccional realizada automáticamente

Una de las características que distingue a Meteor de otros marcos es su mecanismo de sincronización de datos entre el servidor y las aplicaciones front-end/móviles. En Meteor, el cliente tiene una instantánea de mini base de datos que es una pequeña parte de la replicación de la base de datos del servidor, una parte que el cliente solicita previamente y que el servidor autoriza. Cuando el cliente desea realizar cambios en los datos, utiliza la API de la base de datos coherente como lado del servidor para realizar cualquier instrucción CRUD, y luego los cambios de datos se enviarán automáticamente al servidor y se guardarán en la base de datos real. Siempre que el servidor detecte modificaciones en los datos, enviará los datos actualizados a clientes específicos que se suscriban a esos datos. Esta sincronización de datos bidireccional se logra automáticamente sin ninguna intervención manual. Para crear esta magia, Meteor utiliza WebSocket para conectar el cliente y el servidor bajo el capó, de modo que cualquier cambio de datos en un extremo se refleje en el otro al instante.

Herramienta de automatización de compilación

Meteor no solo se ocupa del servidor y las aplicaciones de aplicaciones web, al usar la herramienta de compilación de Meteor llamada Isobuild con la ayuda de Cordova, una biblioteca que combina HTML/JavaScript/CSS con funcionalidades móviles nativas, Meteor hace que la creación de aplicaciones para iOS y Android sea muy sencilla. Las aplicaciones móviles generadas son aplicaciones híbridas que ejecutan JavaScript o muestran páginas HTML dentro de una WebView. Esta solución puede comprometer parte de la experiencia del usuario en comparación con las aplicaciones móviles nativas, pero para muchos, poder administrarlo todo bajo la misma base de código con las aplicaciones web es un gran punto de venta y ahorra una tonelada de costos de desarrollo.

En general, Meteor es un marco altamente automatizado. Esta automatización de alto nivel hace que la vida de los desarrolladores sea mucho más fácil, pero tiene el costo de poner en peligro el rendimiento y las restricciones de escalabilidad. A medida que crece la base de usuarios, la técnica de sincronización de datos automatizada se convierte en el cuello de botella de escalamiento. Para lograr la misma capacidad y rendimiento que otras tecnologías de back-end ajustadas a mano, Meteor suele consumir muchos más recursos de ancho de banda y hardware de servidor. Así que Meteor podría ser un gran punto de partida y una caja de herramientas perfecta si uno quiere crear un prototipo de un proyecto para todas las plataformas principales, pero eventualmente, en algún momento, la arquitectura del sistema debe rediseñarse de una manera más profesional si el prototipo se convierte en un proyecto de producción con suficiente base del cliente.

Sails.js: Framework MVC superior para Node.js

Sails.js comparte muchas similitudes con Express. Es un generador de proyectos, middleware y motor de plantillas. De hecho, está construido sobre Express más algunas funcionalidades de nivel superior para acelerar el desarrollo.

MVC

Controlador de vista de modelo

Sails.js adopta el patrón de diseño Model-View-Controller desde su núcleo. Para aquellos que vienen de Ruby on Rails o Laravel, encontrarán la estructura de una aplicación Sails.js demasiado familiar. El modelo representa el modelo de datos que refleja el esquema de colección/tabla de la base de datos, la vista es una vista HTML con datos completos, el controlador es donde se coloca toda la lógica comercial del lado del servidor y actúa como un enlace entre los datos y la vista.

Comunicación en tiempo real

A diferencia de una solicitud HTTP en la que el cliente tiene que consultar los datos del servidor cada vez, o una conexión de sondeo prolongada que pone al servidor en modo inactivo, Socket.io establece una comunicación bidireccional basada en eventos entre el cliente y el servidor. Sails.js integra Socket.io y lo envuelve con una API de mayor nivel de abstracción para brindar más comodidad, lo que hace que Sails.js sea especialmente adecuado para crear aplicaciones de chat o juegos multijugador.

ORM de base de datos

ORM de base de datos

Entre la lógica de back-end y la manipulación real de la base de datos, hay una capa ORM intermedia llamada Waterline. En pocas palabras, esta herramienta ORM proporciona una sintaxis coherente para acceder a diferentes bases de datos sin que los desarrolladores tengan que preocuparse por los variados lenguajes de consulta de bases de datos, como SQL frente a NoSQL, esquema frente a sin esquema, etc.

Sails.js tiene un grado de automatización intermedio. Se enfoca en la lógica del lado del servidor y está listo para la producción, y proporciona un ritmo de desarrollo más rápido que Express sin sacrificar el rendimiento o la escalabilidad futura. En particular para la gran cantidad de devotos del patrón MVC, Sails.js tiene una curva de aprendizaje bastante suave.

Envolver

Este artículo no clasifica diferentes marcos de trabajo de Node.js, sino que enumera los puntos destacados de cada marco de trabajo para que se destaque entre la multitud a fin de ayudar a los desarrolladores de Node.js a elegir la caja de herramientas más adecuada al crear un proyecto desde cero.

Entonces, ¿cuál es tu framework Node.js favorito para el desarrollo web? ¿Prefieres algún marco diferente a los que discutimos anteriormente? Háganos saber en la sección de comentarios.

Relacionados:
  • ¿Por qué diablos usaría Node.js? Un tutorial caso por caso
  • Codificación de Cabin Fever: un tutorial de back-end de Node.js
  • Creación de una API REST de Node.js/TypeScript, parte 1: Express.js