NodeJS es sin duda una de las tecnologías que más rápido está creciendo, y que ya hoy en día es indispensable para cubrir posiciones de trabajo. NodeJS ha sido revolucionario en todos los aspectos, desde la forma de trabajar hasta que ejecuta JavaScript del lado del servidor.
NodeJS es básicamente un entorno de ejecución JavaScript del lado del servidor, puede sonar extraño, ¿JavaScript del lado del servidor? ¿Pero que no JavaScript se ejecuta en el navegador del lado del cliente? JavaScript nace inicialmente en la década de los noventas por los desarrolladores de Netscape, el cual fue creado para resolver problemas simples como validación de formularios, alertas y alguna que otra pequeña lógica de programación, nada complicado, sin embargo, JavaScript ha venido evolucionando hasta convertirse en un lenguaje de programación completo. NodeJS es creado por Ryan Lienhart Dahl, quien tuve la gran idea de tomar el motor de JavaScript de Google Chrome llamado V8, y montarlo como el Core de NodeJS.
Como puedes ver en la imagen, NodeJS es en realidad el motor de JavaScript V8 con una capa superior de librerías de NodeJS, las cuales se encargan de la comunicación entre el API de NodeJS y el Motor V8. Adicionalmente, se apoya de la librería Libuv la cual es utilizada para el procesamiento de entradas y salidas asíncronas.
Cabe mencionar que NodeJS es Open Source y multiplataforma, lo que le ha ayudado a ganar terrenos rápidamente.
Que es NodeJS (Según su creador):
Node.js® es un entorno de ejecución para JavaScript construido con el motor de JavaScript V8 de Chrome. Node.js usa un modelo de operaciones E/S sin bloqueo y orientado a eventos, que lo hace liviano y eficiente. El ecosistema de paquetes de Node.js, npm, es el ecosistema más grande de librerías de código abierto en el mundo.
Te puede interesar mi articulo sobre las 10 tecnologías que debes aprender, en donde incluyo a NodeJS.
NodeJS un cambio de paradigma
NodeJS ha representado para muchos programadores todo un cambio de paradigma, pues tiene como principal característica, el procesamiento asíncrono en casi la totalidad de sus tareas. Para ello, NodeJS utiliza únicamente un hilo de ejecución y procesamiento de entrada y salida asíncrono. Con lo cual, NodeJS no realiza bloqueos en el procesamiento.
Esto quiere decir que cuando es requerido realizar una tarea secuencial, la cual requiere realizar el paso 1,2 y 3 en ese orden, es necesario crear una serie de callbacks, lo cual es básicamente que al terminar el paso 1, manda llamar una función correspondiente al paso 2, y al terminar el paso 2, manda llamar otra función correspondiente al paso 3. Esta serie de llamadas o callbacks es una de las cuestiones más criticadas de NodeJS, que incluso, ya le han puesto un nombre Call Backs Hell o el Infierno de las call backs, pues es necesario anidar una gran cantidad de funciones para realizar una única operación, lo cual puede ser un verdadero dolor de cabeza al intentar seguir el código, además que es muy verboso.
Como podemos ver en la imagen, el resultado de la ejecución de cada paso es enviado a la siguiente función (Callback) para continuar con el procesamiento.
La pregunta obvia aquí es, si es tan complicado usar callback ¿porque no procesamos todo de forma síncrona?, pues la respuesta es muy simple, y es que JavaScript funciona nativamente de forma asíncrona y segunda, esta es en realidad uno de los principales diferenciadores de NodeJS, pues trabajar de esta forma ayuda a optimizar los recursos del servidor, pues no mantiene hilos bloqueantes entre la ejecución de cada paso.
NodeJS y la arquitectura de Microservicios
Para los que no conozcan esta arquitectura, le comento que microservicios es una arquitectura que promueve el desarrollo de pequeñas aplicaciones que corran de forma independiente, en lugar de tener aplicaciones monolíticas montadas en un servidor de aplicaciones, en donde si un servidor se muere, probablemente dejen de funcionar muchas aplicaciones.
NodeJS tiene la gran característica de ser extremadamente modular, esto quiere decir que existe un pequeñísimo módulo para cada característica de NodeJS, por ejemplo, existe un módulo para usar el File System, otro para parciar el body de un request http, otro para conexión base de datos. Es más, existe módulos que solo tiene una función. Esto ayuda a que las aplicaciones NodeJS corran únicamente con los módulos estrictamente necesarios y ayudan en gran parte a crear aplicaciones mucho más livianas.
Dada la modularidad y simplicidad de trabajo de JavaScript, hace que NodeJS esté tomando mucho terreno en el desarrollo de aplicaciones simples, que pueden ser montados en servidores de hasta 5 USD al mes, y funcione a la perfección.
NodeJS y NPM
Para los que viene de Java, NPM es el equivalente a Maven, si, aun así, no te queda claro. NPM es el gestor de paquetes (módulos) de NodeJS, mediante NPM es posible descargar de forma automática las dependencias y ejecutar instrucciones como iniciar o apagar NodeJS.
NPM o Node Package Manager es en realidad mucho más complejo de lo que acabo de decir, pero lo quería resumir en pocas palabras. Puedes leer más de NPM aquí.
Ventajas y desventajas de NodeJS
Hasta este momento, solo le hemos echado flores a NodeJS, pero es hora de poner las cosas en perspectiva y analizar las cosas buenas y malas que tiene, para de esta forma poder tener un mejor análisis.
*Cabe mencionar que este análisis es desde mi muy humilde punto de vista, y puede que para algunos la desventaja sean ventajas y viceversa. Pero como dicen, no hay más ciego que el que no quiere ver, por lo que si tú eres un apasionado purista de NodeJS puede que nada de esto te parezca.
Ventajas
- OpenSource: sin duda, hoy el software open source ha tenido la evolución más rápida y con mejor aceptación de los usuarios, además que es totalmente gratis su uso, puede descargar el código fuente para analizarlo y crear tu propio proyecto de Open Source basado en este.
- Optimización de los recursos: Dada la naturaleza asíncrona de NodeJS nos permite tener una mucho mejor administración de los recursos.
- Desarrollo agiles: NodeJS permite crear aplicaciones de una forma simple y rápida, a diferencia de otros lenguajes de programación como Java o C#, que se requiere de una gran cantidad de clases para echar a volar un proyecto.
- FullStack: Dado que JavaScript se puede ejecutar del lado del servidor y del cliente, es posible crear aplicaciones de BackEnd y FrontEnd con una sola tecnología.
- Modularidad: Como ya lo hablamos, NodeJS es extremadamente modular, lo cual permite utilizar únicamente los módulos requeridos sin traernos nada de más.
Desventajas:
- Tipos dinámicos: JavaScript permite enviar como parámetro un objeto que no tiene definición, solo abres y cierres llaves {} y dentro pones lo que sea, lo que hace muy complicado saber que valores puedes enviar. Si eres programador JavaScript seguramente me quedarás colgar vivo diciendo que eso es bueno.
- Callbacks: Si bien, como ya analizamos, esto hace que se utilicen mejor los recursos, la verdad es que las callbacks son un dolor de cabeza, ya que tener funciones para cada paso es incómodo y hace muy complicado seguir el código.
- Refactor: Si alguna vez has hecho un refactor importante en un proyecto de JavaScript seguro me entenderás, pues casi nunca es posible realizar uno de forma segura, pues el tipeado débil y tipos dinámicos hacen que sea complicado para el IDE determinar cómo refactorizar.
- Librerías estándar: Esta es a mi ver una de las más fuertes, es verdad que existen librerías para todos los problemas que se te puedan ocurrir, pero el problema es que existen muchas opciones para lo mismo, haciendo complicado elegir entre una u otra. Adicional que cada una avanza a un ritmo separado en vez de unir fuerzas para mejorar una versión estándar.
- Arquitectura: En mi experiencia las aplicaciones NodeJS tiene un nivel de arquitectura muy por debajo de los lenguajes de programación tradicional como Java o C# pues en NodeJS todo se basa en funciones que son enviadas y exportadas de clases. Y es raro ver que se implementan patrones arquitectónicos o patrones de diseño (desde mi experiencia).
Conclusiones
A mi ver NodeJS es sin duda una de las tecnologías más prometedoras del futuro, dado que JavaScript se está convirtiendo en el lenguaje de programación rey. No me extrañaría que JavaScript termine desplazando a lenguajes como Java o C#, un que para esto falta tiempo.
Creo que empezar a apostar por NodeJS en este momento puede ser una muy buena inversión, pues cada vez empezaremos a ver más y más proyectos desarrollados con NodeJS y estas aplicaciones necesitarán de desarrolladores.
Una forma de manejar el callback hell es por medio de “Promises” . Los Promises forman parte de ECMAScript 2015 y estan disponibles en versiones recientes de NodeJS.
Hola Mike,
Es verdad las promesas ayudan bastante en forma en que escribimos código, un que también tienen sus detalles, pero definitivamente si ayudan a escribir un código más limpio
Hola Oscar, Cuales son los detalles que tienes las promesas? del lado del backend son geniales `lo unico que le veo es cuando recien las usas causa dolor de cabeza, si no conoces javascript ya que la naturaleza asincrona no te va a esperar a que se resuelva para ejecutar el siguiente paso`. en casos de ocupar esperar que es mas del lado del cliente se usan generadores y tienes codigo limpio y bastante mantenible.
`al menos nunca he tenido necesidad de esperar a que resuelva en el lado del server`.
Hola Roberto, gracias por tu comentario,
Primero que nada, déjame aclarar que cuando digo “detalles” no me refiero a que sean malas, ya que JavaScript funciona de forma asíncrona y lo hace muy bien. Lo que quiero decir es que las promesas también requieren se su anidación correspondiente de funciones o arrow functions para cada then y el catch. Entonces, como tu bien lo dices, para los que no están acostumbradas a eso, es extremadamente verboso y se vuelve un verdadero dolor de cabeza, pero como también mencionas, una vez acostumbrado pues ya debería de ser un proceso natural.
Finalmente y complementando el comentario de Mike, NodeJS incorpora las promesas nativas en ES6, pero también existen librerías como “Q” la cual nos permite tener promesas en versiones anteriores de NodeJS.
Hola.
Buena noche.
Me gustaria saber si la imagen que muestras en la parte superior, de la arquitectura de node.js fue de su elaboracion propia o la tomo de algun libro. lo que pasa que estoy haciendo mi tesis de maestria, y la quiero ocupar