¡Node.js v20 ya está disponible! El 18 de abril de 2023 se publicó y ya está disponible para todo el mundo. Con esta versión, Node.js debería ser mucho más seguro y funcionar mejor.

Es importante saber que — al tratarse de una versión par — se convertirá en una versión de soporte a largo plazo (LTS) en octubre de 2023 y recibirá soporte hasta abril de 2026. Sin embargo, el equipo de Node.js está buscando activamente la opinión de la comunidad para identificar y solucionar cualquier problema antes de que pase a LTS.

Esta nueva versión de Node.js trae interesantes actualizaciones y características que los desarrolladores seguramente apreciarán, como el Modelo de Permisos experimental, import.meta.resolve síncrono , un ejecutor de pruebas estable, actualiza el motor V8 JavaScript a la versión 11.3, aportando mejoras de rendimiento y correcciones de errores, y mucho más.

En este artículo, explorarás los cambios introducidos en Node.js v20, proporcionando una visión en profundidad a sus nuevas características y capacidades.

Primeros Pasos con Node.js v20

La instalación de Node.js v20 es bastante similar a la de otras versiones de Node.js. Todo lo que tienes que hacer es

  1. Descargar el paquete instalador del sitio web oficial de Node.js.
  2. Una vez que hayas descargado el instalador, ejecútalo y sigue las instrucciones para completar el proceso de instalación. Este proceso es bastante sencillo, y sólo tienes que aceptar el acuerdo de licencia y pulsar el botón «Siguiente».
  3. Reinicia tu Sistema/Máquina una vez finalizado el proceso de instalación para asegurarte de que todos los cambios surten efecto.
  4. Verifica tu instalación de Node.js ejecutando el siguiente comando:
node -v
Verificación de la instalación de Node.js v20
Instalación de Node.js v20

Si ves el número de versión (v20.0.0), significa que Node.js está instalado correctamente, y estás listo para empezar a trabajar con Node.js v20.

¿Qué Novedades Trae Node.js v20?

Exploremos las 5 actualizaciones principales introducidas con esta versión de Node.js. Estas características incluyen:

Modelo de Permisos Experimental

La introducción del Modelo de Permisos experimental en Node.js v20 es una adición significativa que proporciona a los desarrolladores más control sobre el acceso a recursos específicos durante la ejecución.

Esta nueva característica es beneficiosa cuando la seguridad y el uso de recursos son críticos, como en un entorno de producción.

El Modelo de Permisos incluye varias capacidades, como restringir el acceso al sistema de archivos, child_process, worker_threads y complementos nativos.

Los desarrolladores pueden utilizar banderas como --allow-fs-read, --allow-fs-write, y --allow-child-process para especificar a qué recursos se puede acceder. Para activar estas banderas, los desarrolladores deben utilizar la bandera --experimental-permission en combinación con los permisos necesarios.

Aquí tienes un ejemplo de cómo utilizar el Modelo de Permisos para permitir el acceso de lectura y escritura a todo el sistema de archivos:

$ node --experimental-permission --allow-fs-read=* --allow-fs-write=* index.js

Los desarrolladores también pueden utilizar el Modelo de Permisos para especificar el acceso a carpetas y archivos concretos. Por ejemplo, el siguiente comando permite el acceso de escritura a la carpeta /tmp/:

$ node --experimental-permission --allow-fs-write=/tmp/ --allow-fs-read=/home/index.js index.js

Una ventaja importante del Modelo de Permisos es la posibilidad de ejercer un control más granular sobre el acceso al sistema de archivos. Por ejemplo, los desarrolladores pueden especificar rutas y patrones wild para permitir el acceso a carpetas o archivos concretos.

