¿Qué hay de nuevo en Node?

Rate this content
Bookmark

Esta charla te guiará a través de algunas de las características geniales en Node que podrías haber pasado por alto.

35 min
05 Jun, 2023

Video Summary and Transcription

La versión 20 de Node introduce características de permisos experimentales y ejecutables únicos. La bandera experimental de carga y import.meta.resolve brindan a los desarrolladores control sobre la carga y resolución de módulos. Node 20 incluye características estabilizadas como el conjunto de pruebas, métodos de manipulación de arrays, búferes de arrays redimensionables y búferes de arrays compartidos. Las actualizaciones destacadas en Node 20 incluyen la bandera vFlag de Regex, top-level await e iniciativas estratégicas. Se destacan las API promisificadas, la API de Web Crypto, el control de aborto y los streams. Otras características mencionadas son la API de archivos, el objeto Intl y el Shadow Realm.

Available in English

1. Introducción a las características de Node

Short description:

Hola, JS Nation. ¿Qué hay de nuevo en Node? En esta charla, te mostraré algunas características de la versión 19 y algunas de la versión 18 y definitivamente muchas de la versión 20. La versión 20 de Node introduce características de permisos experimentales que te brindan control sobre el proceso. Puedes permitir o denegar permisos para el sistema de archivos, procesos secundarios o hilos de trabajo. Otra característica son los ejecutables únicos, que te permiten empaquetar una aplicación independiente en un solo archivo binario que puede ejecutarse en cualquier sistema operativo sin necesidad de Node.

Hola, JS Nation. ¿Qué hay de nuevo en Node? Soy Hemant. Soy un gerente de ingeniería senior en PayPal. Soy delegado de TC 39 y experto en desarrollo web y pagos de Google. Puedes encontrarme en htman.com o enviarme un tweet a GNU month.

Si observas la línea de tiempo de hoy para las diferentes versiones de Node y su estado, la versión actual es la versión 19 y tenemos la versión 20, 20.0.1 para ser precisos, que se lanzó recientemente. En esta charla, te mostraré algunas características que quizás conozcas o que te hayas perdido de la versión 19 y algunas de la versión 18 y definitivamente muchas de la versión 20, y algunas de ellas probablemente aún estén en la rama principal y puedan ser inestables. Así que echemos un vistazo.

Node versión 20. Primero, hablaré sobre las características de permisos experimentales que te dan control sobre lo que puede hacer el proceso. Puedes permitir que lea un sistema de archivos en particular o un proceso secundario. En este ejemplo, vemos que decimos node seguido de la bandera de permisos experimentales y decimos permitir escritura de FS en /temp. Y decimos permitir lectura de FS en /home/index.js y ese index.js solo podrá escribir en /temp y leer desde /home/index.js. Sí. También podemos decir permitir procesos secundarios en index.js y el permiso de proceso que tiene FS.write sería verdadero porque está permitido y process.permissions. Entonces, toma un segundo parámetro donde puedes pasar la ruta y ver si el proceso actual tiene permiso para escribir en esa ruta o no. Y eso devuelve verdadero. Si ejecutas este index.js con permisos experimentales en este ejemplo en particular, arroja un error que dice que el acceso a la API ha sido restringido. Así que puede ser sistema de archivos, puede ser proceso secundario o hilos de trabajo que se pueden controlar. También puedes denegar los permisos o verificar si están presentes o no. Así que tienes control total sobre a qué tiene acceso el proceso. Puede ser similar a algunos otros motores de tiempo de ejecución como Dino, pero esto es muy genial de ver en Node.

A continuación, tenemos ejecutables únicos. Tomemos este ejemplo donde digo echo console.log, hello process.org BF2 y lo envío a hello.js y luego copio o comando node hello desde la ruta de Node. Utilizo post-jet en npmx según el sistema operativo en el que te encuentres o en OS X u otros sistemas. Simplemente usamos este comando y tenemos que usar ese binario en particular y luego tendríamos un archivo ejecutable único. Si miramos .hello y paso la palabra, obtenemos hello word. Por lo tanto, esto resulta muy interesante para las personas que escriben aplicaciones independientes utilizando Node. Pueden empaquetarlo en un solo archivo binario y enviarlo a cualquier sistema operativo y el requisito es que el sistema operativo no necesite tener Node. Todo esto está empaquetado con Node y puede ejecutarse.

2. Experimental Loader Flag and import.meta.resolve

Short description:

Esta parte presenta la bandera de carga experimental, que brinda a los desarrolladores control sobre el proceso de carga de módulos. Al engancharse en diferentes fases del proceso de carga, como la resolución, obtención de la fuente, obtención del formato y transformación de la fuente, los desarrolladores pueden personalizar cómo se cargan los módulos. Además, la función import.meta.resolve permite resolver rutas de archivos o URL basándose en el entorno actual, lo que proporciona flexibilidad en la resolución de módulos.

