La hoja de ruta para desarrolladores de Node.js para 2021
Node.js ha sido uno de los que más ha cambiado las reglas del juego desde su lanzamiento, compañías más grandes como Uber, Medium, PayPal y Walmart cambiaron su pila tecnológica a Node.js. Puede crear aplicaciones realmente poderosas con Node.js, como aplicaciones de seguimiento en tiempo real, motores de chat de video y texto, aplicaciones de redes sociales, etc. Y aprender Node.js se está convirtiendo en una de las mejores habilidades para los desarrolladores, la hoja de ruta que tengo preparado se basa en cómo aprender por propia experiencia. Antes de profundizar en esta hoja de ruta de Node.js, asegúrese de tener un objetivo claro y conciso de lo que desea construir con Node.js, de lo contrario, se rendirá entre la ruta de aprendizaje como lo hice yo. Mantener un objetivo lo ayudará a concentrarse en aprender las habilidades esenciales en la parte superior, en lugar de averiguar si necesita aprenderlas o no.
Hoja de ruta – Prerrequisitos
1 .JavaScript
Si usted es un desarrollador de frontend que busca dominar algunas habilidades de backend, no tiene que dedicar una gran cantidad de tiempo a aprender JavaScript antes de comenzar a crear aplicaciones Node.js. Pero en caso de que sea un principiante que busque dominar Node.js en el menor tiempo posible, debe aprender los siguientes conceptos antes de sumergirse en el entorno de Node.js.
- Arrow Functions
- Types
- Expressions
- Functions
- Lexical Structures
- this
- Loops and Scope
- Arrays
- Template Literals
- Strict Mode
- ES6 / ES7
En Node.js manejará mucha programación asincrónica y para eso, se recomienda aprender los siguientes conceptos.
- Timers
- Promises
- Closures
- The Event Loop
- Async programming and callbacks
2. NPM
Node Package Manager es el registro de software más grande del mundo con más de 800.000 paquetes de códigos. Usar NPM de la manera correcta puede ayudar mucho, ya que administrar paquetes se vuelve bastante útil con NPM mientras desarrollamos aplicaciones que requieren una serie de dependencias.
NPM consta de tres componentes distintos:
- La interfaz de línea de comandos (CLI): se ejecuta en el entorno de terminal de la máquina y cómo la mayoría de los desarrolladores interactúan con NPM
- El Registro: una gran base de datos pública de software JavaScript y metainformación.
- El sitio web: puede descubrir nuevos paquetes y administrar otros aspectos de su experiencia npm.
NPM se usa para administrar múltiples versiones de código y dependencias de código, ejecutar paquetes sin descargarlos (usando npx) y muchos más.
3. Conceptos básicos de Node.js
Emisores de eventos: Son objetos en Node.js que desencadenan eventos al enviar un mensaje para indicar que se completó una acción. También podemos escribir nuestro propio código que escuche eventos de un emisor de eventos. Por ejemplo, si ha realizado algún trabajo de interfaz, entonces probablemente sepa cuánta interacción necesitamos manejar en nuestras aplicaciones, como clics del mouse, pulsaciones de botones del teclado y otros movimientos del mouse. De manera similar, en el entorno de backend en Node.js, podemos construir un sistema similar usando el módulo de eventos, que ofrece la clase EventEmitter que usamos para manejar nuestros eventos.
Callbacks: son funciones a las que se llama cuando se completa una tarea, lo que evita cualquier tipo de bloqueo y, mientras tanto, permite que el resto del código se ejecute. Como tenemos que trabajar con muchas tareas asincrónicas en Node.js, las necesitamos en todas partes para crear aplicaciones más rápidas y sin problemas. Por ejemplo,
Buffers: una clase llamada Buffer en Node.js está diseñada para manejar datos binarios sin procesar. Corresponden a algo de memoria bruta asignada fuera de V8. Los búferes son una matriz de números enteros cuyo tamaño no se puede cambiar al tener un montón de métodos específicos para datos binarios. Por ejemplo, los enteros en el búfer representan un byte con valores limitados de 0 a 255 inclusive, si consola.log () para imprimir una instancia de búfer, se recibirá una cadena de valores en hexadecimal.
Sistema de módulos: como parte del ecosistema de Node.js, utilizará el módulo para implementar funciones complejas con solo usar los módulos proporcionados por Node.js, estos son archivos JavaScript que contienen todas las características organizadas y complejas que cualquiera puede reutilizar. la aplicación Node.js.
Habilidades de desarrollo
Sistemas de control de versiones (Git, GitHub): no querrá estar en una situación en la que estropee algo en su código sin tener idea de cómo revertirlo. Al usar VCS como Git, puede administrar proyectos a gran escala y si ya está bastante familiarizado con el uso de VCS, asegúrese de tener un sólido fundamento de los sistemas de control de versiones.
Protocolos HTTP / HTTPS: un conocimiento fundamental de cómo se transfieren los datos utilizando los protocolos de transferencia lo convertirá en un mejor desarrollador de Node.js, una buena comprensión de cómo funcionan HTTP y HTTPS es algo que todo desarrollador de backend debería comprender lo suficientemente bien. HTTPS utiliza un protocolo de cifrado conocido como Transport Layer Security (TLS) para cifrar las comunicaciones. Hay mucho que aprender en el entorno de backend y podría resultar un poco confuso para usted si no tuviera idea de cómo funciona la web, hay 4 métodos de solicitud responsables de cualquier comunicación básica en la web:
- GET: se utiliza para recuperar una representación de un recurso
- POST: se utiliza para crear nuevos recursos
- PUT: se utiliza para actualizar las capacidades
- PATCH: se utiliza para modificar capacidades
- DELETE: se utiliza para eliminar un recurso identificado por una URL
- OPTIONS: Solicite la opción de comunicación permitida para una URL o servidor determinados
Marcos web
Nota: Es bueno saber todos estos marcos web, si está creando un proyecto personal con Node.js, se recomienda seguir con un marco único; de lo contrario, el camino de aprendizaje es bastante amplio para cubrir.
Express.js: proporciona una interfaz y herramientas mínimas que se requieren para construir nuestra aplicación, bastante flexible de usar, y viene con numerosos módulos disponibles en npm que se pueden conectar directamente a Express.
Meteor.js: un excelente marco de referencia para crear aplicaciones JavaScript, viene con controladores MongoDB integrados con soporte para GraphQL. Cuando ejecuta “meteor create myapp” y lo ejecuta, se proporciona una página web HTML / JavaScript con un backend de MongoDB. Puede utilizar Meteor.js como una alternativa eficaz en su lista de marcos que le ayuda a reducir el tiempo de desarrollo con facilidad de mantenimiento. De lo contrario, recomendaré seguir con Express si está creando una aplicación web simple.
Sails.js: un marco MVC le permite crear rápidamente API REST, aplicaciones de una sola página y aplicaciones en tiempo real. Si está buscando dominar algunas habilidades serias, entonces Sails.js es muy recomendable ya que obtiene muchos beneficios con él, como soporte en tiempo real con WebSockets y utiliza el enfoque de “convención sobre configuración”.
Koa.js: si está buscando crear aplicaciones sólidas que estén preparadas para el futuro y fáciles de mantener, Koa.js es una buena opción. Una aplicación Koa es un objeto que contiene una matriz de algunas funciones de middleware que luego se ejecutan en forma de pilas.
Nest.js: inspirado en Angular y construido con TypeScript, usa Express.js bajo el capó, lo que lo hace compatible con la mayoría de los middleware Express. Puede crear una aplicación eficiente y escalable con Nest.js, ya que proporciona una excelente estructura modular para organizar el código en módulos separados.
Gestión de base de datos
Mientras aprende Node.js, trabajará con muchas cosas respaldadas y, si es un principiante, debe ceñirse a MySQL o SQL al principio. Como obtendrá una aclaración clara y concisa de cómo diseñamos los sistemas backend, ir más allá de SQL o MySQL depende del caso a medida que trabaja con nuevos tipos de proyectos, hay posibilidades de que necesite aprender otras cosas del backend.
Nota: La mayoría de las veces trabajamos con bases de datos relacionales. Por ejemplo, modelamos datos como productos, categorías, etiquetas, etc. utilizando tablas. Y una tabla contiene columnas y filas similares a las que tenemos en una hoja de cálculo.
SQL Server: un sistema de administración de bases de datos relacionales desarrollado por Microsoft, es compatible con ANSI SQL (un lenguaje SQL estándar). Sin embargo, SQL viene con sus propias implementaciones.
MySQL: Otro gran sistema de administración de bases de datos que le permite crear bases de datos relacionales. Software backend de código abierto desarrollado por Oracle, también con MySQL obtenemos la flexibilidad de opciones ya que podemos cambiar el código fuente según las necesidades. MySQL es una alternativa bastante fácil en comparación con Oracle Database y Microsoft SQL Server.
PostgreSQL: desarrollado por un equipo mundial de desarrolladores ya que es de código abierto. Se ejecuta en todos los principales sistemas operativos, incluidos Linux, UNIX y Windows. PostgreSQL es compatible con una gran parte del estándar SQL al tiempo que ofrece algunas características excelentes como consultas SQL complejas, claves externas, disparadores, transacciones, control de concurrencia de múltiples versiones (MVCC), replicaciones de Streatimg, etc.
MariaDB: una versión mejorada de MySQL que incluye varias funciones poderosas incorporadas, mejoras de seguridad y rendimiento que no encontrará en MySQL. Hay varias razones por las que debería optar por MariaDB en lugar de MySQL para aplicaciones a gran escala. Por ejemplo, MariaDB tiene un grupo de conexiones más grande que admite hasta más de 200.000 conexiones, mientras que MySQL tiene un grupo de conexiones más pequeño. En resumen, MariaDB es más rápido que MySQL.
Servicios de base de datos en la nube
Azure CosmosDB: un servicio de base de datos que se distribuye globalmente, puede administrar sus datos de forma remota, el uso de bases de datos en la nube le brindó muchas ventajas, ya que escalar y administrar grandes aplicaciones se vuelve un poco fácil con la herramienta que puede usar para escalar y distribuir, todo proporcionado por Microsoft Azure. Además, admite múltiples modelos de datos usando un backend, lo que significa que se puede usar para los modelos de documento, clave-valor, relacionales y de gráficos. Como no se basa en ningún esquema, puede llamarlo una base de datos NoSQL, pero admite el lenguaje de consulta con soporte para transacciones ACID.
Amazon DynamoDB: hasta donde yo sé, Amazon DynamoDB es una gran alternativa si ya tiene algo de experiencia con SQL, es un servicio de base de datos NoSQL totalmente administrado que proporciona un rendimiento más rápido y predecible con una escalabilidad asombrosa. Puede crear tablas de bases de datos que puedan almacenar y recuperar cualquier cantidad de datos y atender cualquier nivel de tráfico de solicitudes.
Bases de datos NoSQL
MongoDB: una base de datos NoSQL orientada a documentos que se utiliza específicamente para el almacenamiento de datos de gran volumen, ya que tenemos tablas y filas en otras bases de datos relacionales, MongoDB utiliza colecciones y documentos. Un documento consta de pares clave-valor que son solo una unidad básica de datos en MongoDB y la colección contiene conjuntos de documentos y funciones que son equivalentes a las tablas de bases de datos relacionales.
Redis: Con Redis podemos trabajar con bases de datos, almacenamiento en caché y corretaje de mensajes. Utiliza estructuras de datos como cadenas, hashes, listas, conjuntos, mapas de bits, hiperloglogs e índices geoespaciales para almacenar datos en forma de pares clave-valor. Si está confundido acerca de dónde usamos Redix, aquí hay un ejemplo de eso:
Digamos que en nuestra aplicación tenemos que tratar con usuarios que están autorizados para realizar diferentes acciones dentro de la aplicación, cada vez que autenticamos a un usuario tenemos que derivar su autorización para controlar el acceso en la aplicación. tenemos buenos estándares como JOSE mientras mantenemos seguro nuestro material clave, pero si nuestra aplicación tiene más de un par de autorizaciones, la misma se vuelve muy difícil de escalar. Y en lugar de enviar la lista de autorización al usuario, podemos almacenar la autorización del usuario en alguna forma de base de datos y proporcionar al usuario un valor clave (conocido como token) que debe enviarnos para su autorización.
Apache Cassandra
Una base de datos altamente escalable con alto rendimiento y distribuida diseñada para manejar una gran cantidad de datos en muchos servidores, sin un solo punto de falla. Creado en Facebook, se diferencia de otros sistemas de gestión de bases de datos relacionales. El diseño distribuido se basa en DynamoDB de Amazon y el modelo de datos en BigTable de Google.
LiteDB
Una base de datos incrustada .NET NoSQL muy ligera y rápida, con almacenamiento de documentos sin servidor. Puede usar LiteDB en pequeñas aplicaciones de escritorio y pequeñas aplicaciones web que usan una base de datos por almacén de cuentas por usuario.
Motores de búsqueda
Nota: Si está pensando por qué necesitamos un motor de búsqueda, aquí hay un ejemplo, usamos Google como motor de búsqueda, pero esa es en sí misma una aplicación basada en la web. Solr y ElasticSearch son frameworks de back-end y si se proporciona algún tipo de conjunto de datos, crea un índice además de eso mientras hace que los datos estén disponibles para la búsqueda en un servidor. Puede mantener un sitio web con millones de usuarios con Solr como motor de búsqueda.
ElasticSearch
Un motor de búsqueda y análisis construido sobre Apache Lucene y desarrollado en Java. Con ElasticSearch puede almacenar y analizar grandes volúmenes de datos en tiempo real. Dado que busca en el índice en lugar de buscar en el texto, ElasticSearch también logra un excelente rendimiento de búsqueda. En esencia, utiliza documentos basados en estructura en lugar de tablas y esquemas que vienen con extensas API REST para almacenar y buscar datos. Puede pensar en ElasticSearch como un servidor que procesa solicitudes JSON y le devuelve datos JSON.
Solr
Proporciona capacidades de búsqueda en tiempo real bastante avanzadas, como búsqueda de campo, consultas booleanas, consultas de fase, consultas difusas, revisión ortográfica, autocompletar y muchas más.
Almacenamiento en caché
El almacenamiento en caché es simplemente el proceso de almacenar copias de archivos en la memoria caché para que sean accesibles para respuestas de red más rápidas al reducir las llamadas de red.
Memoria caché
Esta técnica también se denomina comúnmente almacenamiento en caché, ya que la mayoría de las veces, el almacenamiento en caché está asociado con la memoria en los servidores. En esta técnica, una parte de la memoria del servidor se utiliza como caché donde almacenamos todos los datos necesarios para reducir las llamadas de red en nuestras aplicaciones. En Node.js tenemos node-cache y memory-cache como algunas de las grandes bibliotecas para manejar la memoria caché en un servidor Node.
Caché distribuido
En esta técnica de almacenamiento en caché, combinamos la memoria de varias redes en un único almacén de datos de memoria que luego usamos como caché de datos final para demostrar un acceso rápido a los datos. Esta técnica se utiliza especialmente en un gran volumen de datos y una gran cantidad de llamadas de red al mismo tiempo permite la expansión y el escalado incrementales al agregar más memoria del servidor al clúster. Redis es una de las cosas más conocidas cuando se trata de almacenamiento en caché distribuido, pero puede ir más allá aprendiendo Memcached.
Motores de plantillas
Usando motores de plantilla podemos usar archivos de plantilla estáticos en nuestra aplicación, mientras que en el tiempo de ejecución este motor de plantilla reemplaza las variables en un archivo de plantilla con valores reales y luego transforma la plantilla en un archivo HTML enviado al cliente. A continuación se enumeran algunos de los motores de plantillas más populares.
- Moustache.js
- Bigote daliniano
- EJS
Comunicación en tiempo real
Socket.io
Hay mucho en lo que respecta a la comprensión de la comunicación en tiempo real en Socket.IO si recién está comenzando como desarrollador de backend, la lógica principal detrás de la comunicación en tiempo real se encuentra entre el cliente y el servidor. Permite el flujo de datos bidireccionales entre el cliente y el servidor, puede pensar en el flujo de datos bidireccional como el flujo síncrono de datos entre dos terminales para lograr el comportamiento de comunicación en tiempo real, estos tipos de comportamiento se habilitan cuando el El cliente tiene Socket.IO en el navegador junto con el servidor integrado con el paquete Socket.IO. Y los datos se pueden enviar en forma de solicitudes JSON.
Clientes API
REST
Antes de REST, las API se desarrollaban en torno a una llamada a procedimiento remoto (RPC) y las API parecían un código ejecutado localmente. Muchas tecnologías intentaron resolver este problema utilizando pilas similares a RPC para ocultar el problema de raíz y, después de eso, se introdujo REST para crear API basadas en la web de una mejor manera.
En REST, la arquitectura está diseñada con simples llamadas HTTP para comunicarse en lugar de opciones complejas como COBRA, COM +, RPC. En REST, las llamadas se basan en mensajes y se basan en los estándares HTTP para describir estos mensajes. En el ecosistema Node.js, puede optar por node-rest-client y Axios, ambos ofrecen un servicio bastante bueno para aplicaciones web más rápidas.
GraphQL
GraphQL, una excelente alternativa a REST, utiliza las API que priorizan brindar a los clientes exactamente los datos que solicitan. Una alternativa flexible y amigable para el desarrollador, ya que puede implementarla incluso en un IDE conocido como GraphiQL. También obtiene las ventajas de agregar o desaprobar campos sin afectar las consultas existentes y crear API con el método que prefiera.
Pruebas
Marcos de pruebas unitarias
En Unit Testing, probamos unidades / componentes individuales de forma aislada, donde una unidad puede ser la parte más pequeña de código que se puede probar en una aplicación. En Node.js, uno de los mejores marcos de pruebas unitarias se enumeran a continuación:
- Jest: un marco de prueba muy popular conocido por su simplicidad y desarrollado por Facebook. Entre todos los marcos de prueba, Jest tiene la mejor documentación con soporte de pruebas paralelas, lo que significa que puede ejecutar cada prueba en su propio proceso para maximizar el rendimiento.
- Mocha: sirve a los antiguos estándares de marcos de pruebas unitarias para aplicaciones de nodo y admite operaciones asíncronas como devoluciones de llamada, promesas con aserciones altamente extensibles y personalizables.
- Chai: se puede usar junto con Mocha y se puede usar como una biblioteca de aserciones TDD / BDD para Node.js que se puede combinar con cualquier marco de prueba basado en JavaScript.
Mocking
En Unit Testing, la prueba debe ser pequeña y liviana de realizar, pero hay objetos bajo prueba que tienen dependencias de otros objetos.
Por ejemplo, los objetos que necesitan comunicarse con un servidor o hablar con un servicio web, debido a eso, perdemos la capacidad de ejecutar pruebas de una manera rápida y liviana, y ahí es donde entra en acción Mocking. En Mocking, no necesitamos ningún tipo de base de datos real o ningún tipo de conexión para ejecutar nuestra prueba, solo devuelve el objeto con los resultados esperados. Entonces, solo hay objetos simples que simulan los resultados reales para que podamos ejecutar pruebas más rápido sin limitaciones.
Algunas bibliotecas que conviene conocer para Node.js
- Async.js
- PM2
- Commander.js
- Nodemailer