Creación de aplicaciones web con Node.js y Express

50
NodeJS & Express Desarrollo Web 2.0 Eficaz Betabeers Barcelona 23/03/2012

Transcript of Creación de aplicaciones web con Node.js y Express

Page 1: Creación de aplicaciones web con Node.js y Express

NodeJS & ExpressDesarrollo Web 2.0 Eficaz

Betabeers Barcelona 23/03/2012

Page 2: Creación de aplicaciones web con Node.js y Express

Quienes somos?

Christophe Eymardemail : [email protected]

Félix Delval twitter : @fe_lix_email : [email protected]

https://github.com/ravelsoft

Page 3: Creación de aplicaciones web con Node.js y Express

NodeJS

Page 4: Creación de aplicaciones web con Node.js y Express

Qué es NodeJS

● LibUV : Una biblioteca desarrollada por Joyent en C

Page 5: Creación de aplicaciones web con Node.js y Express

Qué es NodeJS

● LibUV : Una biblioteca desarrollada por Joyent en C

● V8 : El motor Javascript de Google Chrome

Page 6: Creación de aplicaciones web con Node.js y Express

Qué es NodeJS

● LibUV : Una biblioteca desarrollada por Joyent en C

● V8 : El motor Javascript de Google Chrome● Runtime en Javascript

Page 7: Creación de aplicaciones web con Node.js y Express

Qué es NodeJS

● LibUV : Una biblioteca desarrollada por Joyent en C

● V8 : El motor Javascript de Google Chrome● Runtime en Javascript● Multi-Plataforma : Windows, Linux, OS X

Page 8: Creación de aplicaciones web con Node.js y Express

Qué es NodeJS

● LibUV : Una biblioteca desarrollada por Joyent en C

● V8 : El motor Javascript de Google Chrome● Runtime en Javascript● Multi-Plataforma : Windows, Linux, OS X● NPM : Package Manager (www.npmjs.org)

Page 9: Creación de aplicaciones web con Node.js y Express

Porque NodeJS

● Un Sólo Hilo○ ¡ (casi) adios mutex y race-condition !

Page 10: Creación de aplicaciones web con Node.js y Express

Porque NodeJS

● Un Sólo Hilo○ ¡ (casi) adios mutex y race-condition !

● Asíncrono (Non Blocking) : ○ Uso óptimo del CPU

Page 11: Creación de aplicaciones web con Node.js y Express

Porque NodeJS

● Un Sólo Hilo○ ¡ (casi) adios mutex y race-condition !

● Asíncrono (Non Blocking) : ○ Uso óptimo del CPU○ « scaling » más evidente : más procesos y un load-

balancer

Page 12: Creación de aplicaciones web con Node.js y Express

Synchronous vs. Asynchronous

Page 13: Creación de aplicaciones web con Node.js y Express

Porque NodeJS

● Un Sólo Hilo○ ¡ (casi) adios mutex y race-condition !

● Asíncrono (Non Blocking) : ○ Uso óptimo del CPU○ « scaling » más evidente : más procesos y un load-

balancer● Compartir código entre cliente e servidor

Page 14: Creación de aplicaciones web con Node.js y Express

Porque NodeJS

● Un Sólo Hilo○ ¡ (casi) adios mutex y race-condition !

● Asíncrono (Non Blocking) : ○ Uso óptimo del CPU○ « scaling » más evidente : más procesos y un load-

balancer● Compartir código entre cliente e servidor● V8

Page 15: Creación de aplicaciones web con Node.js y Express

V8 en el mundo Real (más o menos)

fuente: http://shootout.alioth.debian.org

Page 16: Creación de aplicaciones web con Node.js y Express

Desarrollar en NodeJS

● Programación por callbacks

Page 17: Creación de aplicaciones web con Node.js y Express

Desarrollar en NodeJS

● Programación por callbacks○ Parecido a request AJAX

Page 18: Creación de aplicaciones web con Node.js y Express

Desarrollar en NodeJS

● Programación por callbacks○ Parecido a request AJAX○ « Hilos cooperativos »

