May 4, 2016
#PTW16 Intro to Node.JS
Ross Kukulinski
© 2016 Ross Kukulinski2
@RossKukulinski
Product Manager — NodeSource
Node Foundation Evangelist
Container Advocate & Consultant
Introduction to CoreOS - O’Reilly Media
© 2016 Ross Kukulinski
Overview
3
phillydev.org
#ptw-nodejs-workshop
© 2016 Ross Kukulinski
Overview
4
Why are you here?
© 2016 Ross Kukulinski
Overview
5
Workshop Goals
• Learn what Node.JS is and is not
• Understand non-blocking I/O and event-driven programming
• Hands on with Node.JS!
• Prepare you for future Node.JS learning
© 2016 Ross Kukulinski
Overview
6
Schedule
• 9:00 - 9:05 — Intro & Overview
• 9:05 - 9:45 — What is Node.JS
• 9:45 - 10:00 — Hands-on with NodeJS
• 10:00 - 10:30 — NodeSchool Pair-Programming
• 10:30 - 10:45 — Coffee Refill
• 10:45 - 11:00 — Questions / Review
• 11:00 - 11:45 — Continued Pair-Programming
• 11:45 - 12:00 — Wrap up & Summary
© 2016 Ross Kukulinski
What is Node.JS
7
© 2016 Ross Kukulinski8
© 2016 Ross Kukulinski
What is Node.JS
9
Node.JS is a JavaScript runtime
built on Chrome’s JavaScript
engine* for building fast, scalable
network applications.
© 2016 Ross Kukulinski
Node.JS is NOT
10
… a language
… a web framework
© 2016 Ross Kukulinski
What is Node.JS
11
Node by the Numbers
• Node.JS is the fastest growing development platform
• 3.5 million users and annual growth rate of 100%
• npm is the largest ecosystem of open source libraries in the world
https://nodejs.org/static/documents/2016-survey-report.pdf
© 2016 Ross Kukulinski
What is Node.JS
12
Enterprises have
already adopted
Node.js
© 2016 Ross Kukulinski
Why does Node.JS exist?
13
© 2016 Ross Kukulinski
Why does Node.JS Exist?
14
Latency: Memory vs I/O
L1 cache 0.5ns
L2 cache 7ns
Main memory 100ns
Send 1K bytes over 1 Gbps network 10,000ns
Round trip within same datacenter 500,000ns
Disk seek 10,000,000ns
Packet CA->Netherlands->CA 150,000,000ns
https://gist.github.com/jhclark/2845836
© 2016 Ross Kukulinski15
I/O is Expensive
Why does Node.JS Exist?
© 2016 Ross Kukulinski16
console.log('Fetching article...');
var result = query("SELECT * FROM articles WHERE id = 1");
console.log('Here is the result:', result);
Blocking I/O
Blocking vs Non-Blocking
© 2016 Ross Kukulinski17
1 // Java: Spot the I/O
2
3 System.out.println("Reading file...");
4 BufferedReader br = new BufferedReader(new
5 FileReader("in.txt"));
6
7 try {
8 StringBuilder sb = new StringBuilder();
9 String line;
10
11 while ((line = br.readLine()) != null)
12 sb.append(line + "n");
13 System.out.print(sb.toString());
14 } finally {
15 br.close();
16 }
17
18 System.out.println("Finished reading file!");
© 2016 Ross Kukulinski18
Some solutions
• One process per connection (Apache Web Server 1)
• One thread per connection (Apache Web Server 2)
• Event-Driven (nginx, node.js)
Blocking vs Non-Blocking
© 2016 Ross Kukulinski
Event-Driven, Non-Blocking Programming
19
function handleResult(result) {
console.log('Here is the result:', result);
}
select('SELECT * FROM articles WHERE id = 1', handleResult);
console.log('Fetching article...');
© 2016 Ross Kukulinski
Why JavaScript?
20
JavaScript well-suited to event-driven model
© 2016 Ross Kukulinski
Functions are First-Class Objects
21
Treat functions like any other object
• Pass them as arguments
• Return them from functions
• Store them as variables for later use
© 2016 Ross Kukulinski
Functions are Closures
22
function calculateSum (list) {
var sum = 0;
function addItem(item) {
sum += item;
}
list.forEach(addItem);
console.log('sum: ' + sum);
}
calculateSum([ 2, 5, 10, 42, 67, 78, 89, 120 ]);
© 2016 Ross Kukulinski
Functions are Closures
23
function calculateSum (list) {
var sum = 0;
function addItem(item) {
sum += item;
}
list.forEach(addItem);
return function() { // return a function that can print the result
console.log('sum: ' + sum);
}
}
var printSum = calculateSum([ 2, 5, 10, 42, 67, 78, 89, 120 ]);
// printSum is a function returned by calculateSum but it still
// has access to the scope within its parent function
printSum();
© 2016 Ross Kukulinski
Node.JS Non-Blocking I/O
24
• Kernel-level non-blocking socket I/O using epoll() or select()
system calls (depending on the operating system)
• File system I/O delegated to worker threads
• Glued together with an “event loop”
© 2016 Ross Kukulinski
Node.JS Event Loop
25
• Perform work triggered by JavaScript code
• Perform work triggered by external events
• Pass events & data to JavaScript via callback
functions
• Exit when no more pending work or events
© 2016 Ross Kukulinski
Node.JS Event Loop
26
When does it stop?
// 1.
fs.readFile('bigdata.txt', 'utf8', function (err, data) {
console.log(data.split('n').length, 'lines of data');
});
© 2016 Ross Kukulinski
Node.JS Event Loop
27
When does it stop?
// 2.
setTimeout(function () {
console.log('Waited 10s');
}, 10000);
© 2016 Ross Kukulinski
Node.JS Event Loop
28
When does it stop?
// 3.
var i = 0;
var timer = setInterval(function () {
console.log('tick', i);
if (++i === 60)
clearInterval(timer);
}, 1000);
© 2016 Ross Kukulinski
Blocking the event loop
29
// some Monte Carlo madness
// estimating π by plotting *many* random points on a plane
var points = 100000000;
var inside = 0;
for (var i = 0; i < points; i++) {
if (Math.pow(Math.random(), 2) + Math.pow(Math.random(), 2) <= 1)
inside++;
}
// the event loop is blocked until the calculations are done
console.log(‘π ≈ ’, (inside / points) * 4);
© 2016 Ross Kukulinski
Sync vs Async
30
var bigdata = fs.readFileSync('bigdata', 'utf8');
fs.readFile('bigdata', 'utf8', function (err, bigdata) {
// ...
});
Synchronous
Asynchronous
© 2016 Ross Kukulinski
Node.JS Summary
31
Rules of Thumb
• Choose asynchronous I/O over synchronous I/O
• Opt for parallel I/O wherever possible
• Don’t hog the JavaScript thread with long-running
calculations or iterations
© 2016 Ross Kukulinski
Node.JS Summary
32
Node.JS is Minimal
• Complexity is in user-land
• Instead of a big framework, Node.JS provides minimal
viable library for doing I/O
• All the rest is built on top in user-land
• Pick and choose from HUGE library of third-party modules
© 2016 Ross Kukulinski
npm - Node Package Manger
33
https://www.npmjs.com/
250,000+ packages of reusable code
© 2016 Ross Kukulinski
Node.JS Strengths
34
Node is great for:
• REST APIs
• Mobile Backend
• Real-time applications
• Streaming services
• Prototyping
• Front-end development
© 2016 Ross Kukulinski
Node.JS Weaknesses
35
Node is NOT good for:
• CPU-bound workloads
• Serving static content
© 2016 Ross Kukulinski
Hands-on with Node.JS
36
© 2016 Ross Kukulinski
Installing Node.JS
37
https://nodejs.org/en/download/
https://github.com/creationix/nvm
OSX/Linux
Windows
© 2016 Ross Kukulinski38
What do you get?
• node — The Node.JS runtime binary
• npm — CLI tool allows you to use the extensive module ecosystem
Installing Node.JS
© 2016 Ross Kukulinski
Example Code
39
github.com/rosskukulinski/ptw16_node
© 2016 Ross Kukulinski
Hands-on with NodeJS
40
Live demo time!
© 2016 Ross Kukulinski
NodeSchool Pair-Programming
41
© 2016 Ross Kukulinski
NodeSchool.io
42
Workshoppers
Open source lesson modules to teach
JavaScript, Node.JS, npm, and many more
topics. All lessons are self-guided and most
work offline.
© 2016 Ross Kukulinski43
Find a Partner!
NodeSchool.io
© 2016 Ross Kukulinski
learnyounode
44
Getting started
1. npm install -g learnyounode
2. Make a folder to store your code
3. learnyounode
© 2016 Ross Kukulinski
learnyounode
45
Let’s work through the
first exercise together
© 2016 Ross Kukulinski
Break time! Back at 10:45
46
© 2016 Ross Kukulinski
Questions / Review
47
© 2016 Ross Kukulinski
Back to it!
48
© 2016 Ross Kukulinski
Wrap Up
49
© 2016 Ross Kukulinski
Wrap Up
50
Resources for future learning
• http://nodeschool.io
• https://nodejs.org/api/
• https://github.com/nodejs/help
• #node.js on irc.freenode.net
• http://nodeweekly.com/
• http://planetnodejs.com/
• http://nodeup.com/
• http://stackoverflow.com/questions/tagged/node.js
• http://www.meetup.com/nodejs-philly/
© 2016 Ross Kukulinski
Wrap Up
51
Package recommendations
• Logging: Bunyan, winston
• Webserver: Express, hapi, kraken
• REST APIs: restify, hapi
• Testing: mocha, tap, jasmine
• Frontend: browserify, gulp, grunt, webpack
• Real-time: socket.io, ws
Also experiment with functional programming (Node.JS Streams)
© 2016 Ross Kukulinski
Wrap Up
52
Want to get involved?
• https://nodejs.org/en/get-involved/
• Help with documentation
• Contribute to Node Core
• Contribute to npm modules
• Run your own NodeSchool
© 2016 Ross Kukulinski
NodeSource
53
The Enterprise Node Company™
https://nodesource.com
© 2016 Ross Kukulinski
NodeSource
54
N|Solid: Enterprise Grade Node
• Production Monitoring
• Performance Analysis
• Platform Security
• Free for Development
Thank you.
Ross Kukulinski
ross@nodesource.com
@RossKukulinski