$ node --experimental-permission --allow-fs-read=/home/user/* index.js

El comando anterior concede acceso de lectura a todas las carpetas del directorio /home/user/.

La propiedad permission del objeto proceso también puede utilizarse para comprobar si se ha concedido un permiso concreto en tiempo de ejecución. Por ejemplo, si quieres comprobar si tu proceso Node.js tiene acceso de lectura a una carpeta concreta, /home/user/documents, puedes utilizar el siguiente código:

if (process.permission.has('fs.read', '/home/user/documents')) {
  console.log('Read access granted to /home/user/documents');
} else {
  console.log('Read access not granted to /home/user/documents');
}

Al utilizar el Modelo de Permisos, tienes un control más detallado sobre el acceso al sistema de archivos de tus procesos Node.js, lo que puede conducir a una mayor seguridad y a una utilización más eficiente de los recursos.

Es crucial tener en cuenta que el Modelo de Permisos aún es experimental y puede cambiar en futuras versiones de Node.js. Es aconsejable mantenerse al día con la documentación del Modelo de Permisos y tener precaución al utilizar estas funciones experimentales.

Ejecutor de Pruebas Estable

Node.js v20 incluye una versión estable del módulo test_runner que permite a los desarrolladores crear y ejecutar conjuntos de pruebas de JavaScript de forma rápida y sencilla sin instalar dependencias adicionales.

El ejecutor de pruebas estable incluye ahora varios bloques de construcción, como describe, it/test, y hooks, para crear y estructurar archivos de pruebas, junto con mocking, watch mode y la posibilidad de ejecutar varios archivos de pruebas en paralelo mediante el comando node --test.

Aquí tienes un ejemplo de cómo utilizar el ejecutor de pruebas:

import { test, mock } from 'node:test';
import assert from 'node:assert';
import fs from 'node:fs';

mock.method(fs, 'readFile', async () => "Hello World");
test('synchronous passing test', async (t) => {
  // This test passes because it does not throw an exception.
  assert.strictEqual(await fs.readFile('a.txt'), "Hello World");
});

El ejecutor de pruebas ofrece informes de pruebas configurables y personalizados mediante la bandera --test-reporter, cobertura de pruebas experimental mediante la bandera --experimental-test-coverage y capacidades de mocking.

Aunque no pretende sustituir a los frameworks como Jest o Mocha, el ejecutor de pruebas estable ofrece una forma sencilla y rápida de crear conjuntos de pruebas. Se ha mejorado significativamente desde su introducción en Node.js v19, y gracias a las pruebas y comentarios de los usuarios finales, ahora se ha marcado como estable en Node.js v20.

Puedes encontrar más información en este pull request fusionado.

Motor JavaScript V8 Actualizado a 11.3

El motor V8 JavaScript, que impulsa Node.js, se ha actualizado a la versión 11.3 en Node.js v20. Esto mejora el rendimiento e introduce nuevas características del lenguaje. Algunas de las nuevas características que incluye esta actualización:

  • String.prototype.isWellFormed y toWellFormed: Estos métodos son especialmente útiles para garantizar el formato adecuado de las cadenas. Esto ayuda a garantizar que la entrada de cadenas del usuario está en el formato UTF-16 correcto, reduciendo los errores en la era de los emojis.
  • Métodos que modifican Array y TypedArray por copia: Esto puede ser útil para crear copias modificadas de arrays sin afectar a los datos originales, lo que es especialmente relevante en casos en los que necesites conservar los datos originales para compararlos o con otros fines.
  • ArrayBuffer reajustable y SharedArrayBuffer reajustable : proporciona una mayor flexibilidad, permitiendo una asignación de memoria más eficiente.
  • Bandera RegExp v con notación de conjunto y propiedades de cadenas: añade funcionalidad para expresiones regulares.
  • Llamada de cola WebAssembly: proporciona una forma de optimizar ciertos tipos de llamadas a funciones.

Estas actualizaciones muestran el compromiso continuo de la comunidad de desarrollo de Node.js para mejorar el rendimiento y la funcionalidad.

Import.meta.resolve() Síncrona

En Node.js v20, se ha introducido import.meta.resolve(), que facilita la escritura de scripts que no son sensibles a la ubicación. Esta función retorna de forma sincrónica, similar al comportamiento del navegador, lo que permite una ejecución más eficiente.

Los hooks de resolución del cargador de usuario pueden seguir definiéndose como una función asíncrona, pero import.meta.resolve() seguirá devolviendo de forma síncrona para el código de la aplicación aunque se carguen hooks de resolución asíncronos.

El comportamiento síncrono de import.meta.resolve() permite una ejecución más eficiente del código, especialmente cuando se trata de grandes cantidades de datos. Como autor, puedes definir los ganchos de resolución como funciones asíncronas o síncronas, según prefieras. El código de la aplicación seguirá ejecutándose de forma síncrona independientemente de si hay ganchos de resolución asíncronos cargados.

Aplicaciones Experimentales de Ejecución Única (SEA)

Las Aplicaciones Ejecutables Individuales Experimentales (SEA – Single executable applications) son una nueva característica introducida en Node.js v20 que permite empaquetar tu aplicación con el binario de Node.js, permitiendo a los usuarios finales distribuirla y ejecutarla como un único archivo ejecutable.

Esta ha sido una petición de la comunidad desde hace mucho tiempo, y el equipo ha estado perfeccionando el enfoque durante el último año.

En Node.js v20, para crear una aplicación ejecutable única es necesario inyectar un blob preparado por Node.js a partir de una configuración JSON, en lugar de inyectar el archivo JS sin procesar.

Un blob es un archivo que contiene datos binarios, en este caso, preparados por Node.js, y se inyecta en el binario. Este cambio se hizo para permitir incrustar múltiples recursos coexistentes en el EAE, lo que abre nuevos casos de uso.

Aquí tienes un ejemplo de archivo sea-config.json:

{ 
      "main": "myscript.js", 
      "output": "sea-prep.blob" 
}

Cuando se ejecuta con el comando node --experimental-sea-config sea-config.json, el blob se escribe en el archivo sea-prep.blob, que luego puede inyectarse en el binario.

La función SEA permite a los desarrolladores distribuir aplicaciones Node.js sin necesidad de que los usuarios instalen Node.js. La funcionalidad fue creada por Darshan Sen, que ganó el premio a la Contribución Sobresaliente de un Recién Llegado como parte de los Premios JavaScriptLandia en OpenJS World.

Microsoft, miembro de la Fundación OpenJS, está investigando esta función como forma de reducir los ataques vectoriales y potenciar la arquitectura Node.js para una mejor experiencia. Aunque la función SEA aún es experimental, representa un nuevo y emocionante avance para la comunidad Node.js.

Rendimiento

Node.js v20 viene con mejoras significativas en su tiempo de ejecución, con un enfoque renovado en el rendimiento por parte del recién formado equipo de rendimiento de Node.js. Las mejoras incluyen optimizaciones en las partes principales del tiempo de ejecución, como URL, fetch(), y EventTarget.

Una de las mejoras notables es la reducción del coste de inicialización de EventTarget, que se ha reducido a la mitad, lo que se traduce en un acceso más rápido a todos los subsistemas que lo utilizan. Además, se han utilizado llamadas V8 Fast API para mejorar el rendimiento en APIs como URL.canParse() y temporizadores.

Otro cambio específico es la inclusión de la versión actualizada 2.0 de Ada, un analizador de URL rápido y conforme a las especificaciones, escrito en C++.

Resumen

En este artículo, has aprendido algunas de las principales características (experimentales y estables) y mejoras que aporta Node.js v20, como las mejoras en el motor JavaScript V8, el rendimiento, el ejecutor de pruebas y la introducción del modelo de permisos experimental, y las aplicaciones de ejecución única.

Es importante saber que Node.js v14 llegará al final de su vida útil en abril de 2023, por lo que se aconseja empezar a planificar la actualización a Node.js v18 (LTS) o vNode.js 20 (que pronto será LTS).

¿Quieres probar la última versión de Node.js? Puedes hacerlo desplegando tu aplicación Node.js en Kinsta y conseguir tus primeros 20 $ con nosotros. Ya somos compatibles con Node.js v20, lo que significa que puedes probar sus nuevas funciones y capacidades a partir de hoy.

¡Ahora es tu turno! ¿Qué funciones o mejoras te parecen más interesantes en Node.js v20? ¿Hay alguna significativa que hayamos pasado por alto? Háznoslo saber en los comentarios.

Joel Olawanle Kinsta

Joel is a Frontend developer working at Kinsta as a Technical Editor. He is a passionate teacher with love for open source and has written over 200 technical articles majorly around JavaScript and it's frameworks.