Novedades de Node.js v20 (Ejecutor de pruebas, Modelo de permisos, SEA, V8 JS Engine 11.3)
Publicado: 2023-04-28¡Node.js v20 ya está disponible! El 18 de abril de 2023 se hizo público y ahora puede ser utilizado por todos. Con esta versión, Node.js debería ser mucho más seguro y funcionar mejor.
Es importante saberlo: dado que se trata de una versión con número par, está programada para convertirse en una versión de soporte a largo plazo (LTS) en octubre de 2023 y será compatible hasta abril de 2026. Sin embargo, el equipo de Node.js está buscando activamente comunidad comentarios para identificar y solucionar cualquier problema antes de que se promocione a LTS.
Esta nueva versión de Node.js trae actualizaciones y características interesantes que los desarrolladores seguramente apreciarán, como el modelo de permiso experimental, import.meta.resolve
síncrono, un corredor de prueba estable, actualiza el motor JavaScript V8 a la versión 11.3, lo que trae mejoras de rendimiento y errores. correcciones y mucho más.
En este artículo, explorará los cambios introducidos en Node.js v20, brindando una mirada detallada a sus nuevas características y capacidades.
Primeros pasos con Node.js v20
La instalación de Node.js v20 es bastante similar a otras versiones de Node.js. Todo lo que necesitas hacer es:
- Descargue el paquete de instalación del sitio web oficial de Node.js.
- Una vez que haya descargado el instalador, ejecútelo y siga las instrucciones para completar el proceso de instalación. Este proceso es bastante sencillo y solo necesita aceptar el acuerdo de licencia y hacer clic en el botón "Siguiente".
- Reinicie su sistema/máquina después de que se complete el proceso de instalación para asegurarse de que todos los cambios surtan efecto.
- Verifique su instalación de Node.js ejecutando el siguiente comando:
node -v
Si ve el número de versión (v20.0.0), significa que Node.js está instalado correctamente y está listo para comenzar a trabajar con Node.js v20.
¿Qué hay de nuevo en Node.js v20?
Exploremos las 5 actualizaciones principales introducidas con esta versión de Node.js. Estas características incluyen:
Modelo de permiso experimental
La introducción del modelo de permisos experimental en Node.js v20 es una adición significativa que brinda 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 viene con varias capacidades, incluida la restricción de acceso al sistema de archivos, child_process, worker_threads y complementos nativos.
Los desarrolladores pueden usar marcas como --allow-fs-read
, --allow-fs-write
y --allow-child-process
para especificar qué recursos son accesibles. Para activar estos indicadores, los desarrolladores deben utilizar el indicador --experimental-permission
en combinación con los permisos necesarios.
Aquí hay un ejemplo de cómo usar 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 usar el modelo de permisos para especificar el acceso a carpetas y archivos específicos. 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
Un beneficio importante del modelo de permisos es la capacidad de ejercer un control más granular sobre el acceso al sistema de archivos. Por ejemplo, los desarrolladores pueden especificar rutas y patrones de comodines para permitir el acceso a carpetas o archivos específicos.
$ node --experimental-permission --allow-fs-read=/home/user/* index.js
El comando anterior otorga acceso de lectura a todas las carpetas dentro del directorio /home/user/ .
La propiedad de permiso del objeto de proceso también se puede utilizar para comprobar si se ha concedido un permiso específico en tiempo de ejecución. Por ejemplo, si desea verificar si su proceso de Node.js tiene acceso de lectura a una carpeta específica, /home/user/documents , puede usar 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 usar el modelo de permisos, tiene un control más detallado sobre el acceso al sistema de archivos de los procesos de Node.js, lo que puede conducir a una mejor seguridad y una utilización más eficiente de los recursos.
Es fundamental tener en cuenta que el modelo de permisos aún es experimental y puede cambiar en versiones futuras de Node.js. Es recomendable mantenerse actualizado con la documentación del modelo de permiso y tener cuidado al usar estas funciones experimentales.
Corredor 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 ahora incluye varios componentes básicos, como describe
, it
/ test
y hooks, para crear y estructurar archivos de prueba, junto con simulación, modo de observación y la capacidad de ejecutar varios archivos de prueba en paralelo usando el node --test
comando node --test
.
Aquí hay un ejemplo de cómo usar el corredor de prueba:
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 corredor de pruebas ofrece reporteros de prueba configurables y personalizados a través del indicador --test-reporter
, cobertura de prueba experimental a través del indicador --experimental-test-coverage
y capacidades de simulación.
Si bien no pretende reemplazar los marcos de prueba completos como Jest o Mocha, el ejecutor de pruebas estable ofrece una manera simple 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 los comentarios de los usuarios finales, ahora se ha marcado como estable en Node.js v20.
Se puede encontrar más información en esta solicitud de extracción fusionada.
Motor JavaScript V8 actualizado a 11.3
El motor JavaScript V8, que impulsa Node.js, se actualizó a la versión 11.3 en Node.js v20. Esto trae un rendimiento mejorado e introduce nuevas funciones de lenguaje. Algunas de las nuevas características que incluye esta actualización:
-
String.prototype.isWellFormed
ytoWellFormed
: estos métodos son particularmente útiles para garantizar el formato de cadena adecuado. Esto ayuda a garantizar que la entrada de cadena del usuario esté en el formato UTF-16 correcto, lo que reduce los errores en la era de los emojis. - Métodos que cambian Array y TypedArray por copia: esto puede ser útil para crear copias modificadas de matrices sin afectar los datos originales, lo que es especialmente relevante en los casos en los que necesita conservar los datos originales para realizar comparaciones u otros fines.
-
ArrayBuffer
redimensionable ySharedArrayBuffer
ampliable: proporciona una mayor flexibilidad, lo que permite una asignación de memoria más eficiente. - Indicador RegExp v con notación establecida y propiedades de cadenas: agrega funcionalidad para expresiones regulares.
- Llamada de cola de WebAssembly: proporciona una manera 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.
Importación síncrona.meta.resolve()
En Node.js v20, se introdujo import.meta.resolve()
, lo que facilita la escritura de scripts que no son sensibles a la ubicación. Esta función regresa de forma síncrona, similar al comportamiento del navegador, lo que permite una ejecución más eficiente.
Los enganches de resolución del cargador de usuario aún se pueden definir como una función asíncrona, pero import.meta.resolve()
aún regresará sincrónicamente para el código de la aplicación, incluso si los enganches de resolución asíncrona están cargados.
El comportamiento síncrono de import.meta.resolve()
permite una ejecución de código más eficiente, especialmente cuando se trata de grandes cantidades de datos. Como autor, puede definir ganchos de resolución como funciones asíncronas o de sincronización, según sus preferencias. El código de la aplicación aún se ejecutará sincrónicamente, independientemente de si hay ganchos de resolución asíncrona cargados.
Aplicaciones Experimentales Únicas Ejecutables (SEA)
Experimental Single Executable Applications (SEA) es una nueva función introducida en Node.js v20 que permite agrupar su aplicación con el binario de Node.js, lo que permite a los usuarios finales distribuirla y ejecutarla como un único archivo ejecutable.
Esta ha sido una solicitud de la comunidad desde hace mucho tiempo, y el equipo ha estado refinando el enfoque durante el último año.
En Node.js v20, la creación de una sola aplicación ejecutable requiere inyectar un blob preparado por Node.js desde 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 realizó para permitir la incorporación de múltiples recursos coexistentes en el SEA, lo que abre nuevos casos de uso.
Aquí hay un ejemplo de un archivo sea-config.jso n:
{ "main": "myscript.js", "output": "sea-prep.blob" }
Cuando se ejecuta con el node --experimental-sea-config sea-config.json
, el blob se escribe en el archivo sea-prep.blob , que luego se puede inyectar en el binario.
La función SEA permite a los desarrolladores distribuir aplicaciones Node.js sin que los usuarios tengan que instalar Node.js. La funcionalidad fue creada por Darshan Sen, quien ganó el premio Contribución destacada de un recién llegado como parte de los Premios JavaScriptLandia en OpenJS World.
Microsoft, miembro de OpenJS Foundation, está investigando esta función como una forma de reducir los ataques de vectores y potenciar la arquitectura de Node.js para una mejor experiencia. Si bien la función SEA aún es experimental, representa un nuevo desarrollo emocionante para la comunidad de Node.js.
Actuación
Node.js v20 viene con mejoras significativas en su tiempo de ejecución, con un enfoque renovado en el rendimiento por parte del equipo de rendimiento de Node.js recién formado. 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 costo de inicialización EventTarget
, que se ha reducido a la mitad, lo que da como resultado un acceso más rápido a todos los subsistemas que lo utilizan. Además, las llamadas de API rápida V8 se han utilizado para mejorar el rendimiento en API como URL.canParse()
y temporizadores.
Otro cambio específico es la inclusión de la versión 2.0 actualizada de Ada, un analizador de URL rápido y compatible con las especificaciones escrito en C++.
Resumen
En este artículo, ha aprendido algunas de las principales características (experimentales y estables) y mejoras que trae Node.js v20, como mejoras en el motor de JavaScript V8, el rendimiento, el ejecutor de pruebas y la introducción del modelo de permiso experimental y 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 recomienda comenzar a planificar la actualización a Node.js v18 (LTS) o vNode.js 20 (que pronto será LTS).
¿Le gustaría probar la última versión de Node.js? Puede hacerlo implementando su aplicación Node.js en Kinsta y obtenga sus primeros $20 de nuestra cuenta. Ya admitimos Node.js v20, lo que significa que puede probar sus nuevas características y capacidades a partir de hoy.
¡Ahora es tu turno! ¿Qué características o mejoras encuentra más interesantes en Node.js v20? ¿Hay alguno significativo que podamos haber pasado por alto? Háganos saber en los comentarios.