Esto lo hace muy interesante para las personas que escriben aplicaciones independientes. Podemos simplemente empaquetarlo, agruparlo y enviarlo, y el usuario solo tiene que hacer clic y funciona correctamente. También tenemos la bandera de carga experimental. Lo que hace básicamente la bandera de carga experimental es brindarte control sobre el proceso de carga. Entonces, cada vez que se carga un módulo, pasa por diferentes fases donde se resuelve o se obtiene la fuente o se obtiene el formato o se transforma la fuente, y puedes engancharte en todo esto y tomar control total sobre ese proceso. En este ejemplo, tenemos loader.js que tiene resolve, get format y get source que eventualmente llama al formato predeterminado get en URL y contexto, pero puedes aplicar tu propia lógica allí para controlar cómo funciona el cargador. Esto nos brinda control total sobre la carga de módulos e inyección según nuestras necesidades. En esta parte del movimiento de cargadores esm de hilo, tenemos import.meta.resolve, que funciona en todos los entornos. Entonces, si estás en un entorno de navegador o en Node, si hicieras import.meta.resolve en este ejemplo en particular con foo, se resolvería a esa ruta de archivo. Si estuvieras en un navegador, entonces se resolvería a esa URL. Por lo tanto, import.meta.resolve funciona independientemente del entorno en el que nos encontremos.

3. Node 18.6.0 Test Suite and Array Manipulation

Short description:

En Node 18.6.0, se expuso una suite de pruebas experimental que permite el uso de describe e it dentro de Node utilizando el ejecutor de pruebas. Esta característica ahora está estabilizada y se lanzó en la versión 20. También introduce la capacidad de simular métodos durante las pruebas. Otra característica implementada en la versión 20 es la adición de los métodos isWellFormed y toWellFormed en el prototipo de cadena, lo que facilita la comprobación y conversión de cadenas Unicode. Además, la versión 20 incluye métodos como toSorted, toReverse y toSpliced, que permiten la manipulación de matrices sin modificar la matriz original. La propuesta copy-width, también implementada en la versión 20, proporciona construcciones para operar en matrices sin modificarlas. Los búferes de matriz y los búferes de matriz compartidos en resizable también están disponibles en esta versión.

Entonces, en Node 18.6.0, expuse una suite de pruebas experimental en Node: test, desde la cual podías importar describe e it. Aquí tienes un ejemplo sencillo donde importamos describe e it desde node test. Y luego decimos describe Unity plus operator y debería sumar dos números y afirmar estrictamente SQL. A propósito, en este tweet agregué it como Unity plus, pero es una operación binaria que se está realizando allí. Así que entiendes la idea. Ahora puedes usar describe e it dentro de Node utilizando el ejecutor de pruebas. Y se integra bien con tus ejecutores de pruebas existentes. Y tenemos el nodo: prueba para asegurarnos de que estamos usando el integrado de Node. Esto se expuso en la versión 18.6.0, pero está estabilizado y es una versión estable en la 20. También te brinda la capacidad de simular. En este ejemplo tenemos una constante número con valor cinco, que tiene un método add en él. Podemos decir test.mock method, simular ese add dentro de ese objeto número. Entonces, en este caso, hemos simulado add y podemos asegurarnos de que esa simulación se invoque llamando a number.add.mockCost.length para que sea uno. Así que lo hemos ejecutado en el paso anterior una vez y el valor sería uno en este caso. Esto nos permite simular métodos durante las pruebas.

IsWellFormed y toWellFormed son los otros dos métodos en el prototipo de cadena que se implementan en la 20. Entonces, si tienes una cadena de Unicode y quieres verificar si está bien formada o no, como sabemos, tendría dos partes de un Unicode y si falta una de las partes entonces puedes asumir que no está bien formada. Entonces, en este caso, estamos haciendo strings.map en cada una de esas cadenas en ese array y diciendo isWellFormed, luego devuelve si es falso o verdadero según si está bien formada o no y puedes convertirla a toWellFormed y en la segunda parte del ejemplo vemos mapeamos sobre todos esos bytes Unicode y los convertimos en una cadena bien formada. Esto facilita la identificación de si un Unicode dado está bien formado o no y luego convertirlo a toWellFormed. En este ejemplo, tenemos números que no están ordenados y luego llamamos a toSorted y pasamos una función comparadora y hacemos algo similar a numbers.sort en una matriz y esto devuelve una matriz ordenada pero los números permanecen intactos, no se modifican. Luego tenemos toReverse. Invierte la matriz pero la matriz original permanece. Luego tenemos toSpliced. Decimos 2,1 y vemos que el segundo índice desaparece pero la matriz original de números sigue existiendo. Lo mismo ocurre con width, puedes reemplazar un índice particular con una cadena en este caso es h. La matriz devuelve h y la matriz original permanece. Esto es un copy-width y es una propuesta de TC39 donde puedes, ya sabes, operar en la matriz sin modificarla y te brinda todas las construcciones que vimos en esta demostración en particular. Y esto está implementado en la 20. También tenemos búferes de matriz y búferes de matriz compartidos en resizable. Entonces puedes tener una matriz redimensionable y búferes de matriz compartidos.

4. Notable Updates and Strategic Initiatives

Short description:

En la versión 20 de Node, las actualizaciones destacadas incluyen la introducción de búferes de matriz redimensionables y búferes de matriz compartidos. La implementación del indicador vFlag de Regex simplifica el manejo de cadenas complejas. La recursión en cola dentro de WebGL y WebAssembly mejora el rendimiento. Otra característica importante es el await de nivel superior, que elimina la necesidad de un envoltorio async en archivos MJS. La propuesta fue discutida y se consideró que no era un arma de doble filo. Además, se eliminó la bandera experimental repel await, lo que permite que se ejecute sin la bandera. Las iniciativas estratégicas son discusiones en curso y sugerencias para mejorar Node.

