Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

Betabeers
March 27, 2012

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

ponente Félix Delval y Christophe Eymard de RavelSoft

Betabeers

March 27, 2012
Tweet

More Decks by Betabeers

Other Decks in Education

Transcript

  1. Qué es NodeJS • LibUV : Una biblioteca desarrollada por

    Joyent en C • V8 : El motor Javascript de Google Chrome
  2. Qué es NodeJS • LibUV : Una biblioteca desarrollada por

    Joyent en C • V8 : El motor Javascript de Google Chrome • Runtime en Javascript
  3. 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
  4. 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)
  5. Porque NodeJS • Un Sólo Hilo ◦ ¡ (casi) adios

    mutex y race-condition ! • Asíncrono (Non Blocking) : ◦ Uso óptimo del CPU
  6. 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
  7. 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
  8. 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
  9. Desarrollar en NodeJS • Programación por callbacks ◦ Parecido a

    request AJAX ◦ « Hilos cooperativos » • El event-loop
  10. Desarrollar en NodeJS • Programación por callbacks ◦ Parecido a

    request AJAX ◦ « Hilos cooperativos » • El event-loop ◦ epoll / kpoll / etc.
  11. 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
  12. 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
  13. 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
  14. 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
  15. 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');
  16. 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');
  17. 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');
  18. Express y su comunidad + de 5500 watchers + de

    540 forks + de 100 issues abiertas source : github.com
  19. ¿ Que propone ? • Router de URL Con get,

    post,... • Facilidades para motores de plantillas: Jade, EJS, JinJS, ...
  20. ¿ 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
  21. ¿ 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
  22. 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
  23. Plantillas con Jade !!! 5 html head title Blog link(rel='stylesheet',

    href='/stylesheets/style.css') body #container block content
  24. Hello, World! var express = require('express'); var app = express.createServer();

    app.get('/', function(req, res){ res.send('Hello World'); }); app.listen(3000);
  25. El test más inútil del mundo $ ab -n 10000

    -c 1000 http://localhost:3000 Concurrency Level: 1000 Time taken for tests: 19.458 seconds Complete requests: 100000 Requests 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
  26. Estructura de la applicación misuperblog |-- 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
  27. 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();
  28. En conclusión ! Node.js : • V8 → Velocidad •

    Libuv → Asíncrono • Javascript → Languaje único Express : • Routing potente • Plantillas modulares • Middleware
  29. Bonus : el mal ejemplo con Streamline if (!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');