Introducción
a nodejs
http://goo.gl/4vpPs
NODEJS
Aquí lo tenéis:
http://nodejs.org/
¿Qué es NODEJS?
Resumidamente:
- Se programa en JavaScript
- Se ejecuta en servidor
- El núcleo es V8, el motor de JavaScript
de Google (el del Chrome) - Recubre V8 con un conjunto de utilidades (API)
para acceder distintos recursos
¿Por qué nodejs?
- Se programa rápido
- Es eficiente
- Es escalable
- No bloqueante
- No hay threads
- Multiplataforma
- Comunidad fantástica
- Programación funcional
- API potente
- Paquetes para realizar todo tipo de tareas
Hablemos de NON BLocking
y THREADS
Un único hilo
¡Pero tengo muchos núcleos en mi procesador!
Los puedes aprovechar con Cluster y Child Process:
http://nodejs.org/api/cluster.html
http://nodejs.org/api/child_process.html
Por las decisiones de diseño que impone,
escalar horizontalmente entre máquinas es también relativamente sencillo.
HOLA MUNDO
Veamos los siguientes ejemplos:
- Por consola
- Por web
- Por TCP
Consola
Fichero hola.js
console.log("Hola mundo!");
Para ejecutar:
> node hola.js
WEB
El servidor en pocas líneas:
var http = require('http');
http.createServer(function (request, response) {
response.writeHead(200, {'Content-Type': 'text/plain'});
response.end('Hola Mundo!\n');
}).listen(8000);
console.log('Server running at http://127.0.0.1:8000/');
Ejecutalo y abre el navegador en
http://127.0.0.1:8000/
TCP
var net = require('net');
net.createServer(function (stream) {
stream.write('Hola mundo!\r\n');
stream.on('end', function () {
stream.end('Adiós!\r\n');
});
stream.pipe(stream);
}).listen(7000);
Y haz un telnet al puerto 7000
Filosofía asíncrona de node js
NodeJs se apoya en lo que se conoce habitualmente como patrón de continuación.
Miremos un poco la API:
http://nodejs.org/api/
dos conceptos
Actores:
realizan acciones o tareas.
Callbacks:
reciben los resultados de las acciones.
actores
- Son funciones que hacen las tareas. Su último argumento será el callback (cb) que invocar al terminar.
- Si ocurre algún error que el actor no sepa gestionar, se lo pasa al callback y termina su ejecución.
- No debe utilizar "throw" y el valor de retorno se ignora
- Es decir, un "return x" se convertiría en "return cb(null, x);"
- Y un "throw er" pasaría a ser "return cb(er)"
callbacks
- Los callbacks reciben los resultados de las acciones.
Continúan con la ejecución. - Deben estar SIEMPRE preparados para gestionar los errores.Para garantizarlo, por convención siempre se pasará el error como primer argumento.
- Pueden ser funciones anónimas en línea, aunque habitualmente no lo serán.
- Puede o bien gestionar el error y llamar a otros callbacks modificando los datos, o pasar directamente el error hacia arriba.
el infierno de los callbacks
Así se denomina cuando el anidamiento de callbacks
crece de forma descontrolada.
crece de forma descontrolada.
Aunque creo que es MEJOR resolverlo con PROMESAS que lo dejaremos para un meetup posterior.
UN ejemplillo
Vamos a leer unos ficheros de pedidos de compra y sacar algunos resúmenes.
Gestión de paquetes: npm
npm es un gestor de paquetes de Node.js
> npm help
Permite instalar paquetes localmente o de forma global
> npm install express
> npm install express -g
La instalación de forma global puede necesitar de permisos de administrador:
> sudo npm install express -g
Algunas instrucciones
Actualización de paquetes:
> npm update
Eliminación de paquetes:
> npm uninstall express
Enlazar paquetes
> npm link colors
package.json
http://package.json.nodejitsu.com/
Información sobre la aplicación:
- Metainformación como nombre, descripción, autor.
- Dependencias
- Dependencias de desarrollo
- Repositorio
- etc.
> npm install colors --save
Un ejemplo
package.json
{
"name": "hola-mundo",
"dependencies" : {
"colors" : "*"
}
}
hola.js
require("colors")
console.log("Hola mundo rojo!".red);
console.log("Hola mundo verde!".green);
console.log("Hola mundo azul!".blue);
y por consola
> npm install
> node hola.js
Creando una aplicación web
con express
Instala express
> npm install express -g
Crea una aplicación
> express demoapp
Inspeccionemos lo que se ha creado
Arrancar la aplicación
Instala las dependencias y arráncala
> npm install
> node app
Para acelerar el redespliegue apoyate en algo como supervisor
> npm install supervisor -g
> supervisor -w routes,app.js app.js
JADE
Una herramienta de templating fundamental para generar código html fácilmente (o cualquier cosa basada en xml).
Motivaciones de Jade:
- Evitar redundancias
- Reducir ruido visual
- Fomentar la reutilización
Ejemplos de código
Sintáxis compacta
html
body
#contenedor
p Algo de texto
.campos
label(for="uncampo") Label del campo
input#uncampo(name="campo")
Case
html
body
amigos = 10
case amigos
when 0
p No tienes amigos
when 1
p Tienes un amigo
default
p Tienes #{amigos} amigos
Atributos
Distintas formas
input(type='checkbox', name='agreement', checked)
input(type='checkbox', name='agreement', checked)
input(type='checkbox' name='agreement' checked)
input( type='checkbox' name='agreement' checked)
Doctype
Dos formas
doctype
!!!
doctype transitional
!!! transitional
doctype 5
!!!5
Iteración
elementos = ["un", "dos", "tres"] each elemento,i in elementos li #{elemento}: #{i}
obj = { foo: 'bar' } each val, key in obj li #{key}: #{val}
Condicionales
for user in users
unless user.isAnonymous
if user.role == 'admin'
p #{user.name} is an admin
else
p= user.name
herencia de templates
layout.jade
html
head
h1 My sitio - #{title}
block scripts
script(src='/jquery.js')
body
block content
block foot
#footer
p El contenido del pie
plantilla.jade
extends layout
block scripts
script(src='/jquery.js')
script(src='/mascotas.js')
block content
h1= title
each mascota in mascotas
include mascota
blocks
Tres formas de usar blocks:
-
Reemplazando
- Agregando por delante
- Agregando por detrás
block scripts
script(src='/jquery.js')
script(src='/mascotas.js')
block prepend scripts
script(src='/otro.js')
block append scripts
script(src='/mascotas.js')
Mixins
Funciones para reutilizar dentro de la plantilla:
mixin mascotas(listadoMascotas)
ul.mascotas
- each mascota in listadoMascotas
li= mascota
creando proxies inversos
http-proxy
https://github.com/nodejitsu/node-http-proxy
> npm install http-proxy
Un ejemplo sencillo:
var httpProxy = require('http-proxy');
httpProxy.createServer(function (req, res, proxy) {
proxy.proxyRequest(req, res, {
host: 'localhost',
port: 3000
});
}).listen(8002);
YEOMAN
YO, GRUNT y bower
Profesionalizando el desarrollo de front.
Se trata de una suite muy potente para desarrolladores.
Yo: scaffolding y configuración de grunt
Grunt: construye, previsualiza y prueba el proyecto
Bower: gestión de dependencias
Arrancando
Instala las tres librerías:
> npm install -g yo grunt-cli bower
El generador de AngularJS
> npm install -g generator-angular
Crea tu primera app
> yo webapp
> yo angular #para crear una app angular
Agreguemos alguna dependencia
> bower install lodash
y arrancamos grunt
Tareas más habituales:
> grunt server
> grunt test
> grunt jade #si agregamos como tarea nuestra
Inspeccionemos el Gruntfile.js
websockets
Comunicación push y pull cliente servidor.
Nos basamos en socket.io
http://socket.io/
Veamos un ejemplo.
Introducción a NodeJS
By Gonzalo Ruiz de Villa
Introducción a NodeJS
- 42,605