[go: up one dir, main page]

Node.js

Entorno de ejecución para JavaScript

Node.js es un entorno en tiempo de ejecución multiplataforma, de código abierto, para la capa del servidor (pero no limitándose a ello) basado en el lenguaje de programación JavaScript, asíncrono, con E/S de datos en una arquitectura orientada a eventos y basado en el motor V8 de Google. Fue creado con el enfoque de ser útil en la creación de programas de red altamente escalables, como por ejemplo, servidores web.[4]​ Fue creado por Ryan Dahl en 2009 y su evolución está apadrinada por la empresa Joyent, que además tiene contratado a Dahl en plantilla.[5][6]

Node.js
Logo Node.js
Información general
Tipo de programa Dirigida por eventos
Autor Ryan Lienhart Dahl
Desarrollador Node.js Developers
Joyent
Lanzamiento inicial 27 de mayo de 2009[1]
Licencia Licencia MIT
Estado actual Activo
Información técnica
Programado en JavaScript, C++, Python
Versiones
Última versión estable 22.0.0 (info) ( 24 de abril de 2024 (6 meses y 21 días)[2]​)
Última versión en pruebas 20.7.0 ( 18 de septiembre de 2023 (1 año, 1 mes y 27 días)[3]​)
Historial de versiones lista versiones
Enlaces

Node.js es similar en su propósito a Twisted o Tornado de Python, Perl Object Environment de Perl, libevent o libev de C, EventMachine de Ruby, vibe.d de D y Java EE de Java existe Apache MINA, Netty, Akka, Vert.x, Grizzly o Xsocket. Al contrario que la mayoría del código JavaScript, no se ejecuta en un navegador, sino en el servidor. Node.js implementa algunas especificaciones de CommonJS.[7]​ Node.js incluye un entorno REPL para depuración interactiva.

Ejemplos

editar
 
Ryan Dahl (born 1981) is an American software engineer who is best known for creating the Node.js JavaScript runtime as well as the Deno JavaScript/TypeScript runtime.

Versión de un hola mundo de un servidor HTTP escrito en Node.js:

const http = require('http');

const hostname = '127.0.0.1';
const port = 1337;

http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('Hello World\n');
}).listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

Otro ejemplo con un servidor TCP que escucha en el puerto 7000 y responde con cualquier cosa que se le envíe:

var net = require('net');

net.createServer(function (stream) {
    stream.write('hello\r\n');

    stream.on('end', function () {
        stream.end('goodbye\r\n');
    });

    stream.pipe(stream);
}).listen(7000);

Otro ejemplo, pero ahora con discord.js. Este es el código básico para hacer funcionar un bot en Discord

const { Client, Intents } = require('discord.js');
const client = new Client({ intents: [Intents.FLAGS.GUILDS] });

client.on('ready', () => {
  console.log(`Logged in as ${client.user.tag}!`);
});

client.on('interactionCreate', async interaction => {
  if (!interaction.isCommand()) return;

  if (interaction.commandName === 'ping') {
    await interaction.reply('Pong!');
  }
});

client.login('token');

Aspectos técnicos

editar

Concurrencia

editar

Node.js funciona con un modelo de evaluación de un único hilo de ejecución, usando entradas y salidas asíncronas las cuales pueden ejecutarse concurrentemente en un número de hasta cientos de miles sin incurrir en costos asociados al cambio de contexto.[8]​ Este diseño de compartir un único hilo de ejecución entre todas las solicitudes atiende a necesidades de aplicaciones altamente concurrentes, en el que toda operación que realice entradas y salidas debe tener una función callback. Un inconveniente de este enfoque de único hilo de ejecución es que Node.js requiere de módulos adicionales como cluster[9]​ para escalar la aplicación con el número de núcleos de procesamiento de la máquina en la que se ejecuta.

V8 es el entorno de ejecución para JavaScript creado para Google Chrome. Es software libre desde 2008, está escrito en C++ y compila el código fuente JavaScript en código de máquina en lugar de interpretarlo en tiempo real.

Node.js contiene libuv para manejar eventos asíncronos. Libuv es una capa de abstracción de funcionalidades de redes y sistemas de archivo en sistemas Windows y sistemas basados en POSIX como Linux, Mac OS X y Unix.

El cuerpo de operaciones de base de Node.js está escrito en JavaScript con métodos de soporte escritos en C++.

Módulos

editar

