Node.js for Pros

1 Introduction

▪ Robert Prediger

▪ 27 years experience in PROGRESS ▪ 20 years experience in web development ▪ 10 years experience in Node.js

[email protected]

Node.js for Pros 2 Node.js

▪ Javascript is everywhere: – Browsers – Webservers – Databases – Mobile Devices

▪ Adobe, Google, Apple and Microsoft are spending a huge amount of money!

▪ JavaScript seems to be the worlds most used programming language.

Node.js for Pros 3 Typescript (http://www.typescriptlang.org/)

interface Person { firstname: string; lastname: string; }

class Student { fullname : string; constructor( person : Person ) { this.fullname = person.firstname + " " + person.lastname; } }

var user = new Student( { firstname: "Jane", lastname: "User" } );

Node.js for Pros 4 Node.js

▪ What is Node.js – Server side Javascript – Built on Chrome V8 Engine – Event-driven, non blocking I/O model ▪ What is it for? – Easily building fast, scalable network applications – Perfect for data-intensive real-time application that run across distributed devices

Node.js for Pros 5 Node.js

One World One WAIT-FOR

Node.js for Pros 6 Node.js

▪ Request (other languages):

Finished request

Start 2nd Green is executing thread request

Red is waiting on I/O

Node.js for Pros 7 Node.js

▪ Banana slug ▪ F-18 Hornet – Max speed of – Max speed of 0.007 mph 1,190 mph ▪ Hard disk ▪ RAM

Quelle: http://blog.scoutapp.com/articles/2011/02/10/understanding-disk-i-o-when-should-you-be-worried Node.js for Pros 8 Node.js

Node.js for Pros 9 Node.js

Q: How is it possible to handle parallel I/O with one thread of execution?

A: There is (usually) no such thing as parallel I/O

Node.js for Pros 10 Node.js

▪ Parallel I/O: how we see it

Node.js for Pros 11 Node.js

▪ Parallel I/O: what actually happen at low level

Node.js for Pros 12 Node.js

Node.js for Pros 13 Node.js

▪ Request with Node:

Event Loop Request Request

Green is executing thread Red is waiting on I/O

Node.js for Pros 14 Nginx

Quelle: http://www.theorganicagency.com/apache-vs-nginx-performance-comparison/

Node.js for Pros 15 Nginx

Quelle: http://blog.webfaction.com/2008/12/a-little-holiday-present-10000-reqssec-with-nginx-2/ Node.js for Pros 16 Node.js

Node.js for Pros 17 Node.js

Can handle thousands of concurrent connections with minimal overhead (CPU/Memory) on a single Process!

Node.js for Pros 18 Modules

▪ Number of modules exceeded 1.000.000! ▪ Modules for nearly every problem: – pm2 – koa – socket.io – – debug – moment – async – pdfmake

Node.js for Pros 19 pm2 PM2 is a production process manager for Node.js applications with a built-in load balancer.

It allows you to keep applications alive forever, to reload them without downtime and to facilitate common system admin tasks.

http://pm2.keymetrics.io/

Node.js for Pros 20 koa

▪ https://koajs.com/

const Koa = require('koa'), app = new Koa(), server = require('http').createServer( app.callback() ), koaBody = require('koa-body'), { userAgent } = require('koa-useragent');

app.use( koaBody() ); app.use( userAgent );

app.post( '/login', (ctx, next) => { ctx.body = 'Hello World'; });

app.listen( 8081 );

Node.js for Pros 21 koa-useragent

Node.js for Pros 22 socket.io

Protocol for having a bidirectional communication with client.

Node.js for Pros 23 socket.io

▪ http://socket.io/

let io = require('socket.io').listen( 80 );

io.sockets.on('connection', function (socket) { socket.emit( 'message', { text: 'Hello World' });

// broadcast message to all subscribed sockets socket.broadcast.emit("chat", { name: socket.nickname, msg: msg }); });

Node.js for Pros 24 socket.io

chat.node4biz.com

Node.js for Pros 25 lodash

▪ https://lodash.com

_.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x'); // => [{ 'x': 1 }, { 'x': 2 }]

let array = [ { 'dir': 'left', 'code': 97 }, { 'dir': 'right', 'code': 100 } ];

_.keyBy(array, 'dir'); // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }

Node.js for Pros 26 debug

▪ https://github.com/visionmedia/debug

let debug = require("debug"), log = debug("demo:socket");

function login ( name ) { log( "login", name ); client.nickname = name; }

Node.js for Pros 27 moment

▪ https://momentjs.com/

moment("20111031", "YYYYMMDD").fromNow(); // 8 years ago moment().startOf('day').fromNow(); // 11 hours ago moment().endOf('day').fromNow(); // in 13 hours

moment().subtract(10, 'days').calendar(); // 10/21/2019

moment('2010-10-20').isBefore('2010-12-31', 'year'); // false

moment().add(7, 'days').subtract(1, 'months').year(2009).hours(0).minutes(0).seconds(0);

moment('2016-03-12 13:00:00').add(1, 'day').format('LLL') // "March 13, 2016 1:00 PM" moment('2016-03-12 13:00:00').add(24, 'hours').format('LLL') // "March 13, 2016 2:00 PM"

moment('2016-01-01').add(1, 'year').format('LL') // "January 1, 2017" moment('2016-01-01').add(365, 'day').format('LL') // "December 31, 2016"

Node.js for Pros 28 async

▪ http://caolan.github.io/async/v3/

// limits the number of concurrent requests async.eachLimit( customers, 10, (callback) => { ... callback( null ); }, function( err ) { // ends when all entries are done });

Node.js for Pros 29 pdfmake

▪ http://pdfmake.org

Node.js for Pros 30 Questions

Questions?

Node.js for Pros 31