Page 19: Creación de aplicaciones web con Node.js y Express

Desarrollar en NodeJS

● Programación por callbacks○ Parecido a request AJAX○ « Hilos cooperativos »

● El event-loop

Page 20: Creación de aplicaciones web con Node.js y Express

Desarrollar en NodeJS

● Programación por callbacks○ Parecido a request AJAX○ « Hilos cooperativos »

● El event-loop○ epoll / kpoll / etc.

Page 21: Creación de aplicaciones web con Node.js y Express

Desarrollar en NodeJS

● Programación por callbacks○ Parecido a request AJAX○ « Hilos cooperativos »

● El event-loop○ epoll / kpoll / etc.○ Llama las callbacks cuando tienen su resultado

Page 22: Creación de aplicaciones web con Node.js y Express

Desarrollar en NodeJS

● Programación por callbacks○ Parecido a request AJAX○ « Hilos cooperativos »

● El event-loop○ epoll / kpoll / etc.○ Llama las callbacks cuando tienen su resultado

● ... hay que respetarle

Page 23: Creación de aplicaciones web con Node.js y Express

Desarrollar en NodeJS

● Programación por callbacks○ Parecido a request AJAX○ « Hilos cooperativos »

● El event-loop○ epoll / kpoll / etc.○ Llama las callbacks cuando tienen su resultado

● ... hay que respetarle○ Cuidado con el uso del CPU

Page 24: Creación de aplicaciones web con Node.js y Express

Desarrollar en NodeJS

● Programación por callbacks○ Parecido a request AJAX○ « Hilos cooperativos »

● El event-loop○ epoll / kpoll / etc.○ Llama las callbacks cuando tienen su resultado

● ... hay que respetarle○ Cuidado con el uso del CPU○ process.nextTick

Page 25: Creación de aplicaciones web con Node.js y Express

Hello World

var http = require('http'); function miRespuesta(req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n');}var server = http.createServer(miRespuesta)server.listen(1337, '127.0.0.1');

Page 26: Creación de aplicaciones web con Node.js y Express

Mal Ejemplo : Fibonacci

Page 27: Creación de aplicaciones web con Node.js y Express

Mal Ejemplo : Fibonacci

var http = require('http'); function fibonacci(n) { if (n <= 1) return n; else return fibonacci(n - 1) + fibonacci(n - 2);}http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); if (req.url == "/fibo") res.end("Fibo : " + fibonacci(33)); // OUCH else res.end('Hello World\n');}).listen(1337, '127.0.0.1');

Page 28: Creación de aplicaciones web con Node.js y Express

Mal Ejemplo II, pero mejor

var http = require("http") function fibonacci(n, cbk) { if (n <= 1) cbk(n); else fibonacci(n - 1, function(_n_1) { process.nextTick(function() { fibonacci(n - 2, function( _n_2) { cbk(_n_1 + _n_2) }) }) })}

http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); if (req.url == "/fibo") { fibonacci(33, function(fibres) { res.end('Fibo: ' + fibres + '\n'); }) } else { res.end('Hello World\n'); } }).listen(1337, '127.0.0.1');

Page 29: Creación de aplicaciones web con Node.js y Express
Page 30: Creación de aplicaciones web con Node.js y Express

Express

Page 31: Creación de aplicaciones web con Node.js y Express

Express y su comunidad

+ de 5500 watchers + de 540 forks + de 100 issues abiertas

source : github.com

Page 32: Creación de aplicaciones web con Node.js y Express

¿ Que propone ?

● Router de URL Con get, post,...

Page 33: Creación de aplicaciones web con Node.js y Express

¿ Que propone ?

● Router de URL Con get, post,...● Facilidades para motores de plantillas:

Jade, EJS, JinJS, ...

Page 34: Creación de aplicaciones web con Node.js y Express

¿ Que propone ?

● Router de URL Con get, post,...● Facilidades para motores de plantillas:

Jade, EJS, JinJS, ...

● Middleware via Connect y en cada función de routing

Page 35: Creación de aplicaciones web con Node.js y Express

¿ Que propone ?