Puedes pasar max-length a it y aquí en este ejemplo crea un búfer de matriz de tamaño 8 y el max-length es 16 y puedes verificar si es redimensionable usando resizable y luego simplemente decir resize para redimensionarlo. Lo mismo ocurre con los búferes de matriz compartidos.

También hemos implementado Regex vFlag, que es como con notación de conjunto y propiedades en la cadena, lo que facilita mucho el manejo de cadenas complejas, ya sea Unicode o ASCII o no ASCII o decimales. En este ejemplo, tenemos una Regex bastante compleja, que dice secuencia de teclas de emoji y luego también puedes usar un emoji entre comillas aquí. Estoy usando una bandera o podría ser I N seguido de X, Y, Z, de cero a nueve. Y si miras la prueba, pasa en el emoji cuatro, pasa en el guión bajo, pasa en la bandera india, pasa en, prueba I N luego prueba X en cuatro. Así que todo está integrado en esta expresión regular simple y expresiva, Con la bandera alta slash V, es posible hoy construir una matriz como esta y operar en la secuencia de emoji y otras propiedades.

Otra característica interesante que tenemos es la recursión en cola dentro de WebGL, WebAssembly. Si miras este ejemplo, en cualquier momento dado, solo habrá un Feb guión bajo en el marco, que se desenrolla antes de realizar la siguiente llamada recursiva. Entonces, si miras la segunda parte del ejemplo donde decimos, llamar a Feb guión bajo rec, solo una instancia de eso estará en el marco, lo que lo hace más performance. Y esto es, por supuesto, recursión en cola. Así que esas fueron algunas de las actualizaciones de la versión 20. Hay algunas mini-actualizaciones, pero estas son algunos de los cambios destacados. Así que veamos algunas de las otras características en diferentes versiones de node, que son interesantes.

Una propuesta sobre el await de nivel superior fue parte de TC39, estaba en la etapa 4, y algunas personas con las que he discutido en redes sociales y otras interacciones se perdieron esta parte y quería destacarlo aquí. Así que veamos cómo resolvemos una promesa usando la sintaxis await. Si dijéramos, simplemente dijéramos, await promise dot resolve en este caso, verías una sintaxis que dice que await solo es válido en una función async. Entonces, por supuesto, envolverías eso en una función async y dirías, await promise dot resolve console dot log, entonces las cosas funcionan bien. ¿Qué pasa si dijéramos, await dot promise dot resolve console dot log y debería funcionar bien? Lo hace, en MJS. Entonces, en este caso, si tienes un archivo con index.mjs, y luego dices, await promise dot resolve look-ma, y simplemente dices console dot log, en este caso funciona bien, o si tienes un tipo que sea módulo, luego dices, await promise dot resolve look-ma de nuevo, funciona bien. Y si quieres probar esto en la CLI, puedes decir que el tipo de entrada es módulo y evaluar el código que tiene await en línea, y funciona bien. Por lo tanto, ya no necesitamos un envoltorio async en archivos MJS, y no en CIS, y eso lo hace más sencillo con el await de nivel superior. Y hay una conversación interesante donde hubo un artículo que hablaba sobre cómo el await de nivel superior era un arma de doble filo, y luego hubo una discusión con el campeón que hizo esta propuesta con la otra persona que escribió el artículo sobre esto siendo un arma de doble filo, y llegaron a un consenso sobre cómo no es un arma de doble filo. Así que es muy interesante seguir la historia de esta propuesta. Y otro detalle aquí, habilité el experimental repel await en la fuente de node. Básicamente, hice un PR simple para eliminar el experimental repel await. Entonces, si tuvieras un nodo .sash y lo ejecutaras con await.promise.resolve sin el experimental repel await, debería funcionar, y ese PR fue aceptado. Y hoy es posible ejecutar el experimental repel await sin la bandera.

Iniciativas estratégicas. Entonces, ¿qué son las iniciativas estratégicas? Considera que las iniciativas estratégicas son algunas de las discusiones a largo plazo y sugerencias para mejorar Node básicamente.

5. Iniciativas de la Fundación Node y APIs Promisificadas

Short description:

La Fundación Node tiene varias iniciativas, incluyendo promesas básicas y aplicaciones ejecutables únicas. Estas iniciativas tienen como objetivo evolucionar diferentes APIs y propuestas a través de una gobernanza abierta. También vale la pena explorar las próximas 10 características y discusiones. Las iniciativas estratégicas incluyen APIs promisificadas como DNS.promises y fs.promises, que simplifican las operaciones asíncronas. También se demuestra el uso de temporizadores y streams con promesas. Además, la disponibilidad de la API Web Crypto en Node.js se alinea con los estándares web y las iniciativas estratégicas.

Si observas el conjunto completo de iniciativas, puedes tener una idea de las diferentes direcciones que toma. Puede ser en términos de gobernanza, o puede ser en términos de trabajadores o estándares web abiertos, evaluaciones de SSL abiertas y cosas así. Actualmente, algunas de las iniciativas que están en progreso hoy son las promesas básicas y hemos visto aplicaciones ejecutables únicas. Así que hay estas diferentes iniciativas que la Fundación Node toma en consideración y esto es una gobernanza abierta. No es dirigido por un conjunto particular de entidades, es una gobernanza abierta, puedes proponer y participar y ayudar a evolucionar diferentes APIs y propuestas. Es un espacio muy interesante. También es interesante el próximo 10. Echa un vistazo al próximo 10, que habla sobre las características próximas y muchas discusiones abiertas allí.

