Your SlideShare is downloading. ×
0
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Webapplikationen mit Node.js
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Webapplikationen mit Node.js

325

Published on

Wie erstelle ich Webapplikationen mit Node.js. Vorgestellt werden verschiedene Frameworks wie Express.js oder Koa. Außerdem wird auf Skalierung eingegangen.

Wie erstelle ich Webapplikationen mit Node.js. Vorgestellt werden verschiedene Frameworks wie Express.js oder Koa. Außerdem wird auf Skalierung eingegangen.

Published in: Internet
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
325
On Slideshare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. für Webapplikationen
  • 2. Alexandra H. / pixelio.de
  • 3. WER BIN ICH? • Sebastian Springer • https://github.com/sspringer82 • @basti_springer • Consultant,Trainer,Autor
  • 4. Rudolpho Duba / pixelio.de
  • 5. 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
  • 6. Wie baue ich mit Node.js eine stabile und performante Webapplikation? Für die ich mich später nicht schämen muss…
  • 7. Struktur Monika Weidenhaupt / pixelio.de
  • 8. 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
  • 9. Modulsystem Das Node.js-Modulsystem zur Aufteilung in Dateien nutzen. Einbinden von Dateien kostet nichts, Node.js verfügt über einen Modulcache.
  • 10. $ 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');} };
  • 11. Frameworks? Beat Kohler / pixelio.de
  • 12. 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.
  • 13. TemplatingModular Routing Extensible Jade Handlebars Middleware MiddlewareHTTP-Methods Sehr weit verbreitetes Web Application Framework auf Basis von Node.js-http und Connect.
  • 14. var express = require('express');! var app = express();! ! app.get('/', function(req, res){! res.send('hello world');! });! ! app.listen(3000);
  • 15. 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.
  • 16. 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);
  • 17. 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.
  • 18. 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);
  • 19. TemplatingModular Routing Extensible own engineModules OverwritesHTTP-Methods Im Vergleich zu express ein vergleichsweise kleines Framework. Umfangreiche Abdeckung der Problemstellungen.
  • 20. 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');! }
  • 21. Wir bauen eine MVC-Applikation.
  • 22. Wir bauen eine MVC- Applikation Bernd Kasper / pixelio.de
  • 23. Verzeichnisstruktur .! !"" controllers! #   $"" index.js! !"" index.js! !"" models! #   $"" user.js! !"" public! !"" router.js! $"" views! $"" login.js
  • 24. 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);
  • 25. 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);! };
  • 26. Controller Funktionen, die hinter den einzelnen Routen stehen. Erhalten das Request- und Response-Objekt.
  • 27. Models Hier liegt die eigentliche Business-Logik der Applikation. Die eingehenden Informationen werden validiert und verarbeitet und gegebenenfalls in die Datenbank gespeichert.
  • 28. Datenbanken? Tim Reckmann / pixelio.de
  • 29. Datenbanken
  • 30. 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) {! … ! });
  • 31. Promises mit Q JMG / pixelio.de Das Versprechen auf die Erfüllung einer asynchronen Funktion.
  • 32. db.query(sql, function(err, data) {! if(err) {! throw err;! } else {! console.log(data);! }! });
  • 33. var q = require(‘q’);! ! function queryWrapper(sql) {! var deferred = q.defer();! db.query(sql, function(err, data) {! if(err) {! deferred.reject(err);! } else {! deferred.resolve(data);! }! });! return deferred.promise;! }
  • 34. var sql = ‘SELECT * FROM users’;! ! var promise = queryWrapper(sql)! ! promise.then(function(data) {! // success ! …! }, function(err) {! // failure! …! });
  • 35. Warum Promises? Escape the Callback Hell! Bessere Flusssteuerung für asynchrone Calls wie z.B. Merge. Quasi synchrone Programmierung trotz Asynchronität
  • 36. Promises mit koa // curl -X GET http://localhost:8080/user/1! app.get('/user/:id', function *(next) {! var user = yield movieModel.get(this.params.id);! this.body = JSON.stringify(user);! });
  • 37. ORM ○␣ ␣
  • 38. 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
  • 39. Template Engines
  • 40. Paketverwaltung
  • 41. 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. Aktuell gibt es > 83k Pakete. Jeder kann Pakete veröffentlichen. ! Jedes Paket löst seine eigenen Abhängigkeiten auf.
  • 42. Konfigurationsdatei für ein Projekt. Wird mit npm init erstellt. Enthält viele Meta-Informationen und die Abhängigkeiten. package.json
  • 43. • 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.
  • 44. Distribution Gabi Schoenemann / pixelio.de
  • 45. • Installation über npmjs.org • Installation eines Pakets aus einem Verzeichnis • Installation eines Pakets aus einer .tgz-Datei Voraussetzung: package.json muss vorhanden sein
  • 46. Skalierung
  • 47. 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.
  • 48. Multi-Threaded lichtkunst.73 / pixelio.de
  • 49. Mit Boardmitteln child_process cluster
  • 50. child_process Manuelles Forken von Kindprozessen. Prozesse können über Nachrichten kommunizieren. ACHTUNG: Kinder kosten… Ressourcen
  • 51. 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
  • 52. cluster Skalierung für socket-basierte Module wie z.B. http. Betriebssystem übernimmt das Loadbalancing. Die Prozesse teilen sich einen Port.
  • 53. 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);! }
  • 54. In die Breite
  • 55. Loadbalancer Node Server 1 Node Server 2 Datenbank
  • 56. cloud Hasan Anac / pixelio.de
  • 57. Performance Thomas Siepmann / pixelio.de
  • 58. 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
  • 59. Qualität Karl-Heinz Laube / pixelio.de
  • 60. 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
  • 61. 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
  • 62. Plato npm install -g plato ! Visualisierung der Komplexität einer Applikation. Metriken: Maintainability, Lines of Code, Estimated Errors in Implementation, Lint Errors
  • 63. Testing assert Mocha nodeunit jasmine-node uygar sanli / pixelio.de
  • 64. Janina Briesemeister / pixelio.de
  • 65. KONTAKT Sebastian Springer sebastian.springer@mayflower.de ! Mayflower GmbH Mannhardtstr. 6 80538 München Deutschland ! @basti_springer ! https://github.com/sspringer82

×