Node.js incorpora varios "módulos básicos" compilados en el propio binario, como por ejemplo el módulo de red, que proporciona una capa para programación de red asíncrona y otros módulos fundamentales, como por ejemplo Path, FileSystem, Buffer, Timers y el de propósito más general Stream. Es posible utilizar módulos desarrollados por terceros, ya sea como archivos ".node" precompilados, o como archivos en Javascript plano. Los módulos Javascript se implementan siguiendo la especificación CommonJS para módulos,[10]​ utilizando una variable de exportación para dar a estos scripts acceso a funciones y variables implementadas por los módulos.[11]

Los módulos de terceros pueden extender node.js o añadir un nivel de abstracción, implementando varias utilidades middleware para utilizar en aplicaciones web, como por ejemplo los frameworks connect y express. Pese a que los módulos pueden instalarse como archivos simples, normalmente se instalan utilizando el Node Package Manager (npm) que nos facilitará la compilación, instalación y actualización de módulos así como la gestión de las dependencias. Además, los módulos que no se instalen en el directorio por defecto de módulos de Node necesitarán la utilización de una ruta relativa para poder encontrarlos. El wiki Node.js proporciona una lista de varios de los módulos de terceros disponibles.

Desarrollo homogéneo entre cliente y servidor

editar

Node.js puede ser combinado con una base de datos documental (por ejemplo, MongoDB o CouchDB) y bases de datos relacionales como MySQL, PostgreSQL, entre otros, lo que permite desarrollar en un entorno de desarrollo JavaScript unificado. Con la adaptación de los patrones para desarrollo del lado del servidor tales como MVC y sus variantes MVP, MVVM, etc. Node.js facilita la reutilización de código del mismo modelo de interfaz entre el lado del cliente y el lado del servidor.

Bucle de eventos

editar

Node.js se registra con el sistema operativo y cada vez que un cliente establece una conexión se ejecuta un callback. Dentro del entorno de ejecución de Node.js, cada conexión recibe una pequeña asignación de espacio de memoria dinámico, sin tener que crear un hilo de ejecución.[12]​ A diferencia de otros servidores dirigidos por eventos, el bucle de gestión de eventos de Node.js no es llamado explícitamente sino que se activa al final de cada ejecución de una función callback. El bucle de gestión de eventos se termina cuando ya no quedan eventos por atender.

Versiones

editar

Las nuevas versiones principales de Node.js se sacan de la rama máster de GitHub cada seis meses. Las versiones pares se sacan en abril, y las impares en octubre. Cuando se libera una versión impar, la versión par anterior pasa a soporte a largo plazo (Long Term Support, LTS), que da a la versión un soporte activo de 18 meses desde la fecha de inicio de la LTS. Después de estos 18 meses, la versión recibe otros 12 meses de soporte de mantenimiento. Una versión activa recibirá los cambios compatibles unas pocas semanas después de que aterricen en la versión estable actual. Una versión de mantenimiento recibirá solamente actualizaciones críticas y de documentación.[13]

La estrategia y política de las versiones LTS se gestiona por el LTS Working Group en colaboración con el Technical Steering Committee de Node.js Foundation.