En las próximas diapositivas, hablaremos sobre algunas de las APIs promisificadas, parte de las iniciativas estratégicas. En este caso, hemos requerido DNS.promises, tomamos un resolutor y luego un nuevo resolutor. Y para ese resolutor, establecemos un servidor de 444, el DNS y luego decimos resolver.resolve para example.org y podemos hacerlo luego o en el nivel superior de ello, si eres un MGS o una función NG, si no lo eres. Básicamente, es prometido, ya sabes, el módulo integrado de DNS está promisificado y puedes usarlo en tu código simplemente diciendo promises. Y tenemos node: Fs/promises, el prefijo node allí se asegura de que no sea una biblioteca del usuario, sino que sea una biblioteca dentro de node. Así que agregarías un prefijo node/Fs/promises para obtener el archivo promesa de open para FS. Así que podrías hacer await open en algún archivo y seguir adelante y leerlo. En este ejemplo, también estamos usando un stream web legible en el archivo. Y para usar un bucle for-await, estamos registrando cada fragmento. Y finalmente, estamos esperando cerrar el archivo con file.close(). Esto lo hace muy preciso y fácil de leer. También podrías usar await en el nivel superior y tener el poder de las promesas de FS/promises. De manera similar, tenemos temporizadores que son promisificados. Puedes usar set-timeout, set-immediate, set-intervals y time-of-promises. En este ejemplo, estoy usando set-timeout donde puedes decir await set-timeout de cien y resultado y trae el resultado después del tiempo especificado.

Aquí tienes un ejemplo de uso de streams en FS/promises legible, donde todo lo que estamos haciendo aquí es recorrer esos archivos grandes de archivo a archivo tres y para cada archivo donde tomamos el estado y luego vemos si el tamaño de ese archivo es mayor que mil, cuatro mil, veinticuatro mil con una concurrencia de dos, luego los marcamos como archivos grandes y recorremos todos los archivos que cumplan ese criterio de tamaño. Hubo una solicitud en el repositorio de Node.js con un problema, diciendo que necesitamos obtener la API web crypto. Así que la solicitud aquí fue, hey, tenemos la API crypto, el web crypto que está disponible en Chrome. ¿Por qué no? Lo tenemos en node y cumplimos con los estándares web, que también es parte de las iniciativas estratégicas. Así que hoy en día tenemos crypto. Puedes decir require crypto/WebCrypto y obtener en este caso, solo requieres el WebCrypto. Y en este caso, estamos generando una clave. Elegimos usar una longitud de 256.

6. Web Crypto API, Abort Control, and Streams

Short description:

En Node.js, puedes utilizar la API Web Crypto para firmar, verificar y codificar datos. Sin embargo, se debe tener precaución, ya que es fácil hacer un uso incorrecto de las primitivas criptográficas de bajo nivel. La función experimental de control de aborto permite un mejor control sobre las operaciones asíncronas, como establecer tiempos de espera y manejar señales de aborto. El módulo 'util' de Node proporciona una forma conveniente de escuchar las señales de aborto y tomar medidas en consecuencia. Además, Node.js admite streams, que se pueden utilizar para implementar características como streams legibles y monitoreo de rendimiento.

Y puedes firmar y verificar usando un nuevo codificador de texto y puedes codificar eso en este caso, estás diciendo 'Me encantan los cupcakes'. Y luego puedes evadir y darle un nombre de 'hamack' y pasar la clave y el mensaje, y obtendrás el resumen. Básicamente, así es como funciona Crypto, es posible hacerlo en Node con los datos. Pero eso viene con una advertencia, la API Web Crypto proporciona un número de primitivas criptográficas de bajo nivel. Es muy fácil hacer un uso incorrecto de ellas y tener problemas sutiles. Así que si estás trabajando con algo como Web Crypto, debes ser consciente de estas sutilezas y estar atento a algunas de las implicaciones de seguridad que esto conlleva.

Aquí está la PR que se hizo para tener el control de aborto experimental, que está implementado actualmente. Puedes usar un nuevo control de aborto, que te proporciona una señal. En este caso, estamos utilizando 'readline' y le estamos haciendo una pregunta al usuario en la CLI, diciendo '¿Cuál es tu comida favorita?'. Y le pasamos la señal. Y luego decimos 'Oh, no'. Así que tu comida favorita es lo que el usuario responda, luego puedes agregar un escuchador de eventos llamado 'abort' a la señal. Y si hay una señal de aborto que se activa, entra en este bloque, esta devolución de llamada aquí y luego muestra en la consola 'La pregunta de la comida se agotó el tiempo'. Ahora, estamos estableciendo un tiempo de espera de tantos milisegundos y luego pasando 'abort' como señal. Así que si el usuario no responde en esos tantos milisegundos, dirá que la pregunta de la comida se agotó el tiempo. Así que tienes un control total sobre el control de aborto. El controlador tiene otras características, como lidiar bien con 'fetch'. Y por ejemplo, si el usuario presiona 'descargar' o 'descargar y guardar archivo' y se cancela, entonces quieres abortar eso y tener el control sobre cuándo abortar o ser abortado o cómo abortar y todo eso. Puedes hacer una promesa y no romperla, pero aún así puedes abortarla, ¿verdad?

