Node.js es un entorno de ejecución de JavaScript multiplataforma y de código abierto que puede ejecutarse en Windows , Linux , Unix , macOS y más. Node.js se ejecuta en el motor JavaScript V8 y ejecuta código JavaScript fuera de un navegador web .
Node.js permite a los desarrolladores utilizar JavaScript para escribir herramientas de línea de comandos y para la creación de scripts del lado del servidor . La capacidad de ejecutar código JavaScript en el servidor se utiliza a menudo para generar contenido dinámico de páginas web antes de que la página se envíe al navegador web del usuario. En consecuencia, Node.js representa un paradigma de "JavaScript en todas partes" , [6] unificando el desarrollo de aplicaciones web en torno a un único lenguaje de programación , en lugar de utilizar diferentes lenguajes para la programación del lado del servidor y del lado del cliente.
Node.js tiene una arquitectura basada en eventos capaz de realizar operaciones de E/S asincrónicas . Estas opciones de diseño tienen como objetivo optimizar el rendimiento y la escalabilidad en aplicaciones web con muchas operaciones de entrada/salida, así como en aplicaciones web en tiempo real (por ejemplo, programas de comunicación en tiempo real y juegos de navegador ). [7]
El proyecto de desarrollo distribuido Node.js anteriormente estaba gobernado por la Fundación Node.js [8] y ahora se ha fusionado con la Fundación JS para formar la Fundación OpenJS . La Fundación OpenJS es facilitada por el programa de Proyectos Colaborativos de la Fundación Linux [9] .
Node.js fue escrito inicialmente por Ryan Dahl en 2009, [10] aproximadamente 13 años después de la introducción del primer entorno de JavaScript del lado del servidor, LiveWire Pro Web de Netscape . [11] La versión inicial solo era compatible con Linux y Mac OS X. Su desarrollo y mantenimiento estuvo dirigido por Dahl y luego patrocinado por Joyent . [12]
Dahl criticó la capacidad limitada de Apache HTTP Server para manejar muchas conexiones simultáneas (más de 10 000), así como el paradigma de programación dominante de programación secuencial, en el que las aplicaciones podían bloquear procesos enteros o provocar la creación de múltiples pilas de ejecución para conexiones simultáneas. [13]
Dahl demostró el proyecto en la JSConf europea inaugural el 8 de noviembre de 2009. [14] [15] [16] Node.js combinó el motor JavaScript V8 de Google , un bucle de eventos y una API de E/S de bajo nivel . [17]
En enero de 2010, se introdujo un administrador de paquetes para el entorno Node.js llamado npm . [18] El administrador de paquetes permite a los programadores publicar y compartir paquetes Node.js , junto con el código fuente que los acompaña, y está diseñado para simplificar la instalación, actualización y desinstalación de paquetes. [17]
En junio de 2011, Microsoft y Joyent implementaron una versión nativa de Node.js para Windows. [19] La primera versión de Node.js compatible con Windows se lanzó en julio de 2011.
En enero de 2012, Dahl cedió la gestión del proyecto al creador de npm, Isaac Schlueter. [20] En enero de 2014, Schlueter anunció que Timothy J. Fontaine lideraría el proyecto. [21]
En diciembre de 2014, Fedor Indutny creó io.js, una bifurcación de Node.js creada debido a la insatisfacción con la gobernanza de Joyent como una alternativa de gobernanza abierta con un comité técnico independiente. El objetivo era habilitar una estructura que fuera más receptiva a los aportes de la comunidad, incluida la actualización de io.js con las últimas versiones del motor JavaScript Google V8, divergiendo del enfoque de Node.js en ese momento. [22]
La Fundación Node.js, formada para reconciliar Node.js e io.js bajo un mismo estandarte, fue anunciada en febrero de 2015. [23] La fusión se concretó en septiembre de 2015 con la combinación de Node.js v0.12 e io.js v3.3 en Node v4.0. [24] Esta fusión trajo las características de V8 ES6 a Node.js y comenzó un ciclo de lanzamiento de soporte a largo plazo. [25] Para 2016, el sitio web de io.js recomendó regresar a Node.js y anunció que no habría más lanzamientos de io.js, terminando efectivamente la bifurcación y consolidando el éxito de la fusión. [26]
En 2019, la Fundación JS y la Fundación Node.js se fusionaron para formar la Fundación OpenJS .
El 6 de septiembre de 2023, se lanzó Node.js 20.6.0. La actualización trajo consigo la incorporación de compatibilidad integrada con .env
archivos, la eliminación de la marca import.meta.resolve
, la introducción de un nuevo registro de API para ganchos de personalización de módulos y un nuevo gancho de inicialización. Además, el gancho de carga de personalización de módulos ahora es compatible con CommonJS , y los complementos de Node.js C++ han obtenido compatibilidad experimental con cppgc (Oilpan), que es una biblioteca de recolección de basura de C++ para V8. [27]node:module
El logotipo de Node.js presenta un hexágono verde con bandas superpuestas para representar la naturaleza multiplataforma del entorno de ejecución. [28] La Rocket Turtle fue elegida como la mascota oficial de Node.js en febrero de 2024 luego de un concurso de diseño. [29]
Node.js permite la creación de servidores web y herramientas de red utilizando JavaScript y una colección de "módulos" que manejan varias funcionalidades básicas. [14] [17] [30] [31] [32] Se proporcionan módulos para E/S del sistema de archivos , redes ( DNS , HTTP , TCP , TLS/SSL o UDP ), datos binarios (buffers), funciones de criptografía , flujos de datos y otras funciones básicas. [17] [31] [33] Los módulos de Node.js utilizan una API diseñada para reducir la complejidad de escribir aplicaciones de servidor. [17] [31]
JavaScript es el único lenguaje que Node.js soporta de forma nativa, pero hay muchos lenguajes compilables a JS disponibles. [34] Como resultado, las aplicaciones Node.js se pueden escribir en CoffeeScript , [35] Dart , TypeScript , ClojureScript y otros.
Node.js se utiliza principalmente para crear programas de red como servidores web. [30] La diferencia más significativa entre Node.js y PHP es que la mayoría de las funciones en PHP se bloquean hasta su finalización (los comandos se ejecutan solo después de que finalizan los comandos anteriores), mientras que las funciones de Node.js no son bloqueantes (los comandos se ejecutan simultáneamente o incluso en paralelo , [36] [37] [¿ síntesis incorrecta? ] y utilizan devoluciones de llamadas para señalar la finalización o el fracaso). [30]
Node.js es oficialmente compatible con Linux , macOS y Microsoft Windows 8.1 y Server 2012 (y posteriores), [3] con soporte de nivel 2 para SmartOS e IBM AIX y soporte experimental para FreeBSD . OpenBSD también funciona y hay versiones LTS disponibles para IBM i (AS/400). [38] El código fuente también se puede crear en sistemas operativos similares que no son oficialmente compatibles, como NonStop OS [39] y servidores Unix .
Node.js permite el desarrollo de servidores web rápidos en JavaScript mediante programación basada en eventos . [17] Los desarrolladores pueden crear servidores escalables sin utilizar subprocesos mediante un modelo simplificado que utiliza devoluciones de llamadas para señalar la finalización de una tarea. [17] [ página necesaria ] Node.js conecta la facilidad de un lenguaje de scripting (JavaScript) con el poder de la programación de red Unix. [17]
Node.js se construyó sobre el motor JavaScript V8 de Google, ya que era de código abierto bajo la licencia BSD , y contiene soporte integral para protocolos fundamentales como HTTP , DNS y TCP . [14] La popularidad existente de JavaScript hizo que Node.js fuera accesible para la comunidad de desarrollo web . [14]
Existen miles de bibliotecas de código abierto para Node.js, la mayoría de las cuales se encuentran alojadas en el sitio web de npm. Se llevan a cabo múltiples conferencias y eventos para desarrolladores que apoyan a la comunidad de Node.js, incluidos NodeConf, Node Interactive y Node Summit, así como una serie de eventos regionales.
La comunidad de código abierto ha desarrollado marcos web para acelerar el desarrollo de aplicaciones. Entre estos marcos se incluyen Express.js , Socket.IO , Sails.js , Next.js y Meteor . [17] [40] También se han creado varios paquetes para interactuar con otros lenguajes o entornos de ejecución como Microsoft .NET . [41]
Los IDE de escritorio modernos proporcionan funciones de edición y depuración específicamente para aplicaciones Node.js. Dichos IDE incluyen Atom , Brackets , JetBrains WebStorm , [42] [43] Microsoft Visual Studio (con Node.js Tools para Visual Studio, [44] o TypeScript con definiciones de Node [45] [46] [47] [48] ), NetBeans , [49] Nodeclipse Enide Studio [50] ( basado en Eclipse ) y Visual Studio Code . [51] [52] Algunos IDE en línea también admiten Node.js, como Codeanywhere , Eclipse Che , Cloud9 IDE y el editor de flujo visual en Node-RED .
Node.js es compatible con varias plataformas de alojamiento en la nube, como Jelastic , Google Cloud Platform , AWS Elastic Beanstalk , Azure Web Apps y Joyent .
Las nuevas versiones principales de Node.js se lanzan desde la rama principal de GitHub cada seis meses. Las versiones pares se lanzan en abril y las impares en octubre. Cuando se lanza una nueva versión impar, la versión par anterior pasa a la transición a Soporte a Largo Plazo (LTS), que le otorga a esa versión 12 meses de soporte activo a partir de la fecha en que se la designa como LTS. Una vez que expiran estos 12 meses, una versión LTS recibe 18 meses adicionales de soporte de mantenimiento. Una versión activa recibe versiones retroactivas de los cambios unas semanas después de que se incluyen en la versión actual. Una versión de mantenimiento recibe solo correcciones críticas y actualizaciones de la documentación. [54] El Grupo de Trabajo LTS gestiona la estrategia y la política en colaboración con el Comité de Dirección Técnica de la Fundación Node.js.
Node.js es un entorno de ejecución de JavaScript que procesa las solicitudes entrantes en un bucle, llamado bucle de eventos .
Node.js utiliza libuv para gestionar eventos asincrónicos. Libuv es una capa de abstracción para la funcionalidad de la red y del sistema de archivos tanto en sistemas basados en Windows como en POSIX, como Linux, macOS , OSS en NonStop y Unix. Node.js se basa en nghttp2 para la compatibilidad con HTTP. A partir de la versión 20, Node.js utiliza la biblioteca ada, que proporciona compatibilidad actualizada con URL WHATWG . A partir de la versión 19.5, Node.js utiliza la biblioteca simdutf para una rápida validación y transcodificación de Unicode. A partir de la versión 21.3, Node.js utiliza la biblioteca simdjson para un rápido análisis de JSON.
Node.js opera en un bucle de eventos de un solo subproceso , utilizando llamadas de E/S no bloqueantes , lo que le permite admitir decenas de miles de conexiones simultáneas sin incurrir en el costo del cambio de contexto de subproceso . [57] El diseño de compartir un solo subproceso entre todas las solicitudes que utilizan el patrón de observador está destinado a crear aplicaciones altamente concurrentes, donde cualquier función que realice E/S debe utilizar una devolución de llamada . Para dar cabida al bucle de eventos de un solo subproceso, Node.js utiliza la biblioteca libuv , que, a su vez, utiliza un grupo de subprocesos de tamaño fijo que maneja algunas de las operaciones de E/S asincrónicas no bloqueantes. [7]
Un grupo de subprocesos se encarga de la ejecución de tareas paralelas en Node.js. La llamada a la función del subproceso principal envía tareas a la cola de tareas compartidas, que los subprocesos del grupo de subprocesos extraen y ejecutan. Las funciones del sistema inherentemente no bloqueantes, como la red, se traducen en sockets no bloqueantes del lado del núcleo, mientras que las funciones del sistema inherentemente bloqueantes, como la E/S de archivos, se ejecutan de forma bloqueante en sus propios subprocesos. Cuando un subproceso del grupo de subprocesos completa una tarea, informa de ello al subproceso principal, que, a su vez, se activa y ejecuta la devolución de llamada registrada.
Una desventaja de este enfoque de un solo subproceso es que Node.js no permite el escalamiento vertical al aumentar la cantidad de núcleos de CPU de la máquina en la que se ejecuta sin usar un módulo adicional, como cluster, [36] StrongLoop Process Manager, [58] o pm2. [59] Sin embargo, los desarrolladores pueden aumentar la cantidad predeterminada de subprocesos en el grupo de subprocesos de libuv. Es probable que el sistema operativo (OS) del servidor distribuya estos subprocesos entre varios núcleos. [60] Otro problema es que los cálculos de larga duración y otras tareas limitadas por la CPU congelan todo el bucle de eventos hasta su finalización. [ cita requerida ]
V8 es el motor de ejecución de JavaScript que se creó inicialmente para Google Chrome . Luego, Google lo convirtió en código abierto en 2008. Escrito en C++ , V8 compila el código fuente de JavaScript en código de máquina nativo en tiempo de ejecución . [7] A partir de 2016, también incluye Ignition, un intérprete de bytecode .
npm es el administrador de paquetes preinstalado para la plataforma de servidor Node.js. Instala programas Node.js desde el registro npm y organiza la instalación y administración de programas Node.js de terceros.
Node.js se registra en el sistema operativo para que este le notifique eventos de E/S asincrónicos , como nuevas conexiones. Dentro del entorno de ejecución de Node.js, los eventos activan devoluciones de llamadas y cada conexión se maneja como una pequeña asignación de montón . Tradicionalmente, cada conexión era manejada por procesos o subprocesos del sistema operativo relativamente pesados. Node.js utiliza un bucle de eventos para E/S concurrentes, en lugar de procesos o subprocesos. [61] A diferencia de otros servidores controlados por eventos, [¿ cuál? ] el bucle de eventos de Node.js no necesita ser llamado explícitamente. En cambio, se definen devoluciones de llamadas y el servidor ingresa automáticamente al bucle de eventos al final de la definición de devolución de llamada. Node.js sale del bucle de eventos cuando no hay más devoluciones de llamadas para realizar.
Node.js es compatible con WebAssembly y a partir de Node 14 tiene soporte experimental de WASI , la interfaz del sistema WebAssembly.
Node.js ofrece una forma de crear "complementos" a través de una API basada en C.node
llamada N-API, que se puede utilizar para producir módulos cargables (importables) a partir del código fuente escrito en C/C++. [62] Los módulos se pueden cargar directamente en la memoria y ejecutar desde el entorno JS como módulos CommonJS simples. La implementación de la N-API se basa en objetos internos de Node.js y V8 en C/C++ que requieren que los usuarios importen ( #include ) encabezados específicos de Node.js en su código fuente nativo. [62]
Como la API de Node.js está sujeta a cambios importantes a nivel binario, los módulos deben crearse y enviarse para versiones específicas de Node.js para que funcionen correctamente. Para solucionar el problema, terceros han introducido contenedores C/C++ de código abierto sobre la API que alivian parcialmente el problema. Simplifican las interfaces, pero como efecto secundario también pueden introducir complejidad con la que los encargados del mantenimiento deben lidiar. Aunque la funcionalidad principal de Node.js reside en una biblioteca integrada de JavaScript, los módulos escritos en C++ se pueden utilizar para mejorar las capacidades y el rendimiento de las aplicaciones.
Para producir dichos módulos es necesario tener un compilador de C++ apropiado y los encabezados necesarios (estos últimos normalmente se entregan con Node.js), por ejemplo, gcc , clang o MSVC++ .
La N-API es similar a la interfaz nativa de Java .
En 2015, varias ramas de la comunidad Node.js comenzaron a trabajar bajo la Fundación Node.js, que es independiente de los proveedores. El objetivo declarado de la organización "es permitir la adopción generalizada y ayudar a acelerar el desarrollo de Node.js y otros módulos relacionados a través de un modelo de gobernanza abierta que fomente la participación, la contribución técnica y un marco para la gestión a largo plazo por parte de un ecosistema comprometido con el éxito de Node.js". [63]
El Comité Directivo Técnico (TSC) de la Fundación Node.js es el órgano técnico de gobierno de la Fundación Node.js. El TSC es responsable del repositorio principal de Node.js, así como de los proyectos dependientes y adyacentes. Generalmente, el TSC delega la administración de estos proyectos a grupos de trabajo o comités. [64] El grupo LTS que administra las versiones con soporte a largo plazo es uno de esos grupos. Otros grupos actuales incluyen Sitio web, Streams, Build, Diagnóstico, i18n, Evangelismo, Docker, Addon API, Evaluación comparativa, Post-mortem, Intl, Documentación y Pruebas. [65]
En agosto de 2017, un tercio de los miembros del TSC dimitieron debido a una disputa relacionada con el código de conducta del proyecto. [66]