Diferencia entre revisiones de «Node.js»

De Manuais Informática - IES San Clemente.
Ir a la navegación Ir a la búsqueda
(Instalación de Node.js en Debian)
(Página blanqueada)
(Etiqueta: Vaciado)
 
(No se muestran 12 ediciones intermedias del mismo usuario)
Línea 1: Línea 1:
= Node.js =
 
  
== Introducción a Node.js ==
 
[http://nodejs.org/ Node.js] es un entorno '''JavaScript de lado de servidor''' que utiliza un '''modelo asíncrono''' y '''dirigido por eventos'''.
 
 
Node usa el motor de JavaScript V8 de Google: una VM tremendamente rápida y de gran calidad escrita por gente como Lars Bak, uno de los mejores ingenieros del mundo especializados en VMs.
 
 
No olvidemos que V8 es actualizado constantemente y es uno de los intérpretes más rápidos que puedan existir en la actualidad para cualquier lenguaje dinámico. Además las capacidades de Node para I/O (Entrada/Salida) son realmente ligeras y potentes, dando al desarrollador la posibilidad de utilizar a tope la I/O del sistema. Node soporta protocolos TCP, DNS y HTTP.
 
 
 
== ¿Qué diferencias tiene Node.js respecto a Apache u otros servidores web? ==
 
 
* Apache crea un nuevo hilo por cada conexión cliente-servidor. Esto funciona bien para pocas conexiones, pero crear nuevos hilos tiene un coste, así como la realización de cambios de contexto. A partir de 400 conexiones simultáneas, el número de segundos para atender las peticiones crece considerablemente. Podemos decir que Apache funciona bien pero no es el mejor servidor para lograr máxima concurrencia (lograr tener el número mayor de conexiones abiertas posibles).
 
* Uno de los puntos fuertes de Node es su capacidad de mantener muchas conexiones abiertas y esperando. En Apache por ejemplo el parámetro '''MaxClients por defecto es 256'''. Este valor puede ser aumentado para servir contenido estático, sin embargo si se sirven aplicaciones web dinámicas en PHP u otro lenguaje es probable que al poner un valor alto el servidor se quede bloqueado ante muchas conexiones -esto dependerá del trabajo que la aplicación web de al servidor y de su capacidad hardware-.
 
* Una aplicación para Node se programa sobre un solo hilo. Si en la aplicación existe una operación bloqueante (entrada/salida por ejemplo), Node creará entonces otro hilo en segundo plano, pero no lo hará sistemáticamente por cada conexión como haría Apache.
 
* En teoría Node puede mantener tantas conexiones como número máximo de archivos descriptores (sockets) soportados por el sistema. En un sistema UNIX este límite puede rondar por las '''65.000 conexiones''', un número muy alto. Sin embargo en la realidad la cifra depende de muchos factores, como la cantidad de información que esté la aplicación distribuyendo a los clientes.
 
* Una aplicación con actividad normal podría mantener '''20.000-25.000''' clientes a la vez sin haber apenas retardo en las respuestas. Un inconveniente de Node es que debido a su arquitectura (de usar sólo un hilo) también sólo podrá usar una CPU. Un método para usar múltiples núcleos sería iniciar múltiples instancias de Node en el servidor y poner un balanceador de carga delante de ellos.
 
 
Node.js no es el único servidor de este tipo, hay otros proyectos como Tornado (Python), Twisted(Python),Apache Mina(Java), Jetty(Java), etc.
 
 
Otra buena alternativa puede ser el lenguaje [http://www.erlang.org/ Erlang] el cuál permite crear sistemas en tiempo real con alta escalabilidad y alta disponibilidad.
 
 
== Ejemplo de un código de node.js ==
 
 
<source lang="javascript">
 
var http = require('http');
 
var s = http.createServer(function (req, res) {
 
  res.writeHead(200, {'Content-Type': 'text/plain'});
 
  res.end('Hello World\n');
 
});
 
s.listen(8000);
 
console.log('Server running!');
 
</source>
 
 
JavaScript es muy buen lenguaje para programar asíncronamente, ya que fue diseñado especialmente para ser usado en programación orientada a eventos. Esto le hace especialmente atractivo para realizar aplicaciones no bloqueantes y de alta concurrencia.
 
 
'''Otro ejemplo de código para node.js ''':
 
 
<source lang="javascript">               
 
var fs = require('fs');
 
 
fs.readFile('report.txt', function(data) {
 
    console.log('Read: ' + data);
 
});
 
 
fs.writeFile('message.txt', 'Hello World!', function() {
 
    console.log('File saved!');
 
});
 
</source>
 
               
 
Cuando se ejecuta este código Node va a mandar leer un fichero y mandará también escribir en otro (siempre en el lado del servidor), y luego pasará a un estado de espera.
 
 
Cuando las operaciones se terminen se ejecutarán los callbacks asociados a cada tarea (las funciones anónimas que tenemos programadas). Debido a la peculiaridad de Javascript, no hay nada que garantice el orden en el que van a ser mostrados los mensajes de los callbacks (teóricamente el que termine antes se mostrará en primer lugar).
 
 
Esta manera de ejecutar las entradas y salidas (sin estar a la espera de que se terminen de forma secuencial, antes de pasar a la siguiente tarea), asegura que el hilo principal de programa siempre va a estar en ejecución realizando nuevas llamadas a tareas que hayan sido programadas.
 
 
== Cuando usar Node.js ==
 
 
Node es especialmente bueno en aplicaciones web que necesiten una conexión persistente con el navegador del cliente, ya que su consumo de recursos es mínimo y el número de clientes simultáneos soportados es altísimo.
 
 
'''Lista de aplicaciones para las que Node encajaría perfectamente:'''
 
 
* Juegos online.
 
* Gestores de correo online: de esta manera teniendo el navegador abierto podríamos ver notificaciones en tiempo real de nuevos correos recibidos.
 
* Herramientas de colaboración.
 
* Chats.
 
* Redes sociales: por ejemplo para actualizar automáticamente tu muro de novedades.
 
* Herramientas de traducción en tiempo real.
 
 
== Cuando no usar Node.js ==
 
 
Node tiene muchas ventajas, pero como en todo no hay herramientas ni peores ni mejores, sino unas que se ajustan mejor a unos casos de uso que otras.
 
 
* ¿Son importantes tiempos de respuesta bajos y alta concurrencia?
 
* ¿El número de usuarios activos va a ser considerable?
 
* ¿El proyecto es pequeño? Si es grande, ¿se disponen de las librerías/drivers de DB necesarias para trabajar desde JavaScript?
 
 
Si en dichas preguntas has respondido sí, entonces Node se adapta perfectamente como solución a tus problemas. Si has respondido no a alguna pregunta entonces posiblemente Node no sea la mejor solución para ese software.
 
 
== Librerías interesantes para Node.js ==
 
 
* '''Socket.IO''': "Socket.IO aims to make realtime apps possible in every browser and mobile device, blurring the differences between the different transport mechanisms. Under the hoods, Socket.IO will use feature detection to decide if the connection will be established with WebSocket, AJAX long polling, etc (see supported transports), making creating realtime apps that work everywhere a snap."
 
* '''Express''': un framework web sobre Node.
 
* '''node.dbslayer.js''': "ofrece soporte MySQL para Node"
 
* '''Handlebars.js''': "para crear plantillas fácilmente"
 
* '''MongoDB driver o Mongoose'''.
 
 
Información sobre Node.js extraída de http://www.rmunoz.net/introduccion-a-node-js.html
 
 
= Instalacion de Node.js y npm (node packet manager) en Debian =
 
 
Veamos como realizar la instalación de Node.js y el gestor de paquetes de Node npm.
 
 
== Instalación de Node.js en Debian ==
 
 
Para instalar la última versión de Nodejs haremos lo siguiente:
 
<source lang="bash">
 
 
curl -sL https://deb.nodesource.com/setup_13.x | sudo bash -
 
 
# Instalamos a continuación nodejs y npm
 
apt-get install -y nodejs
 
 
# Chequeamos la versión instalada:
 
node -v
 
 
v13.2.0
 
 
</source>
 
 
== Comandos básicos en el uso de Node.js ==
 
 
Desde la línea de comandos de node podemos teclear instrucciones para ejecutar aplicaciones o bien escribir una aplicación. En general lo que se suele hacer es crear un fichero .js con las instrucciones de la aplicación que va a ejecutar Node.
 
 
El entorno de trabajo al que se accede desde la línea de comandos se denomina REPL.
 
 
<source lang="javascript">
 
// Para acceder a la línea de comandos REPL de node:
 
node
 
 
// Accederemos a la consola de trabajo indicada con el símbolo >
 
 
// Para consultar ayuda de node:
 
> .help
 
 
// Para salir de node:
 
> .exit
 
// O bien CTRL+C CTRL+C
 
 
// Ejemplo de código de javascript en el entorno REPL de node:
 
>a=4;
 
4
 
 
 
// Ejemplo de pequeño programa en linea de comandos >:
 
> a=[1,2,3];
 
> a.forEach(function(valor){
 
..... console.log(valor);
 
..... });
 
 
// Producirá como resultado
 
1
 
2
 
3
 
 
</source>
 
 
'''
 
'''Ejemplo de video con comandos de prueba en el entorno REPL de Node''':'''
 
 
{{#ev:youtube|sgiNp1EQsIM}}
 

Revisión actual del 10:39 4 dic 2019