Node.js

**Node.js** ye una redolada en tiempu d'execución multiplataforma, de códigu abiertu, pa la capa del servidor (pero nun llindándose a ello) basáu nel llinguaxe de programación ECMAScript, asíncrono, con I/O de datos nuna arquiteutura empobinada a eventos y basáu nel motor V8 de Google. Foi creáu col enfoque de ser útil na creación de programes de rede altamente escalables, como por casu, servidores web. Foi creáu por Ryan Dahl en 2009 y la so evolución ta apadrinada pola empresa Joyent, qu'amás tien contratáu a Dahl en plantía.

Node.js ye similar nel so propósitu a Twisted o Tornáu de Python, Perl Object Environment de Perl, libevent o libev de C, EventMachine de Ruby, vibe.d de D y Java EE de Java esisti Apache MINA, Netty, Akka, Vert.x, Grizzly o Xsocket.
Al contrariu que la mayoría del códigu JavaScript, nun s'executa nun navegador, sinón nel servidor. Node.js implementa delles especificaciones de CommonJS. Node.js inclúi una redolada REPL pa depuración interactiva.

## Ejemplo
Versión d'un hola mundu d'un servidor HTTP escritu en Node.js:

```javascript
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}/`);
});
```


Otru exemplu con un servidor TCP qu'escucha nel puerto 7000 y respuende con cualquier cosa que se-y unvie:

```javascript
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);
```


## Aspeutos téunicos
### Concurrencia
Node.js funciona con un modelu d'evaluación d'un únicu filo d'execución, usando entraes y salíes asíncronas les cualos pueden executase concurrentemente nun númberu d'hasta cientos de miles ensin incurrir en costos acomuñaos al cambéu de contestu. Esti diseñu de compartir un únicu filo d'execución ente toles solicitúes atiende a necesidaes d'aplicaciones altamente concurrentes, nel que toa operación que realice entraes y salíes tien de tener una función callback.
Un inconveniente d'esti enfoque d'únicu filo d'execución ye que Node.js rique de módulos adicionales como *cluster* pa esguilar l'aplicación col númberu de nucleos de procesamientu de la máquina na que s'executa.

### V8
V8 ye la redolada d'execución pa JavaScript creáu para Google Chrome. Ye software llibre dende 2008, ta escritu en C++ y compila el códigu fonte JavaScript en códigu de máquina en llugar d'interpretalo en tiempu real.

Node.js contién libuv pa remanar eventos asíncronos. Libuv ye una capa d'astracción de funcionalidades de redes y sistemes d'archivu en sistema Windows y sistemes basaos en POSIX como Linux, Mac OS X y Unix.

El cuerpu d'operaciones de base de Node.js ta escritu en JavaScript con métodos de soporte escritos en C++.

### Módulos

Node.js incorpora dellos "módulos básicos" compilados nel mesmu binariu, como por casu el módulu de rede, qu'apurre una capa pa programación de rede asíncrona y otros módulos fundamentales, como por casu Path, FileSystem, Buffer, Timers y el de propósitu más xeneral Stream. Ye posible utilizar módulos desenvueltos por terceros, yá sía como archivos ".node" precompilados, o como archivos en javascript planu. Los módulos Javascript impleméntense siguiendo la especificación CommonJS pa módulos, utilizando una variable d'esportación pa dar a estos scripts accesu a funciones y variables implementaes polos módulos.

Los módulos de terceros pueden estender node.js o añader un nivel d'astracción, implementando delles utilidaes middleware pa utilizar n'aplicaciones web, como por casu los frameworks *connect* y *express*. Magar que los módulos pueden instalase como archivos simples, de normal instálense utilizando'l *Node Package Manager (npm)* que nos facilitará la compilación, instalación y actualización de módulos según la xestión de les dependencies. Amás, los módulos que nun s'instalen el direutoriu por defectu de módulos de Node van precisar l'usu d'una ruta relativa pa poder atopalos. El wiki Node.js apurre una llista de dellos de los módulos de terceros disponibles.

### Desenvolvimientu homoxéneu ente veceru y servidor
Node.js puede ser combináu con una base de datos documental (por casu, MongoDB o CouchDB) y JSON lo que dexa desenvolver nuna redolada de desenvolvimientu JavaScript unificáu. Cola adautación de los patrones pa desenvolvimientu del llau del servidor tales como MVC y les sos variantes MVP, MVVM, etc. Node.js facilita la reutilización de códigu del mesmu modelu de interfaz ente'l llau del veceru y el llau del servidor.

### Bucle d'eventos
Node.js rexistrar col sistema operativu y cada vez qu'un veceru establez una conexón executa un callback. Dientro de la redolada d'execución de Node.js, cada conexón recibe una pequeña asignación d'espaciu de memoria dinámicu, ensin tener que crear un filo d'execución. A diferencia d'otru servidores empobinaos por eventos, el bucle de xestión d'eventos de Node.js nun ye llamáu explícitamente sinón que s'activa a la fin de cada execución d'una función callback. El bucle de xestión d'eventos terminar cuando yá nun queden eventos por atender.

## Releases
Les nueves releases major de Node.js sacar de la caña master de GitHub cada seis meses. Les versiones pares sacar n'abril, y les impares n'ochobre. Cuando se lliberar una versión impar, la versión par anterior pasa a soporte al llargu plazu (Long Term Support, LTS), que da a la versión un soporte activu de 18 meses dende la fecha d'entamu de la LTS. Dempués d'estos 18 meses, la versión recibe otros 12 meses de soporte de caltenimientu. Una versión activa va recibir los cambeos compatibles unes poques selmanes dempués de qu'aterricen na versión estable actual. Una versión de mantenimiendo va recibir namái actualizaciones crítiques y de documentación.

La estratexa y política de les versiones LTS xestionar pol LTS Working Group en collaboración col Technical Steering Committee de Node.js Foundation.

## Comunidá
Esiste una comunidá bien activa de desarrolladores de Node.js que se comuniquen al traviés de grupos de discutiniu, nodejs y nodejs-dev y la canal IRC #node.js en freenode. La comunidá axuntar en NodeConf, una convención de desarrolladores centrada en Node.js.

## Ver tamién
* JavaScript
* V8
* NPM, el xestor de paquetes pa Node.js.
* Redolada de desenvolvimientu MEAN
* Meteor (framework web)

## Referencies

## Enllaces esternos
* Sitiu oficial (inglés)
* Repositorio de códigu fuente (inglés)
* Llista de corréu Nodejs - Grupu de discutiniu sobre Node.js (inglés)
* Llista de corréu Nodejs-dev - Grupu de discutiniu sobre fallos y cambeos en Node.js (inglés)
* NPMJS. El xestor de paquetes de Node.js  (inglés)
* ''How To Node'', tutorial de Node.js (inglés)
* Como desenvolver la to propia estensión nativa pa Node.js (inglés)
* ''NodeNica'', comunidá nicaragüense de Node.js (español)
* ''Concurrencia y paralelismu'', por Marisa Gil (español)