Node.js
für Webapplikationen
WER BIN ICH?
• Sebastian Springer	

• https://github.com/sspringer82	

• @basti_springer	

• Consultant,Trainer,Autor
var http = require(‘http');!
!
http.createServer(function (req, res) {!
res.writeHead(200, !
{'Content-Type': 'text/plain'...
Wie baue ich mit Node.js eine stabile und performante
Webapplikation?
Für die ich mich später nicht schämen muss…
Struktur
Struktur bedeutet Organisation des Quellcodes in
Komponenten, Dateien und Verzeichnisse.
Ziel ist eine Verbesserung der
Wa...
Node.js-Modulsystem zur Aufteilung in Dateien
Einbinden von Dateien kostet nichts, Node.js verfügt über
einen Modulcache.
$ node cache2.js
In Module
Module function
Module function
var foo = require('./myFile');
var bar = require('./myFile');
!...
Frameworks
Frameworks liefern Strukturkomponenten, Hilfsfunktionen
und eine Reihe von Best Practices.
!
Frameworks lösen Probleme, vo...
TemplatingModular Routing Extensible
Jade
Handlebars
Middleware MiddlewareHTTP-Methods
Sehr weit verbreitetes Web Applicat...
var express = require('express');!
var app = express();!
!
app.get('/', function(req, res){!
res.send('hello world');!
});...
TemplatingModular Routing Extensible
Jade
Handlebars
Middleware MiddlewareHTTP-Methods
Neues, noch experimentelles Framewo...
var koa = require('koa');!
var app = koa();!
!
// logger!
app.use(function *(next){!
var start = new Date;!
yield next;!
v...
TemplatingModular Routing Extensible
PlatesMiddleware
Middleware
Plugins
Director
Ein wesentlich kleineres Framework als e...
var flatiron = require('flatiron'),!
app = flatiron.app;!
!
app.use(flatiron.plugins.http);!
!
app.router.get('/', functio...
TemplatingModular Routing Extensible
own engineModules OverwritesHTTP-Methods
Im Vergleich zu express ein vergleichsweise ...
var framework = require('total.js');!
var http = require('http');!
!
var debug = true;!
!
framework.run(http, debug, 8005)...
express.js
Verzeichnisstruktur
.!
!"" controllers!
#   $"" index.js!
!"" index.js!
!"" models!
#   $"" user.js!
!"" public!
!"" route...
index.js
var express = require('express');!
var bodyParser = require('body-parser');!
var routes = require('./router');!
!...
router.js
var express = require('express');!
!
var todoController = require('./controllers/todo');!
!
module.exports = fun...
Datenbanken
1. Treiber installieren
!
npm install sqlite3
2. Verbindung aufbauen
!
var db = new sqlite3.Database(‘./db/myDb.db');
3. A...
ORM
○␣
␣
var express = require('express');!
var orm = require('orm');!
var app = express();!
!
app.use(orm.express("mysql://usernam...
Paketverwaltung
Der Node Package Manager ist seit der Version 0.6.3 Teil von
Node.js.
Installation, Update und Removal von Paketen.
Das ze...
Konfigurationsdatei für ein Projekt.
Wird mit npm init erstellt.
Enthält viele Meta-Informationen und die Abhängigkeiten.
p...
• node_modules: Verzeichnis, in das die Abhängigkeiten
installiert werden (sollte im VCS ignoriert werden).
!
• npm instal...
Distribution
• Installation über npmjs.org
• Installation eines Pakets aus einem Verzeichnis
• Installation eines Pakets aus einer .tgz...
Skalierung
Node.js ist im Kern klein und leichtgewichtig.
Node.js ist Single-Threaded.
Node.js schlägt sich als Einzelkämpfer recht g...
Multi-Threaded
Mit Boardmitteln
child_process cluster
child_process
Manuelles Forken von Kindprozessen.
Prozesse können über Nachrichten kommunizieren.
!
ACHTUNG: Kinder kosten...
var cp = require('child_process');!
!
var sub = cp.fork(__dirname + '/sub.js');!
!
sub.on('message', function(m) {!
consol...
cluster
Skalierung für socket-basierte Module wie z.B. http.
Betriebssystem übernimmt das Loadbalancing.
Die Prozesse teil...
var cluster = require('cluster');!
var http = require('http');!
var numCPUs = require('os').cpus().length;!
!
if (cluster....
In die Breite
Loadbalancer
Node Server 1 Node Server 2
Datenbank
cloud
Performance
Performance
• Kein synchroner Code
• Keine statischen Assets - z.B. Nginx einsetzen
• Den Client rendern lassen - JSON-Kom...
Qualität
jslint/jshint
npm install -g jslint
!
Werkzeuge zur statischen Codeanalyse.
Finden Syntaxfehler und Antipatterns.
$ jslint...
Copy-Paste-Detection
npm install -g jscpd
!
Findet duplizierten Quellcode im Projekt.
$ jscpd -f app.js
!
info: Found 7 ex...
Plato
npm install -g plato
!
Visualisierung der Komplexität einer Applikation.
Metriken: Maintainability, Lines of Code, E...
Testing
assert
Mocha
nodeunit
jasmine-node
KONTAKT
Sebastian Springer
sebastian.springer@mayflower.de
!
Mayflower GmbH
Mannhardtstr. 6
80538 München
Deutschland
!
@b...
Node.js für Webapplikationen
Upcoming SlideShare
Loading in …5
×

Node.js für Webapplikationen

1,841 views
1,720 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,841
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Node.js für Webapplikationen

  1. 1. Node.js für Webapplikationen
  2. 2. WER BIN ICH? • Sebastian Springer • https://github.com/sspringer82 • @basti_springer • Consultant,Trainer,Autor
  3. 3. var http = require(‘http');! ! http.createServer(function (req, res) {! res.writeHead(200, ! {'Content-Type': 'text/plain'});! res.end('Hello Worldn');! }).listen(1337, ‘127.0.0.1');! ! console.log('Server running at localhost'); Heute machen wir kein plain Node.js
  4. 4. Wie baue ich mit Node.js eine stabile und performante Webapplikation? Für die ich mich später nicht schämen muss…
  5. 5. Struktur
  6. 6. Struktur bedeutet Organisation des Quellcodes in Komponenten, Dateien und Verzeichnisse. Ziel ist eine Verbesserung der Wartbarkeit und Erweiterbarkeit. …und ja, das geht mit Node.js
  7. 7. Node.js-Modulsystem zur Aufteilung in Dateien Einbinden von Dateien kostet nichts, Node.js verfügt über einen Modulcache.
  8. 8. $ node cache2.js In Module Module function Module function var foo = require('./myFile'); var bar = require('./myFile'); ! foo.myFunc(); bar.myFunc(); console.log('In Module'); ! module.exports = { myFunc: function() {console.log('Module function');} };
  9. 9. Frameworks
  10. 10. Frameworks liefern Strukturkomponenten, Hilfsfunktionen und eine Reihe von Best Practices. ! Frameworks lösen Probleme, von denen du noch nicht einmal wusstest, dass du sie haben wirst.
  11. 11. TemplatingModular Routing Extensible Jade Handlebars Middleware MiddlewareHTTP-Methods Sehr weit verbreitetes Web Application Framework auf Basis von Node.js-http und Connect.
  12. 12. var express = require('express');! var app = express();! ! app.get('/', function(req, res){! res.send('hello world');! });! ! app.listen(3000);
  13. 13. TemplatingModular Routing Extensible Jade Handlebars Middleware MiddlewareHTTP-Methods Neues, noch experimentelles Framework, das auf ECMAScript 6-Features setzt (min. node-v0.11). Bessere Unterstützung von Promises und potenzieller Nachfolger von express.
  14. 14. var koa = require('koa');! var app = koa();! ! // logger! app.use(function *(next){! var start = new Date;! yield next;! var ms = new Date - start;! console.log('%s %s - %s', this.method, this.url, ms);! });! ! // response! app.use(function *(){! this.body = 'Hello World';! });! ! app.listen(3000);
  15. 15. TemplatingModular Routing Extensible PlatesMiddleware Middleware Plugins Director Ein wesentlich kleineres Framework als express. Unterstützt die wichtigsten Funktionen, die für den Aufbau einer Web Applikation benötigt werden.
  16. 16. var flatiron = require('flatiron'),! app = flatiron.app;! ! app.use(flatiron.plugins.http);! ! app.router.get('/', function () {! this.res.writeHead(200, { 'Content-Type': 'text/plain' });! this.res.end('Hello world!n');! });! ! app.start(8080);
  17. 17. TemplatingModular Routing Extensible own engineModules OverwritesHTTP-Methods Im Vergleich zu express ein vergleichsweise kleines Framework. Umfangreiche Abdeckung der Problemstellungen.
  18. 18. var framework = require('total.js');! var http = require('http');! ! var debug = true;! ! framework.run(http, debug, 8005); exports.install = function(framework) {! framework.route('/', view_homepage);! framework.route('/{link}/', view_detail);! };! ! function view_homepage() {! var self = this;! self.view('homepage');! }
  19. 19. express.js
  20. 20. Verzeichnisstruktur .! !"" controllers! #   $"" index.js! !"" index.js! !"" models! #   $"" user.js! !"" public! !"" router.js! $"" views! $"" login.js
  21. 21. index.js var express = require('express');! var bodyParser = require('body-parser');! var routes = require('./router');! ! var app = express();! ! app.use(bodyParser.json());! ! app.use('/', express.static(__dirname + '/public'));! ! routes(app);! ! app.listen(8080);
  22. 22. router.js var express = require('express');! ! var todoController = require('./controllers/todo');! ! module.exports = function(app) {! var todoRouter = express.Router();! ! todoRouter.get('/', todoController.getAllAction);! todoRouter.get('/:id', todoController.getOneAction);! todoRouter.post('/', todoController.createAction);! todoRouter.put('/:id', todoController.updateAction);! todoRouter.delete('/:id', todoController.deleteAction);! ! app.use('/todo', todoRouter);! };
  23. 23. Datenbanken
  24. 24. 1. Treiber installieren ! npm install sqlite3 2. Verbindung aufbauen ! var db = new sqlite3.Database(‘./db/myDb.db'); 3. Abfragen ! db.get(sql, id, function(err, row) {! … ! });
  25. 25. ORM ○␣ ␣
  26. 26. var express = require('express');! var orm = require('orm');! var app = express();! ! app.use(orm.express("mysql://username:password@host/ database", {! define: function (db, models, next) {! models.person = db.define("person", { ... });! next();! }! }));! app.listen(80);! ! app.get("/", function (req, res) {! req.models.person.find(...);! }); npm install orm
  27. 27. Paketverwaltung
  28. 28. Der Node Package Manager ist seit der Version 0.6.3 Teil von Node.js. Installation, Update und Removal von Paketen. Das zentrale Repo liegt unter npmjs.org. Jeder kann Pakete veröffentlichen. ! Jedes Paket löst seine eigenen Abhängigkeiten auf.
  29. 29. Konfigurationsdatei für ein Projekt. Wird mit npm init erstellt. Enthält viele Meta-Informationen und die Abhängigkeiten. package.json
  30. 30. • node_modules: Verzeichnis, in das die Abhängigkeiten installiert werden (sollte im VCS ignoriert werden). ! • npm install: Installiert sämtliche Abhängigkeiten aus der package.json automatisch. ! • npm install --save: Trägt die Abhängigkeiten in die package.json ein.
  31. 31. Distribution
  32. 32. • Installation über npmjs.org • Installation eines Pakets aus einem Verzeichnis • Installation eines Pakets aus einer .tgz-Datei Voraussetzung: package.json muss vorhanden sein
  33. 33. Skalierung
  34. 34. Node.js ist im Kern klein und leichtgewichtig. Node.js ist Single-Threaded. Node.js schlägt sich als Einzelkämpfer recht gut. ABER: das alles hat auch seine Grenzen.
  35. 35. Multi-Threaded
  36. 36. Mit Boardmitteln child_process cluster
  37. 37. child_process Manuelles Forken von Kindprozessen. Prozesse können über Nachrichten kommunizieren. ! ACHTUNG: Kinder kosten… Ressourcen.
  38. 38. var cp = require('child_process');! ! var sub = cp.fork(__dirname + '/sub.js');! ! sub.on('message', function(m) {! console.log('PARENT got message:', m);! });! ! sub.send({ hello: 'world' }); process.on('message', function(m) {! console.log('CHILD got message:', m);! });! ! process.send({ foo: 'bar' }); Parent Child
  39. 39. cluster Skalierung für socket-basierte Module wie z.B. http. Betriebssystem übernimmt das Loadbalancing. Die Prozesse teilen sich einen Port.
  40. 40. var cluster = require('cluster');! var http = require('http');! var numCPUs = require('os').cpus().length;! ! if (cluster.isMaster) {! for (var i = 0; i < numCPUs; i++) {! cluster.fork();! }! ! cluster.on('exit', function(worker, code, signal) {! console.log('worker ' + worker.process.pid + ' died');! });! } else {! http.createServer(function(req, res) {! res.writeHead(200);! res.end("hello worldn");! }).listen(8000);! }
  41. 41. In die Breite
  42. 42. Loadbalancer Node Server 1 Node Server 2 Datenbank
  43. 43. cloud
  44. 44. Performance
  45. 45. Performance • Kein synchroner Code • Keine statischen Assets - z.B. Nginx einsetzen • Den Client rendern lassen - JSON-Kommunikation • gzip nutzen • Binärmodule sind schneller - z.B. mySQL
  46. 46. Qualität
  47. 47. jslint/jshint npm install -g jslint ! Werkzeuge zur statischen Codeanalyse. Finden Syntaxfehler und Antipatterns. $ jslint index.js ! index.js #1 Unexpected dangling '_' in '__dirname'. app.use('/', express.static(__dirname + '/public')); // Line 9, Pos 29
  48. 48. Copy-Paste-Detection npm install -g jscpd ! Findet duplizierten Quellcode im Projekt. $ jscpd -f app.js ! info: Found 7 exact clones with 70 duplicated lines in 1 files - app.js:6626 -6635 app.js:6646 -6655
  49. 49. Plato npm install -g plato ! Visualisierung der Komplexität einer Applikation. Metriken: Maintainability, Lines of Code, Estimated Errors in Implementation, Lint Errors
  50. 50. Testing assert Mocha nodeunit jasmine-node
  51. 51. KONTAKT Sebastian Springer sebastian.springer@mayflower.de ! Mayflower GmbH Mannhardtstr. 6 80538 München Deutschland ! @basti_springer ! https://github.com/sspringer82

×