● Router de URL Con get, post,...● Facilidades para motores de plantillas:

Jade, EJS, JinJS, ...

● Middleware via Connect y en cada función de routing

● focus en alta rendimiento● muy buen test coverage

Page 36: Creación de aplicaciones web con Node.js y Express

Base del routing

app.get('/post/:post', myfun);app.get(\/post\/([^\/]+)\/?, my fun); matched : /post/123 /post/foobar /post/foobar not matched : /post/foo/bar

Page 37: Creación de aplicaciones web con Node.js y Express

Plantillas con Jade

!!! 5html head title Blog link(rel='stylesheet', href='/stylesheets/style.css') body #container block content

Page 38: Creación de aplicaciones web con Node.js y Express

Instalación

# npm install -g express

Page 39: Creación de aplicaciones web con Node.js y Express

Hello, World!

var app = express.createServer(); app.get('/', function(req, res){ res.send('Hello World');}); app.listen(3000);

Page 40: Creación de aplicaciones web con Node.js y Express

Hello, World!

var express = require('express');var app = express.createServer(); app.get('/', function(req, res){ res.send('Hello World');}); app.listen(3000);

Page 41: Creación de aplicaciones web con Node.js y Express

El test más inútil del mundo

$ ab -n 10000 -c 1000 http://localhost:3000 Concurrency Level: 1000Time taken for tests: 19.458 secondsComplete requests: 100000Requests per second: 5139.34 [#/sec] (mean)Time per request: 194.578 [ms] (mean)Time per request: 0.195 [ms] (mean, across all concurrent requests)

Intel i3 540 @ 3.07GHz / 8 GB RAM

Page 42: Creación de aplicaciones web con Node.js y Express

con Express

Creación deun blog básico

Page 43: Creación de aplicaciones web con Node.js y Express

Bootstrapping el proyecto

$ express misuperblog $ cd misuperblog $ npm install

Page 44: Creación de aplicaciones web con Node.js y Express

Estructura de la applicaciónmisuperblog|-- package.json /* Contiene las dependencias, autores */|-- app.js /* Archivo principal de la applicación */|-- public /* Archivos estaticos */| |-- images| |-- stylesheets| | `-- style.css| `-- javascripts|-- views /* Contiene todo los templates */| |-- index.jade| `-- layout.jade`-- routes /* Routing y codigo de cada view */ `-- index.js

Page 45: Creación de aplicaciones web con Node.js y Express

El datastore

var Post = require ('./models/post'); p = new Post();{ id: 1, title: undefined, body: undefined, createdAt: Fri, 23 Mar 2012 14:23:30 GMT } p.save(); Post.all(); Post.get();

Page 46: Creación de aplicaciones web con Node.js y Express

En conclusión !

Node.js :● V8 → Velocidad● Libuv → Asíncrono● Javascript → Languaje único Express :● Routing potente● Plantillas modulares● Middleware

Page 47: Creación de aplicaciones web con Node.js y Express

Buenas referenciashttp://nodejs.org/http://visionmedia.github.com/masteringnode/http://expressjs.com/http://nodeup.com/http://nodejs.org/

Los gurushttps://github.com/substackhttps://github.com/isaacshttps://github.com/visionmediahttps://github.com/felixge

Page 48: Creación de aplicaciones web con Node.js y Express

¿ Algunas preguntas?

Page 49: Creación de aplicaciones web con Node.js y Express

Alternativas a los Callbacks

● StreamlineJS● node-fibers● async/step

Page 50: Creación de aplicaciones web con Node.js y Express

Bonus : el mal ejemplo con Streamlineif (!require('streamline/module')(module)) return; var http = require("http") function fibonacci(n, _) { if (n <= 1) return n; var res = fibonacci(n - 1, _); process.nextTick(_); return res + fibonacci(n - 2, _);}

http.createServer(function (req, res, _) { res.writeHead(200, {'Content-Type': 'text/plain'}); if (req.url == "/fibo") res.end('Fibo: ' + fibonacci(33, _) + '\n'); else res.end('Hello World\n');}).listen(1337, '127.0.0.1');