Philly Tech Week Introduction to NodeJS

  • 1.
    May 4, 2016 #PTW16Intro to Node.JS Ross Kukulinski
  • 2.
    © 2016 RossKukulinski2 @RossKukulinski Product Manager — NodeSource Node Foundation Evangelist Container Advocate & Consultant Introduction to CoreOS - O’Reilly Media
  • 3.
    © 2016 RossKukulinski Overview 3 phillydev.org #ptw-nodejs-workshop
  • 4.
    © 2016 RossKukulinski Overview 4 Why are you here?
  • 5.
    © 2016 RossKukulinski Overview 5 Workshop Goals • Learn what Node.JS is and is not • Understand non-blocking I/O and event-driven programming • Hands on with Node.JS! • Prepare you for future Node.JS learning
  • 6.
    © 2016 RossKukulinski Overview 6 Schedule • 9:00 - 9:05 — Intro & Overview • 9:05 - 9:45 — What is Node.JS • 9:45 - 10:00 — Hands-on with NodeJS • 10:00 - 10:30 — NodeSchool Pair-Programming • 10:30 - 10:45 — Coffee Refill • 10:45 - 11:00 — Questions / Review • 11:00 - 11:45 — Continued Pair-Programming • 11:45 - 12:00 — Wrap up & Summary
  • 7.
    © 2016 RossKukulinski What is Node.JS 7
  • 8.
    © 2016 RossKukulinski8
  • 9.
    © 2016 RossKukulinski What is Node.JS 9 Node.JS is a JavaScript runtime built on Chrome’s JavaScript engine* for building fast, scalable network applications.
  • 10.
    © 2016 RossKukulinski Node.JS is NOT 10 … a language … a web framework
  • 11.
    © 2016 RossKukulinski What is Node.JS 11 Node by the Numbers • Node.JS is the fastest growing development platform • 3.5 million users and annual growth rate of 100% • npm is the largest ecosystem of open source libraries in the world https://nodejs.org/static/documents/2016-survey-report.pdf
  • 12.
    © 2016 RossKukulinski What is Node.JS 12 Enterprises have already adopted Node.js
  • 13.
    © 2016 RossKukulinski Why does Node.JS exist? 13
  • 14.
    © 2016 RossKukulinski Why does Node.JS Exist? 14 Latency: Memory vs I/O L1 cache 0.5ns L2 cache 7ns Main memory 100ns Send 1K bytes over 1 Gbps network 10,000ns Round trip within same datacenter 500,000ns Disk seek 10,000,000ns Packet CA->Netherlands->CA 150,000,000ns https://gist.github.com/jhclark/2845836
  • 15.
    © 2016 RossKukulinski15 I/O is Expensive Why does Node.JS Exist?
  • 16.
    © 2016 RossKukulinski16 console.log('Fetching article...'); var result = query("SELECT * FROM articles WHERE id = 1"); console.log('Here is the result:', result); Blocking I/O Blocking vs Non-Blocking
  • 17.
    © 2016 RossKukulinski17 1 // Java: Spot the I/O 2 3 System.out.println("Reading file..."); 4 BufferedReader br = new BufferedReader(new 5 FileReader("in.txt")); 6 7 try { 8 StringBuilder sb = new StringBuilder(); 9 String line; 10 11 while ((line = br.readLine()) != null) 12 sb.append(line + "n"); 13 System.out.print(sb.toString()); 14 } finally { 15 br.close(); 16 } 17 18 System.out.println("Finished reading file!");
  • 18.
    © 2016 RossKukulinski18 Some solutions • One process per connection (Apache Web Server 1) • One thread per connection (Apache Web Server 2) • Event-Driven (nginx, node.js) Blocking vs Non-Blocking
  • 19.
    © 2016 RossKukulinski Event-Driven, Non-Blocking Programming 19 function handleResult(result) { console.log('Here is the result:', result); } select('SELECT * FROM articles WHERE id = 1', handleResult); console.log('Fetching article...');
  • 20.
    © 2016 RossKukulinski Why JavaScript? 20 JavaScript well-suited to event-driven model
  • 21.
    © 2016 RossKukulinski Functions are First-Class Objects 21 Treat functions like any other object • Pass them as arguments • Return them from functions • Store them as variables for later use
  • 22.
    © 2016 RossKukulinski Functions are Closures 22 function calculateSum (list) { var sum = 0; function addItem(item) { sum += item; } list.forEach(addItem); console.log('sum: ' + sum); } calculateSum([ 2, 5, 10, 42, 67, 78, 89, 120 ]);
  • 23.
    © 2016 RossKukulinski Functions are Closures 23 function calculateSum (list) { var sum = 0; function addItem(item) { sum += item; } list.forEach(addItem); return function() { // return a function that can print the result console.log('sum: ' + sum); } } var printSum = calculateSum([ 2, 5, 10, 42, 67, 78, 89, 120 ]); // printSum is a function returned by calculateSum but it still // has access to the scope within its parent function printSum();
  • 24.
    © 2016 RossKukulinski Node.JS Non-Blocking I/O 24 • Kernel-level non-blocking socket I/O using epoll() or select() system calls (depending on the operating system) • File system I/O delegated to worker threads • Glued together with an “event loop”
  • 25.
    © 2016 RossKukulinski Node.JS Event Loop 25 • Perform work triggered by JavaScript code • Perform work triggered by external events • Pass events & data to JavaScript via callback functions • Exit when no more pending work or events
  • 26.
    © 2016 RossKukulinski Node.JS Event Loop 26 When does it stop? // 1. fs.readFile('bigdata.txt', 'utf8', function (err, data) { console.log(data.split('n').length, 'lines of data'); });
  • 27.
    © 2016 RossKukulinski Node.JS Event Loop 27 When does it stop? // 2. setTimeout(function () { console.log('Waited 10s'); }, 10000);
  • 28.
    © 2016 RossKukulinski Node.JS Event Loop 28 When does it stop? // 3. var i = 0; var timer = setInterval(function () { console.log('tick', i); if (++i === 60) clearInterval(timer); }, 1000);
  • 29.
    © 2016 RossKukulinski Blocking the event loop 29 // some Monte Carlo madness // estimating π by plotting *many* random points on a plane var points = 100000000; var inside = 0; for (var i = 0; i < points; i++) { if (Math.pow(Math.random(), 2) + Math.pow(Math.random(), 2) <= 1) inside++; } // the event loop is blocked until the calculations are done console.log(‘π ≈ ’, (inside / points) * 4);
  • 30.
    © 2016 RossKukulinski Sync vs Async 30 var bigdata = fs.readFileSync('bigdata', 'utf8'); fs.readFile('bigdata', 'utf8', function (err, bigdata) { // ... }); Synchronous Asynchronous
  • 31.
    © 2016 RossKukulinski Node.JS Summary 31 Rules of Thumb • Choose asynchronous I/O over synchronous I/O • Opt for parallel I/O wherever possible • Don’t hog the JavaScript thread with long-running calculations or iterations
  • 32.
    © 2016 RossKukulinski Node.JS Summary 32 Node.JS is Minimal • Complexity is in user-land • Instead of a big framework, Node.JS provides minimal viable library for doing I/O • All the rest is built on top in user-land • Pick and choose from HUGE library of third-party modules
  • 33.
    © 2016 RossKukulinski npm - Node Package Manger 33 https://www.npmjs.com/ 250,000+ packages of reusable code
  • 34.
    © 2016 RossKukulinski Node.JS Strengths 34 Node is great for: • REST APIs • Mobile Backend • Real-time applications • Streaming services • Prototyping • Front-end development
  • 35.
    © 2016 RossKukulinski Node.JS Weaknesses 35 Node is NOT good for: • CPU-bound workloads • Serving static content
  • 36.
    © 2016 RossKukulinski Hands-on with Node.JS 36
  • 37.
    © 2016 RossKukulinski Installing Node.JS 37 https://nodejs.org/en/download/ https://github.com/creationix/nvm OSX/Linux Windows
  • 38.
    © 2016 RossKukulinski38 What do you get? • node — The Node.JS runtime binary • npm — CLI tool allows you to use the extensive module ecosystem Installing Node.JS
  • 39.
    © 2016 RossKukulinski Example Code 39 github.com/rosskukulinski/ptw16_node
  • 40.
    © 2016 RossKukulinski Hands-on with NodeJS 40 Live demo time!
  • 41.
    © 2016 RossKukulinski NodeSchool Pair-Programming 41
  • 42.
    © 2016 RossKukulinski NodeSchool.io 42 Workshoppers Open source lesson modules to teach JavaScript, Node.JS, npm, and many more topics. All lessons are self-guided and most work offline.
  • 43.
    © 2016 RossKukulinski43 Find a Partner! NodeSchool.io
  • 44.
    © 2016 RossKukulinski learnyounode 44 Getting started 1. npm install -g learnyounode 2. Make a folder to store your code 3. learnyounode
  • 45.
    © 2016 RossKukulinski learnyounode 45 Let’s work through the first exercise together
  • 46.
    © 2016 RossKukulinski Break time! Back at 10:45 46
  • 47.
    © 2016 RossKukulinski Questions / Review 47
  • 48.
    © 2016 RossKukulinski Back to it! 48
  • 49.
    © 2016 RossKukulinski Wrap Up 49
  • 50.
    © 2016 RossKukulinski Wrap Up 50 Resources for future learning • http://nodeschool.io • https://nodejs.org/api/ • https://github.com/nodejs/help • #node.js on irc.freenode.net • http://nodeweekly.com/ • http://planetnodejs.com/ • http://nodeup.com/ • http://stackoverflow.com/questions/tagged/node.js • http://www.meetup.com/nodejs-philly/
  • 51.
    © 2016 RossKukulinski Wrap Up 51 Package recommendations • Logging: Bunyan, winston • Webserver: Express, hapi, kraken • REST APIs: restify, hapi • Testing: mocha, tap, jasmine • Frontend: browserify, gulp, grunt, webpack • Real-time: socket.io, ws Also experiment with functional programming (Node.JS Streams)
  • 52.
    © 2016 RossKukulinski Wrap Up 52 Want to get involved? • https://nodejs.org/en/get-involved/ • Help with documentation • Contribute to Node Core • Contribute to npm modules • Run your own NodeSchool
  • 53.
    © 2016 RossKukulinski NodeSource 53 The Enterprise Node Company™ https://nodesource.com
  • 54.
    © 2016 RossKukulinski NodeSource 54 N|Solid: Enterprise Grade Node • Production Monitoring • Performance Analysis • Platform Security • Free for Development
  • 55.