Versión Nombre Fecha de
liberación
Estado LTS Inicio LTS Inicio de
mantenimiento
Fin de
mantenimiento
Versión antigua, sin servicio técnico: v0.10.x 2013-03-11 Versión antigua, sin servicio técnico: Sin soporte - 2015-10-01 2016-10-31
Versión antigua, sin servicio técnico: v0.12.x 2015-02-06 Versión antigua, sin servicio técnico: Sin soporte - 2016-04-01 2016-12-31
Versión antigua, sin servicio técnico: 4.x Argon[13] 2015-09-08 Versión antigua, sin servicio técnico: Sin soporte 2015-10-01 2017-04-01 2018-04-30
Versión antigua, sin servicio técnico: 5.x 2015-10-29 No  No LTS N/D 2016-06-30
Versión antigua, sin servicio técnico: 6.x Boron[13] 2016-04-26 Versión antigua, sin servicio técnico: Sin soporte 2016-10-18 2018-04-30 Abril de 2019
Versión antigua, sin servicio técnico: 7.x 2016-10-25 No  No LTS N/D 2017-06-30
Versión antigua, sin servicio técnico: 8.x Carbon[13] 2017-05-30 Versión antigua, sin servicio técnico: Sin soporte 2017-10-31 2019-01-01[14] Diciembre de 2019
Versión antigua, sin servicio técnico: 9.x 2017-10-01 No  No LTS N/D 2018-06-30
Versión antigua, sin servicio técnico: 10.x Dubnium[13] 2018-04-24 Versión antigua, sin servicio técnico: Sin soporte 30 de octubre de 2018 19 de mayo de 2019 30 de abril de 2021
Versión antigua, sin servicio técnico: 11.x 2018-10-23 No  No LTS N/D 1 de junio de 2019
Versión antigua, sin servicio técnico: 12.x Erbium[13] 2019-04-23 Versión antigua, sin servicio técnico: Sin soporte 21 de octubre de 2019 20 de octubre de 2020 30 de abril de 2022
Versión antigua, sin servicio técnico: 13.x - 22 de octubre de 2019 No  No LTS - 1 de abril de 2020 1 de junio de 2020
Versión antigua, con servicio técnico: 14.x Fermium[13] 21 de abril de 2020 Versión antigua, con servicio técnico: Mantenimiento LTS 20 de octubre de 2020 19 de octubre de 2021 30 de abril de 2023
Versión antigua, sin servicio técnico: 15.x - 22 de octubre de 2020 Versión antigua, sin servicio técnico: Sin soporte - 1 de abril de 2021 1 de junio de 2021
Versión antigua, con servicio técnico: 16.x Gallium[13] 21 de abril de 2021 Versión antigua, con servicio técnico: Mantenimiento 26 de octubre de 2021 18 de octubre de 2022 30 de abril de 2024
Versión antigua, sin servicio técnico: 17.x - 19 de octubre de 2021 Versión antigua, sin servicio técnico: Sin soporte N/D 1 de junio de 2022
Versión estable actual: 18.x - 19 de abril de 2022 Versión estable actual: Activo 25 de octubre de 2022 18 de octubre de 2023 30 de abril de 2025
Última versión prevista para lanzamiento: 19.x - 18 de octubre de 2022 Última versión prevista para lanzamiento: Prevista - 1 de abril de 2023 1 de junio de 2023
Última versión prevista para lanzamiento: 20.x - 18 de abril de 2023 Última versión prevista para lanzamiento: Prevista 24 de octubre de 2023 22 de octubre de 2024 30 de abril de 2026

Comunidad

editar

Existe una comunidad muy activa de desarrolladores de Node.js que se comunican a través de grupos de discusión, nodejs y nodejs-dev y el canal IRC #node.js en freenode. La comunidad se reúne en NodeConf, una convención de desarrolladores centrada en Node.js.[15]

Véase también

editar

Referencias

editar
  1. Joyent. «node». Github. Consultado el 16 de junio de 2015. 
  2. «Release 2024-04-24, Version 22.0.0 (Current)». Consultado el 2 de mayo de 2024 – via GitHub. 
  3. «Node.js 20 ChangeLog». Consultado el 22 de septiembre de 2023 – via GitHub. 
  4. Finley, Klint (25 de enero de 2011). «Wait, What's Node.js Good for Again?». ReadWriteWeb (en inglés). Archivado desde el original el 21 de junio de 2013. Consultado el 16 de junio de 2015. 
  5. http://mashable.com/2011/03/10/node-js/
  6. Alex Handy (24 de junio de 2011). «Node.js pushes JavaScript to the server-side». SDTimes. Consultado el 24 de junio de 2011. 
  7. https://web.archive.org/web/20110724011601/http://wiki.commonjs.org/wiki/Implementations/node.js
  8. http://blog.caustik.com/2012/08/19/node-js-w1m-concurrent-connections/
  9. cluster
  10. «CommonJS Implementations». Archivado desde el original el 23 de marzo de 2010. Consultado el 15 de mayo de 2011. 
  11. Ryswyck, Jan. «Taking Baby Steps with Node.js – CommonJS and Creating Custom Modules». Archivado desde el original el 28 de junio de 2011. Consultado el 15 de mayo de 2011. 
  12. About Node.js, Node.js Website
  13. a b c d e f g h «nodejs/Release». GitHub (en inglés). Consultado el 15 de noviembre de 2017. 
  14. «node 8 reschedule». Github. Consultado el 22 de enero de 2019. 
  15. «Copia archivada». Archivado desde el original el 17 de septiembre de 2012. Consultado el 2 de agosto de 2014. 

Enlaces externos

editar