JavaScript en servidor
Qué es nodejs
- NodeJS es un intérprete de JavaScript que se ejecuta en servidor.
- Está basado en el motor de JavaScript que utiliza Google Chrome (V8), escrito en C++
Características principales
- Tener el mismo lenguaje en cliente y servidor
- Permite a cualquier persona desarrollar en backend o en frontend
- Permite reusar código o incluso mover código de cliente a servidor o al revés
- Está orientado a eventos y utiliza un modelo asíncrono (propio de JavaScript).
Al contrario que en el navegador, encontramos muchas llamadas asíncronas:
- Llamadas a APIs
- Lectura y escritura de ficheros
- Ejecución de cálculos en el servidor
- ....
Llamadas síncronas en servidor serían fatales:
- ¡Bloqueariamos las conexiones al servidor hasta que acabase la instrucción bloqueante!
- Al ser asíncrono podremos tener muchas sesiones concurrentes
- Es monohilo
- Utiliza un solo procesador
- Si queremos usar toda la potencia de la CPU, tendremos que levantar varias instancias de node y utilizar un balanceador de carga (por ejemplo con pm2)
- Es un lenguaje con tipado dinámico y débil (lo cual no es del gusto de todos)
Desventajas
- Trabajar con código asíncrono hace que a veces el código no sea excesivamente legible
- Imagina que guardamos un registro de los accesos de los usuarios a nuestra app:
trackUser = function(userId) {
users.findOne({userId: userId}, function(err, user) {
var logIn = {userName: user.name, when: new Date};
logIns.insert(logIn, function(err, done) {
console.log('wrote log-in!');
});
});
- Tenemos 3 funciones anidadas en una simple operación.
- Esto es lo que se conoce como callback hell
Evitar el callback en el navegador
- Mediante el uso de promesas
- Se trata de escribir código asíncrono con un estilo síncrono.
Opciones más actuales:
- Generators / Yields (ES6)
- Async / Await (ES8)
- Ver Async / Await
Compatiblidad node con ES6 y más allá
- El soporte de ES6 en node es limitado
- Se pude añadir el flag --harmony
- Se puede utilizar un transpiler, que genere código compatible. El más habitual es babel
- En el navegador tenemos el mismo problema (mismo motor...): es práctica extendida el uso de transpilers.
Hola Mundo en node
Editamos un fichero en JavaScript, holaMundo.js:
console.log ("Hola Mundo");
- Lo ejecutamos mediante node holaMundo.js
- Si escribimos node sin más, podemos acceder a la consola de node, un intérprete de JavaScript, similar al que tenemos en el navegador
npm
- Es el gestor de paquetes de node
- Gestiona las dependencias de mi aplicación (versiones)
- Instala paquetes
- Publica paquetes en npm Orgs
- Idea similar a Maven en Java o Composer en PHP