node.js für webapplikationen

52
Node.js für Webapplikationen

Upload: sebastian-springer

Post on 27-May-2015

1.475 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Node.js für Webapplikationen

Node.jsfür Webapplikationen

Page 2: Node.js für Webapplikationen

WER BIN ICH?

• Sebastian Springer

• https://github.com/sspringer82

• @basti_springer

• Consultant, Trainer, Autor

Page 3: Node.js für Webapplikationen

var http = require(‘http');!!http.createServer(function (req, res) {! res.writeHead(200, ! {'Content-Type': 'text/plain'});! res.end('Hello World\n');!}).listen(1337, ‘127.0.0.1');!!console.log('Server running at localhost');

Heute machen wir kein plain Node.js

Page 4: Node.js für Webapplikationen

Wie baue ich mit Node.js eine stabile und performante Webapplikation?

Für die ich mich später nicht schämen muss…

Page 5: Node.js für Webapplikationen

Struktur

Page 6: Node.js für Webapplikationen

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

Page 7: Node.js für Webapplikationen

Node.js-Modulsystem zur Aufteilung in Dateien

Einbinden von Dateien kostet nichts, Node.js verfügt über einen Modulcache.

Page 8: Node.js für Webapplikationen

$ 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');} };

Page 9: Node.js für Webapplikationen

Frameworks

Page 10: Node.js für Webapplikationen

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.

Page 11: Node.js für Webapplikationen

! Templating" Modular # Routing $ Extensible

Jade HandlebarsMiddleware MiddlewareHTTP-Methods

Sehr weit verbreitetes Web Application Framework auf Basis von Node.js-http und Connect.

Page 12: Node.js für Webapplikationen

var express = require('express');!var app = express();!!app.get('/', function(req, res){! res.send('hello world');!});!!app.listen(3000);

Page 13: Node.js für Webapplikationen

! Templating" Modular # Routing $ Extensible

Jade HandlebarsMiddleware 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.

Page 14: Node.js für Webapplikationen

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);

Page 15: Node.js für Webapplikationen

! Templating" Modular # Routing $ Extensible

PlatesMiddleware Middleware PluginsDirector

Ein wesentlich kleineres Framework als express. Unterstützt die wichtigsten Funktionen, die für den Aufbau einer Web

Applikation benötigt werden.

Page 16: Node.js für Webapplikationen

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);

Page 17: Node.js für Webapplikationen

! Templating" Modular # Routing $ Extensible

own engineModules OverwritesHTTP-Methods

Im Vergleich zu express ein vergleichsweise kleines Framework. Umfangreiche Abdeckung der Problemstellungen.

Page 18: Node.js für Webapplikationen

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');!}

Page 19: Node.js für Webapplikationen

express.js

Page 20: Node.js für Webapplikationen

Verzeichnisstruktur.!!"" controllers!#   $"" index.js!!"" index.js!!"" models!#   $"" user.js!!"" public!!"" router.js!$"" views! $"" login.js

Page 21: Node.js für Webapplikationen

index.jsvar 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);

Page 22: Node.js für Webapplikationen

router.jsvar 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);!};

Page 23: Node.js für Webapplikationen

Datenbanken

Page 24: Node.js für Webapplikationen

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) {! … !});

Page 25: Node.js für Webapplikationen

ORM

&○␣␣

Page 26: Node.js für Webapplikationen

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

Page 27: Node.js für Webapplikationen

Paketverwaltung

Page 28: Node.js für Webapplikationen

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.

Page 29: Node.js für Webapplikationen

Konfigurationsdatei für ein Projekt. Wird mit npm init erstellt.

Enthält viele Meta-Informationen und die Abhängigkeiten.

package.json

Page 30: Node.js für Webapplikationen

• 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.

Page 31: Node.js für Webapplikationen

Distribution

Page 32: Node.js für Webapplikationen

• Installation über npmjs.org

• Installation eines Pakets aus einem Verzeichnis

• Installation eines Pakets aus einer .tgz-Datei

Voraussetzung: package.json muss vorhanden sein

Page 33: Node.js für Webapplikationen

Skalierung

Page 34: Node.js für Webapplikationen

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.

Page 35: Node.js für Webapplikationen

Multi-Threaded

Page 36: Node.js für Webapplikationen

Mit Boardmitteln

)child_process cluster

Page 37: Node.js für Webapplikationen

child_process

Manuelles Forken von Kindprozessen. Prozesse können über Nachrichten kommunizieren.

!ACHTUNG: Kinder kosten… Ressourcen.

Page 38: Node.js für Webapplikationen

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

Page 39: Node.js für Webapplikationen

cluster

Skalierung für socket-basierte Module wie z.B. http. Betriebssystem übernimmt das Loadbalancing.

Die Prozesse teilen sich einen Port.

Page 40: Node.js für Webapplikationen

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 world\n");! }).listen(8000);!}

Page 41: Node.js für Webapplikationen

In die Breite

Page 42: Node.js für Webapplikationen

Loadbalancer

Node Server 1 Node Server 2

Datenbank

Page 43: Node.js für Webapplikationen

*cloud

Page 44: Node.js für Webapplikationen

Performance

Page 45: Node.js für Webapplikationen

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

Page 46: Node.js für Webapplikationen

Qualität

Page 47: Node.js für Webapplikationen

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

Page 48: Node.js für Webapplikationen

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

Page 49: Node.js für Webapplikationen

Plato

npm install -g plato !

Visualisierung der Komplexität einer Applikation. Metriken: Maintainability, Lines of Code, Estimated Errors in

Implementation, Lint Errors

Page 50: Node.js für Webapplikationen
Page 51: Node.js für Webapplikationen

Testing

assert

Mocha

nodeunit

jasmine-node

Page 52: Node.js für Webapplikationen

KONTAKT

Sebastian Springer [email protected] !Mayflower GmbH Mannhardtstr. 6 80538 München Deutschland !@basti_springer !https://github.com/sspringer82