El módulo 'util' de Node también expone el método 'aborted', que te proporciona una devolución de llamada cuando algo que depende se aborta. En este caso, obtenemos algo que es abortable. Eso es lo que depende cuando dependo de un evento, que está llamando a 'dependiente' o 'abort'. Vuelve a la devolución de llamada abortada y tienes control sobre esto. 'Util' hace que sea más fácil escuchar esa señal en particular y la dependencia. Y cada vez que se activa la señal de aborto, puedes hacer algo basado en lo que has decidido hacer cuando se aborta.

Los streams se implementaron en 'WGStreams', esto también fue una implementación experimental. Podemos usar streams como parte de ella, si no toda la implementación. Aquí tienes un ejemplo de cómo importamos streams legibles con 'node:stream/web', asegurándonos de que sea parte de los estándares web en los streams legibles. Y luego podemos decir 'node:timer/promises setInterval' como cada. Y también estamos usando el código 'node:performance' para obtener el rendimiento. Y estamos creando un stream legible, que en el controlador se ejecuta cada segundo y encola el rendimiento. Ahora, y luego usamos un bucle 'for of' con 'await' y registramos el valor desde el stream.

7. Node Stream, Fetch, Form Data, and More

Short description:

Los streams legibles facilitan las cosas con todas las capacidades de los streams y cumplen con los estándares web. Puedes usar una lógica similar en Node hoy en día. Otro ejemplo implica el uso del módulo node:stream/promises para crear un pipeline y convertir Archive.tar en archive.tar.gz utilizando gzip. La función experimental fetch te permite hacer solicitudes HTTP en Node, y puedes usarla sin la bandera experimental. Los datos de formulario, la API de solicitud, el decodificador y codificador de texto, y la importación experimental de red son otras características útiles disponibles en Node.

Los streams legibles hacen que las cosas sean más fáciles con todas las capacidades de los streams y también cumpliendo con el estándar web. Si estás familiarizado con estas cosas desde los estándares web, puedes usar una lógica similar aquí en Node hoy en día. Aquí tienes otro ejemplo donde tenemos node:stream/promises que toma un pipeline y toma FS y todas estas funciones, lo que estas tres líneas hacen es tomar Archive.tar y crear un gzip y convertirlo en archive.tar.gz. Y cuando lo pasas al pipeline, creamos un stream legible en archive.tar y usamos gzip para crear un stream gzip y luego creamos un stream de escritura en archive.tar.gz. Y eso es todo. Simplemente puedes ejecutar 'run' y puedes usar 'catch' en este caso, al igual que 'console.error' si hay algún error que aparezca mientras conviertes tar a targz. El fetch experimental en Node en este ejemplo se alojó en un servidor en Heroku hace mucho tiempo, que enviaría una imagen XKCD aleatoria. Por lo tanto, podemos usar fetch hoy en día en Node, utilizando el fetch experimental que estaba en la versión 18 y usando 'await fetch' y '.json', obtendrás un JSON aquí. Por supuesto, no se recomienda usar 'await' en línea por razones de rendimiento y legibilidad. Pero en este ejemplo, solo quería demostrar que podríamos usar fetch dentro del REPL de Node donde estamos usando 'await' en la parte superior y haciendo '.json' para obtener la respuesta. En la versión nightly de Node, el fetch estaba allí en la versión 18, donde no necesitábamos la bandera. Y si usas 'fetch' sin la bandera experimental, obtendrás 'fetches not defined'. Y hoy en día puedes usarlo y no está detrás de las banderas. Si miras esta PR que se fusionó, habilitó fetch de forma predeterminada. Por lo tanto, solo tienes que decir 'fetch' y debería funcionar bien. Con eso, también obtenemos los datos de formulario. Los datos de formulario son la API estándar web y se comporta de manera similar aquí. En este ejemplo, estoy creando un nuevo formulario y agregando un nombre y HM, y luego puedes usar 'append' para obtener todos los valores establecidos y todo eso, lo que haces con los datos de formulario, lo que facilita el manejo y envío de formularios en Node. También obtienes la API de solicitud. En este ejemplo, podemos hacer una nueva solicitud en example.com con el método 'post' y el cuerpo 'FUBAR', podemos hacer 'request.url' para obtener la URL, 'request.method' para obtener el método, 'request.credentials' para obtener las credenciales de la solicitud y 'request.body' para obtener el cuerpo utilizado. Básicamente, todo lo que está en la API de solicitud estándar es posible en Node hoy en día. En este ejemplo, tenemos el decodificador y codificador de texto. Ya vimos parte de esto en ejemplos anteriores, tenemos una matriz de 80 bytes con esos bytes en ella, y luego usamos 'textDecoder' para decodificar esos 80 bytes, que es 'Hullabaloo'. Y en el otro ejemplo, tomamos la cadena a codificar, que es 'Hullabaloo', usamos el nuevo 'textEncoder' y luego pasamos 'encoder.encode' para codificar la cadena, obtenemos de vuelta la matriz de 80 bytes que usamos en la línea inicial. Esto nos ayuda a decodificar y codificar texto. La importación experimental de red es interesante, donde puedes importar MGS desde la red. En este ejemplo, alojé 'Hullabaloo-word.mgs' en h-simon.com. Simplemente puedes decir 'import Hullabaloo from mond.com/Hello-word.mgs' e invocar 'Hullabaloo', que mostrará 'Hullabaloo'. Y esto es posible en tu entorno local para pruebas.

