NodeJS & ExpressDesarrollo Web 2.0 Eficaz
Betabeers Barcelona 23/03/2012
Quienes somos?
Christophe Eymardemail : [email protected]
Félix Delval twitter : @fe_lix_email : [email protected]
https://github.com/ravelsoft
NodeJS
Qué es NodeJS
● LibUV : Una biblioteca desarrollada por Joyent en C
Qué es NodeJS
● LibUV : Una biblioteca desarrollada por Joyent en C
● V8 : El motor Javascript de Google Chrome
Qué es NodeJS
● LibUV : Una biblioteca desarrollada por Joyent en C
● V8 : El motor Javascript de Google Chrome● Runtime en Javascript
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
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)
Porque NodeJS
● Un Sólo Hilo○ ¡ (casi) adios mutex y race-condition !
Porque NodeJS
● Un Sólo Hilo○ ¡ (casi) adios mutex y race-condition !
● Asíncrono (Non Blocking) : ○ Uso óptimo del CPU
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
Synchronous vs. Asynchronous
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
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
V8 en el mundo Real (más o menos)
fuente: http://shootout.alioth.debian.org
Desarrollar en NodeJS
● Programación por callbacks
Desarrollar en NodeJS
● Programación por callbacks○ Parecido a request AJAX
Desarrollar en NodeJS
● Programación por callbacks○ Parecido a request AJAX○ « Hilos cooperativos »
Desarrollar en NodeJS
● Programación por callbacks○ Parecido a request AJAX○ « Hilos cooperativos »
● El event-loop
Desarrollar en NodeJS
● Programación por callbacks○ Parecido a request AJAX○ « Hilos cooperativos »
● El event-loop○ epoll / kpoll / etc.
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
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
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
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
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');
Mal Ejemplo : Fibonacci
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');
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');
Express
Express y su comunidad
+ de 5500 watchers + de 540 forks + de 100 issues abiertas
source : github.com
¿ Que propone ?
● Router de URL Con get, post,...
¿ Que propone ?
● Router de URL Con get, post,...● Facilidades para motores de plantillas:
Jade, EJS, JinJS, ...
¿ 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
¿ 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
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
Plantillas con Jade
!!! 5html head title Blog link(rel='stylesheet', href='/stylesheets/style.css') body #container block content
Instalación
# npm install -g express
Hello, World!
var app = express.createServer(); app.get('/', function(req, res){ res.send('Hello World');}); app.listen(3000);
Hello, World!
var express = require('express');var app = express.createServer(); app.get('/', function(req, res){ res.send('Hello World');}); app.listen(3000);
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
con Express
Creación deun blog básico
Bootstrapping el proyecto
$ express misuperblog $ cd misuperblog $ npm install
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
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();
En conclusión !
Node.js :● V8 → Velocidad● Libuv → Asíncrono● Javascript → Languaje único Express :● Routing potente● Plantillas modulares● Middleware
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
¿ Algunas preguntas?
Alternativas a los Callbacks
● StreamlineJS● node-fibers● async/step
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');
Top Related