8. CDN, Assert on Type JSON y Importaciones Dinámicas

Short description:

Imagina tu CDN o dividir las dependencias en varias piezas dentro de tu red. Hay argumentos sobre código malicioso en las URL. El assert on type JSON asegura que el contenido importado sea JSON, evitando importar JS como JSON. Esto también se aplica a las importaciones dinámicas.

Así que imagina esto más como tu CDN, o si quieres dividir tus dependencias en varias piezas y pasarlas dentro de tu red, que se pueden usar desde diferentes equipos que dependen de la misma dependencia. Correcto.

Esto es interesante, pero también hay algunos argumentos con personas que dicen qué pasaría si hay un código malicioso en la URL y cómo lo manejamos y cosas así. También tenemos assert on type JSON, que está muy en línea con lo que estábamos discutiendo en la línea anterior. Se asegura de que la importación dinámica también sea posible, pero con el assert diciendo que, `Oye, lo que estamos importando es definitivamente JSON, así que no puedes simplemente importar intro desde una URL o un paquete en JSON, podría ser JS y tener la extensión .JSON, pero assert se asegura de que el tipo sea JSON y también podemos hacerlo con las importaciones dinámicas.

9. File API, Array.findLast, Intl y Shadow Realm

Short description:

Existe una API de archivos que permite operar fácilmente con archivos. En la versión 18 se implementó el método array.findLast, que puede encontrar la última aparición de un valor específico en un array. El objeto Intl proporciona diversas funciones de localización, como calendarios, sistemas de numeración y zonas horarias. También ofrece el método Intl.NumberFormat, que simplifica el formato de números según la configuración regional y el estilo deseado. Además, existe una función experimental llamada Shadow Realm, que permite la encapsulación y los ámbitos globales separados.

Hubo otra solicitud en la fuente de Node con un problema que decía que necesitaríamos la API de archivos. Y sí, hoy tenemos la API de archivos. En este ejemplo, creamos un nuevo archivo, dummy.txt.exe, y afirmamos algunas cosas a partir de lo que devuelve en el atributo de archivo, el nombre del archivo debería estar allí, lo cual está, y el tamaño del archivo es cero y la última modificación del archivo es un número y la última modificación del archivo es menor que Date.now, por supuesto, porque se creó antes de Date.now. Entonces te brinda todas las funciones que proporciona la API de archivos y es fácil operar con archivos.

En la versión 18, aquí hay un ejemplo donde tenemos un array de objetos con valores x con repeticiones de uno, dos, uno, dos, y supongamos que quieres encontrar el último, que es una propuesta de TC39 que se implementó aquí, array.findLast, donde estamos viendo que o.x es igual a uno, que es igual a array del segundo, el tercer índice del array de dos, ¿verdad? Entonces, lo cual es igual a true, o también podrías encontrar el índice. El último índice es cero y el último índice es dos en este caso, porque el cero también tiene x cuyo valor es uno. El segundo también tiene el valor, que es uno. Entonces, findLastIndex encuentra el último en el array, que es dos. El índice es dos y array.two es x, cuyo valor es uno. Entonces puedes hacer last y lastIndex en el array.

Tenemos Intl, donde puedes pasar la configuración regional. Aquí estamos pasando la configuración regional árabe, egipcia, que devuelve tus calendarios, sistemas de numeración y zonas horarias. Y también tiene este método de utilidad fácil, que dice supportedValuesOf, para el cual puedes pasar calendario, sistema de numeración, moneda, sistema de numeración y zona horaria y unidad, y eso devolvería todos los valores admitidos, como budista, chino, calendario aquí o africano y blanco y Celsius y centímetros y todas las unidades. Entonces, facilita mucho el manejo de diferentes internacionalizaciones y esfuerzos en, ya sea moneda o calendario o sistema de numeración y zonas horarias. Entonces tienes un número uno, dos, tres, cuatro, cinco punto siete, ocho, nueve, puedes hacer un formato de número de internacionalización y pasar la configuración regional que deseas y el estilo es moneda y las monedas en las que estás, en este caso, se formatea en función de esa configuración regional y también se agrega el símbolo de libra. Dice uno, dos, tres punto cuatro, cinco, seis, siete, nueve libras. Y lo mismo para japonés y también puedes limitarlo a tres dígitos significativos. Aquí hay un ejemplo para E y I, en el que formateamos con un máximo de tres dígitos significativos, dice uno, dos, tres, cero, cero, cero. Correcto. Entonces, facilita mucho el manejo de números en términos de manejar monedas, que es un caso de uso bastante común. También tenemos Shadow Realm experimental. En este caso, creamos un nuevo Shadow Realm y creamos el Shadow Realm y dentro del Shadow Realm tenemos evaluate donde decimos que globalThis.realmValue es igual a inner. Y luego tenemos un getter que devuelve globalThis.realmValue. Mira la igualdad aquí. Cuando hacemos un getter, obtenemos inner. Pero si comprobamos el valor real en globalThis, simplemente falla. Entonces puedes pensar en Shadow Realm como esa caja que no está expuesta al globalThis, pero también puede tener su propio globalThis donde puedes operar y agregar valores sin filtrarse en el ámbito global, ¿verdad? Entonces ese valor no está en globalThis, pero el getter devuelve inner, que tiene su propio globalThis. Entonces, Shadow Realm lo hace interesante. Y la encapsulación y, por supuesto, también trae todos los demás aspectos de Shadow Realm en el estándar.

10. Características y Mejoras de Node

Short description:

Introdujimos una clase de bloque para buffers en Node 18 y superior. El ejemplo del canal de mensajes demuestra cómo pasar un blog y operar en él. La clonación estructural permite mantener mutaciones durante la clonación profunda. Node util proporciona una forma sencilla de analizar argumentos. Process.on multiple resolves ayuda a capturar promesas resueltas varias veces. OS.availableParallelism da una pista sobre la capacidad de paralelismo. Reemplazar el analizador de URL con Ada mejora la velocidad de análisis de URL. La función node --watch permite un comportamiento similar a la recarga de módulos en caliente. Estas son algunas de las nuevas y geniales características de Node.

Así que tuvimos un año que fue muy, demasiado, que decía que bloque de graduación de experimento para exponer a global. Entonces, si requieres un buffer en la versión 18 y superior, tendrías una clase de bloque, que se expone en global y también puedes importarlo con node buffer como un bloque. En este ejemplo, estoy usando dos canales de mensajes y tengo un blog con el mensaje 'hola'. Y todo lo que estamos haciendo es pasar ese blog desde el canal de mensajes, enviar el mensaje y recibirlo y luego mostrarlo en la consola cuando se recibe el mensaje con los datos o un buffer. La parte interesante es que el blog sigue siendo utilizable. Después de enviarlo, puedes hacer blog.test y blog.text para obtener el valor del mensaje del blog, que se muestra en este caso. Así que este es un ejemplo de cómo usar blobs y buffers y canales de mensajes para mostrar cómo se puede pasar el mensaje, básicamente el blog, y operar en él. La clonación estructural es otro ejemplo. En este caso, tengo una pizza vegetariana con ingredientes como tomates, pimientos, cebollas y maíz. Puedes agregar un ingrediente más, como piña, después de hacer una clonación estructural de la pizza vegetariana. Así que la pizza vegetariana sigue teniendo los mismos ingredientes. Y estoy agregando piña. Sé que a muchas personas no les gustaría eso. Así que tengo una pizza vegetariana con piña, que se muestra en la consola. Pero la pizza vegetariana o los ingredientes siguen ahí, lo que significa que se mantiene la mutación y también se puede hacer una clonación profunda, lo cual no era realmente posible hasta que tuvimos la clonación estructurada.

Node util también nos proporciona parse args, que es una utilidad. Por ejemplo, si tienes argumentos con guiones, guiones, guiones, barra y b, y tienes opciones para foo y bar, simplemente puedes analizar los argumentos y obtener los valores y las posiciones. En este ejemplo, se imprimirá un objeto con un prototipo nulo, pero no tenemos foo como verdadero y bar como b porque esas son las opciones que pasamos. Esos son los argumentos que tenemos. Así que facilita mucho el análisis de argumentos utilizando node util, una utilidad integrada en lugar de depender de un módulo externo.

A veces, tu promesa puede resolverse varias veces. Es más fácil capturarlo con process.on multiple resolves, que se activa cuando la promesa se resuelve varias veces y ayuda a depurar las situaciones en las que la promesa se resuelve dos veces. En la versión 19.7 y superior, tenemos OS.availableParallelism, que nos da una pista sobre la capacidad de paralelismo de ese sistema operativo en particular y devuelve 16 como número. También hubo una interesante solicitud de extracción en la que se reemplazó el analizador de URL con Ada, lo que mejoró en un 87% la velocidad de análisis de URL en comparación con cómo se hacía anteriormente sin la implementación en C++. El último ejemplo que tengo es node --watch, donde hago un seguimiento de los cambios en el archivo food.js. En la parte superior, vemos un console.log('me out'). También nos muestra una advertencia experimental. Luego, cambio 'me out' por otra cosa, por ejemplo, 'wolf', y guardo el archivo. Se reinicia food.js y se imprime 'work'. Es como una recarga de módulos en caliente, ¿verdad? No estás cerrando el proceso y reiniciándolo después de guardar, sino que estás observando el archivo en busca de cambios y volviendo a ejecutar node. Es algo similar a nodemon, pero integrado en node hoy en día con --watch, donde también puedes observar directorios y eliminar archivos. Estas son algunas de las características geniales que son nuevas en node. Espero que te hayan gustado algunas de ellas y que algunas te sean realmente nuevas. Estoy encantado de responder cualquier pregunta. Gracias.

Check out more articles and videos

We constantly think of articles and videos that might spark Git people interest / skill us up or help building a stellar career

Node Congress 2022Node Congress 2022
26 min
It's a Jungle Out There: What's Really Going on Inside Your Node_Modules Folder
Top Content
Do you know what’s really going on in your node_modules folder? Software supply chain attacks have exploded over the past 12 months and they’re only accelerating in 2022 and beyond. We’ll dive into examples of recent supply chain attacks and what concrete steps you can take to protect your team from this emerging threat.
You can check the slides for Feross' talk here.
Node Congress 2022Node Congress 2022
34 min
Out of the Box Node.js Diagnostics
In the early years of Node.js, diagnostics and debugging were considerable pain points. Modern versions of Node have improved considerably in these areas. Features like async stack traces, heap snapshots, and CPU profiling no longer require third party modules or modifications to application source code. This talk explores the various diagnostic features that have recently been built into Node.
You can check the slides for Colin's talk here. 
JSNation 2023JSNation 2023
22 min
ESM Loaders: Enhancing Module Loading in Node.js
Native ESM support for Node.js was a chance for the Node.js project to release official support for enhancing the module loading experience, to enable use cases such as on the fly transpilation, module stubbing, support for loading modules from HTTP, and monitoring.
While CommonJS has support for all this, it was never officially supported and was done by hacking into the Node.js runtime code. ESM has fixed all this. We will look at the architecture of ESM loading in Node.js, and discuss the loader API that supports enhancing it. We will also look into advanced features such as loader chaining and off thread execution.
JSNation Live 2021JSNation Live 2021
19 min
Multithreaded Logging with Pino
Top Content
Almost every developer thinks that adding one more log line would not decrease the performance of their server... until logging becomes the biggest bottleneck for their systems! We created one of the fastest JSON loggers for Node.js: pino. One of our key decisions was to remove all "transport" to another process (or infrastructure): it reduced both CPU and memory consumption, removing any bottleneck from logging. However, this created friction and lowered the developer experience of using Pino and in-process transports is the most asked feature our user.In the upcoming version 7, we will solve this problem and increase throughput at the same time: we are introducing pino.transport() to start a worker thread that you can use to transfer your logs safely to other destinations, without sacrificing neither performance nor the developer experience.

Workshops on related topic

Node Congress 2023Node Congress 2023
109 min
Node.js Masterclass
Workshop
Have you ever struggled with designing and structuring your Node.js applications? Building applications that are well organised, testable and extendable is not always easy. It can often turn out to be a lot more complicated than you expect it to be. In this live event Matteo will show you how he builds Node.js applications from scratch. You’ll learn how he approaches application design, and the philosophies that he applies to create modular, maintainable and effective applications.

Level: intermediate
Node Congress 2023Node Congress 2023
63 min
0 to Auth in an Hour Using NodeJS SDK
WorkshopFree
Passwordless authentication may seem complex, but it is simple to add it to any app using the right tool.
We will enhance a full-stack JS application (Node.JS backend + React frontend) to authenticate users with OAuth (social login) and One Time Passwords (email), including:- User authentication - Managing user interactions, returning session / refresh JWTs- Session management and validation - Storing the session for subsequent client requests, validating / refreshing sessions
At the end of the workshop, we will also touch on another approach to code authentication using frontend Descope Flows (drag-and-drop workflows), while keeping only session validation in the backend. With this, we will also show how easy it is to enable biometrics and other passwordless authentication methods.
Table of contents- A quick intro to core authentication concepts- Coding- Why passwordless matters
Prerequisites- IDE for your choice- Node 18 or higher
JSNation 2023JSNation 2023
104 min
Build and Deploy a Backend With Fastify & Platformatic
WorkshopFree
Platformatic allows you to rapidly develop GraphQL and REST APIs with minimal effort. The best part is that it also allows you to unleash the full potential of Node.js and Fastify whenever you need to. You can fully customise a Platformatic application by writing your own additional features and plugins. In the workshop, we’ll cover both our Open Source modules and our Cloud offering:- Platformatic OSS (open-source software) — Tools and libraries for rapidly building robust applications with Node.js (https://oss.platformatic.dev/).- Platformatic Cloud (currently in beta) — Our hosting platform that includes features such as preview apps, built-in metrics and integration with your Git flow (https://platformatic.dev/). 
In this workshop you'll learn how to develop APIs with Fastify and deploy them to the Platformatic Cloud.
JSNation Live 2021JSNation Live 2021
156 min
Building a Hyper Fast Web Server with Deno
WorkshopFree
Deno 1.9 introduced a new web server API that takes advantage of Hyper, a fast and correct HTTP implementation for Rust. Using this API instead of the std/http implementation increases performance and provides support for HTTP2. In this workshop, learn how to create a web server utilizing Hyper under the hood and boost the performance for your web apps.
React Summit 2022React Summit 2022
164 min
GraphQL - From Zero to Hero in 3 hours
Workshop
How to build a fullstack GraphQL application (Postgres + NestJs + React) in the shortest time possible.
All beginnings are hard. Even harder than choosing the technology is often developing a suitable architecture. Especially when it comes to GraphQL.
In this workshop, you will get a variety of best practices that you would normally have to work through over a number of projects - all in just three hours.
If you've always wanted to participate in a hackathon to get something up and running in the shortest amount of time - then take an active part in this workshop, and participate in the thought processes of the trainer.
TestJS Summit 2023TestJS Summit 2023
78 min
Mastering Node.js Test Runner
Workshop
Node.js test runner is modern, fast, and doesn't require additional libraries, but understanding and using it well can be tricky. You will learn how to use Node.js test runner to its full potential. We'll show you how it compares to other tools, how to set it up, and how to run your tests effectively. During the workshop, we'll do exercises to help you get comfortable with filtering, using native assertions, running tests in parallel, using CLI, and more. We'll also talk about working with TypeScript, making custom reports, and code coverage.