SlideShare une entreprise Scribd logo
1  sur  37
Télécharger pour lire hors ligne
Node.js
Building Fast, Modern Web 2.0 Applications
Joe Einertson
University of Minnesota, Morris

October 30, 2013
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Table of Contents

1

What is Node?

2

CoffeeScript

3

Node Basics

4

Node in Practice

5

Conclusion

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Background
The Old Way
The New Way

What is Node?

1

What is Node?
Background
The Old Way
The New Way

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Background
The Old Way
The New Way

What is Node.js?

Network application framework built on Google’s V8
JavaScript engine
Released in 2009, now widely used (Yahoo, Microsoft, eBay,
LinkedIn, etc.)
Designed for scalability and performance
Single-threaded concurrency model

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Background
The Old Way
The New Way

The Old Way

Older model of server design:
One thread per client
2MB per thread
I/O either blocks, is manually async, or is async through
external library
Large set of tools/capabilities built in

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Background
The Old Way
The New Way

The New Way

Node (and other newer frameworks like Akka, Vert.x, Tornado,
etc.) use a different model:
One thread, total
Non-blocking, event-driven I/O
Event loop drives entire server
Barebones
Goal: 10,000 concurrent connections

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Background
The Old Way
The New Way

Benefits of the New Way

Much less overhead per user
No concurrency = no concurrency bugs
Scaling is easy
Really fast

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Background
The Old Way
The New Way

Benefits of Node

Some benefits are specific to Node:
Underlying engine is fast, mature and well-maintained
Same language on server and client (!)

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Background
The Old Way
The New Way

CPU-intensive = I/O

So, how do we handle CPU-intensive work? Turn it into I/O!
Spin off new process
Yield control
Resume when computation finished
Result is asynchronous and efficient

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

What is CoffeeScript?
CoffeeScript in 10 Minutes

CoffeeScript

2

CoffeeScript
What is CoffeeScript?
CoffeeScript in 10 Minutes

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

What is CoffeeScript?
CoffeeScript in 10 Minutes

What is CoffeeScript?

First released in 2009
Syntax inspired by Python
Transcompiles to easily readable JavaScript
Seeing wider adoption with popularity of Node.js

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

What is CoffeeScript?
CoffeeScript in 10 Minutes

CoffeeScript Basics
Example
# Variables aren’t typed or declared
x = 2 + 2
# Everything is an expression
height = if isMobile then 300 else 800
# As in JS, easily declare arrays and objects
arr = [1, 2, 3]
obj = {year: 2004, model: "Camry"}

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

What is CoffeeScript?
CoffeeScript in 10 Minutes

CoffeeScript Functions
Example
# Functions are declared with () ->
# Last value implicitly returned
square = (x) -> x * x
# Indentation is used instead of braces
area = (r) ->
if r <= 0
0
else
pi = 3.14
pi * r * r
Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

What is CoffeeScript?
CoffeeScript in 10 Minutes

More CoffeeScript
Example
# Parentheses are optional in function calls
Math.pow(2, n) == Math.pow 2, n
# Useful for functional-style invocations
squares = util.map [1, 2, 3], (x) -> x * x
# String interpolation is awesome...
console.log "#{x} + #{y} = #{x+y}"
# ...especially when compared to vanilla JS strings
console.log "" + x + " + " + y + " = " + (x + y)
Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

What is CoffeeScript?
CoffeeScript in 10 Minutes

Destructuring Assignment...?

Example
# Quickly assign multiple values
[quotient, remainder] = divide 7, 3
# Take apart and put together objects easily
{age, name} = dbResult
x = 3
point = {x, y: 4}

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

What is CoffeeScript?
CoffeeScript in 10 Minutes

Classes!
CoffeeScript has classes!
Example
class Point
# Automatically assign params to instance fields
constructor: (@x, @y) ->
@sum = x + y
difference: ->
@x - @y
p = new Point(4, 5)
x.difference() # -1
Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Hello World
Basic Web Server
Show me the I/O

Node Basics

3

Node Basics
Hello World
Basic Web Server
Show me the I/O

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Hello World
Basic Web Server
Show me the I/O

Hello World

Example
net = require ’net’
net.createServer (stream) ->
stream.write ’Hello World!rn’
stream.pipe stream
.listen(8000)

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Hello World
Basic Web Server
Show me the I/O

Hello World
Example
http = require ’http’
http.createServer (request, response) ->
# 200 = HTTP ’everything OK’ status
response.writeHead 200,
{’Content-Type’: ’text/plain’}
response.end ’Hello World!’
.listen(8000)
Response time: <1 ms
Apache response time: 100 ms
Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Hello World
Basic Web Server
Show me the I/O

Asynchronous I/O
Example
http = require ’http’
db = require ’./server/db.coffee’
http.createServer (request, response) ->
query = ’SELECT * FROM STOCK;’
db.request query, (err, stock) ->
return sendError response, 500 if err
response.writeHead 200, { ... }
response.end stock.toString()
.listen(8000)
Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Libraries
express
Socket.IO
Backbone
swig

Node in Practice

4

Node in Practice
Libraries
express
Socket.IO
Backbone
swig

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Libraries
express
Socket.IO
Backbone
swig

Libraries
Web server framework: express
Async control flow: async
Client-server sync + MVC: Backbone
”Push” framework: Socket.IO
Client library: jQuery/Prototype
Templates: swig/Mustache/Hogan
Utilities: Underscore
Libraries and dependencies handled with Node Package Manager
(npm)

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Libraries
express
Socket.IO
Backbone
swig

express
express is a widely used wrapper over the built-in Node HTTP
library.
Example
express = require ’express’
app = express()
app.get ’/news/:slug’, (req, res) ->
res.send "You want the news about #{req.slug}!"
app.get ’/*’, (req, res) ->
res.sendfile ’index.html’
app.listen(8000)
Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Libraries
express
Socket.IO
Backbone
swig

Socket.IO
Socket.IO provides a ”push” framework - essentially, a pipe
between server and client.
Example (Server)
socketIO = require ’socket.io’
io = socketIO.listen(app)
io.on ’connection’, (socket) ->
ClientManager.add socket
socket.on ’getData’, (username) ->
socket.emit ’data’, cache.findPerson(username)
Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Libraries
express
Socket.IO
Backbone
swig

Socket.IO

Example (Client)
socket = io.connect ’http://localhost’
socket.emit ’getData’, auth.getUsername()
socket.on ’data’, (personData) ->
...

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Libraries
express
Socket.IO
Backbone
swig

Backbone
Backbone provides the client a MVC model as well as automatic
client-server syncing.
Example (Models)
class Message extends Backbone.Model
initialize: ->
@on ’change:message’, ’addEditMsg’
addEditMsg: ->
newMsg = "#{ @get ’message’ } (Edited)"
# Use silent: true to prevent infinite loop
@set {message: newMsg}, {silent: true}
Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Libraries
express
Socket.IO
Backbone
swig

Backbone
Example (Views)
class MessageView extends Backbone.View
tagName: ’div’
className: ’message’
template: ’message’
events:
’click .name’: ’showMsgAuthor’
initialize: ->
@listenTo @model, ’change’, @render

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Libraries
express
Socket.IO
Backbone
swig

Backbone
Example (Views)
class MessageView extends Backbone.View
# Even complex rendering is easy with Backbone
render: ->
data =
time: @get(’time’).toLocaleString()
color:
if @get(‘byAdmin’)
’red’
else
’white’
super(data)
Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Libraries
express
Socket.IO
Backbone
swig

Backbone

Example (All Together Now)
# Make a model...
model = new Message(data)
# ...make a view for that model...
view = new MessageView({ model })
# ...and insert it into the document
$(’.messages’).append view.render().el

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Libraries
express
Socket.IO
Backbone
swig

Templates with Swig
Building views with templates is easy.
Example (message.html)
From: {{ name }}<br />
Date: {{ time }}<br />
{{ message }}
Example (Client or Server)
msgTemplate = swig.compile rawTemplate
msg = msgTemplate(msgData)
$(’body’).append msg # Client only
Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Webapp Demo
Tying It All Together
More Resources
Questions

Conclusion

5

Conclusion
Webapp Demo
Tying It All Together
More Resources
Questions

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Webapp Demo
Tying It All Together
More Resources
Questions

App Demo

Simple webchat app
Multi-user chat
Changes propagate between server and all clients
Very little implementation logic
99% business logic

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Webapp Demo
Tying It All Together
More Resources
Questions

How Big?

Server: 200 lines
Client: 100 lines
HTML: 40 lines
CSS: 30 lines

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Webapp Demo
Tying It All Together
More Resources
Questions

Why Node?

Runs fast
Codes fast
Scales
Cross-platform
Huge library ecosystem

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Webapp Demo
Tying It All Together
More Resources
Questions

Why CoffeeScript?

Compatible with JS
Cleans up JS syntax
About 30% shorter than equivalent JS code

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Webapp Demo
Tying It All Together
More Resources
Questions

More Resources

Node’s own ”why?”: http://nodejs.org/about
The C10K problem: http://www.kegel.com/c10k.html
My app’s code:
https://github.com/royaldark/node-chat-demo
Everything Node, by popularity: http://www.nodecloud.org

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Webapp Demo
Tying It All Together
More Resources
Questions

Questions

Any questions?

Joe Einertson

Node.js

Contenu connexe

Tendances

Online game server on Akka.NET (NDC2016)
Online game server on Akka.NET (NDC2016)Online game server on Akka.NET (NDC2016)
Online game server on Akka.NET (NDC2016)Esun Kim
 
Node Architecture and Getting Started with Express
Node Architecture and Getting Started with ExpressNode Architecture and Getting Started with Express
Node Architecture and Getting Started with Expressjguerrero999
 
Node.js Patterns for Discerning Developers
Node.js Patterns for Discerning DevelopersNode.js Patterns for Discerning Developers
Node.js Patterns for Discerning Developerscacois
 
Building your first Node app with Connect & Express
Building your first Node app with Connect & ExpressBuilding your first Node app with Connect & Express
Building your first Node app with Connect & ExpressChristian Joudrey
 
Nodejs Event Driven Concurrency for Web Applications
Nodejs Event Driven Concurrency for Web ApplicationsNodejs Event Driven Concurrency for Web Applications
Nodejs Event Driven Concurrency for Web ApplicationsGanesh Iyer
 
A Taste of Clojure
A Taste of ClojureA Taste of Clojure
A Taste of ClojureDavid Leung
 
Building servers with Node.js
Building servers with Node.jsBuilding servers with Node.js
Building servers with Node.jsConFoo
 
Introduction to Node.js
Introduction to Node.jsIntroduction to Node.js
Introduction to Node.jsVikash Singh
 
Building a real life application in node js
Building a real life application in node jsBuilding a real life application in node js
Building a real life application in node jsfakedarren
 
Intsllation & 1st program nodejs
Intsllation & 1st program nodejsIntsllation & 1st program nodejs
Intsllation & 1st program nodejsmonikadeshmane
 
Harder Faster Stronger
Harder Faster StrongerHarder Faster Stronger
Harder Faster Strongersnyff
 
JVM Dive for mere mortals
JVM Dive for mere mortalsJVM Dive for mere mortals
JVM Dive for mere mortalsJakub Kubrynski
 
Plattformübergreifende App-Entwicklung (ein Vergleich) - MobileTechCon 2010
Plattformübergreifende App-Entwicklung (ein Vergleich) - MobileTechCon 2010Plattformübergreifende App-Entwicklung (ein Vergleich) - MobileTechCon 2010
Plattformübergreifende App-Entwicklung (ein Vergleich) - MobileTechCon 2010Heiko Behrens
 
Node.js: A Guided Tour
Node.js: A Guided TourNode.js: A Guided Tour
Node.js: A Guided Tourcacois
 
Recipes to build Code Generators for Non-Xtext Models with Xtend
Recipes to build Code Generators for Non-Xtext Models with XtendRecipes to build Code Generators for Non-Xtext Models with Xtend
Recipes to build Code Generators for Non-Xtext Models with XtendKarsten Thoms
 

Tendances (20)

Online game server on Akka.NET (NDC2016)
Online game server on Akka.NET (NDC2016)Online game server on Akka.NET (NDC2016)
Online game server on Akka.NET (NDC2016)
 
Node Architecture and Getting Started with Express
Node Architecture and Getting Started with ExpressNode Architecture and Getting Started with Express
Node Architecture and Getting Started with Express
 
Node.js Patterns for Discerning Developers
Node.js Patterns for Discerning DevelopersNode.js Patterns for Discerning Developers
Node.js Patterns for Discerning Developers
 
Introduction to NodeJS
Introduction to NodeJSIntroduction to NodeJS
Introduction to NodeJS
 
Building your first Node app with Connect & Express
Building your first Node app with Connect & ExpressBuilding your first Node app with Connect & Express
Building your first Node app with Connect & Express
 
Nodejs Event Driven Concurrency for Web Applications
Nodejs Event Driven Concurrency for Web ApplicationsNodejs Event Driven Concurrency for Web Applications
Nodejs Event Driven Concurrency for Web Applications
 
A Taste of Clojure
A Taste of ClojureA Taste of Clojure
A Taste of Clojure
 
Building servers with Node.js
Building servers with Node.jsBuilding servers with Node.js
Building servers with Node.js
 
Introduction to Node.js
Introduction to Node.jsIntroduction to Node.js
Introduction to Node.js
 
Building a real life application in node js
Building a real life application in node jsBuilding a real life application in node js
Building a real life application in node js
 
Intsllation & 1st program nodejs
Intsllation & 1st program nodejsIntsllation & 1st program nodejs
Intsllation & 1st program nodejs
 
Harder Faster Stronger
Harder Faster StrongerHarder Faster Stronger
Harder Faster Stronger
 
Node ppt
Node pptNode ppt
Node ppt
 
JVM Dive for mere mortals
JVM Dive for mere mortalsJVM Dive for mere mortals
JVM Dive for mere mortals
 
Plattformübergreifende App-Entwicklung (ein Vergleich) - MobileTechCon 2010
Plattformübergreifende App-Entwicklung (ein Vergleich) - MobileTechCon 2010Plattformübergreifende App-Entwicklung (ein Vergleich) - MobileTechCon 2010
Plattformübergreifende App-Entwicklung (ein Vergleich) - MobileTechCon 2010
 
Node.js 0.8 features
Node.js 0.8 featuresNode.js 0.8 features
Node.js 0.8 features
 
Node.js: A Guided Tour
Node.js: A Guided TourNode.js: A Guided Tour
Node.js: A Guided Tour
 
Intro to Sail.js
Intro to Sail.jsIntro to Sail.js
Intro to Sail.js
 
Nodejs intro
Nodejs introNodejs intro
Nodejs intro
 
Recipes to build Code Generators for Non-Xtext Models with Xtend
Recipes to build Code Generators for Non-Xtext Models with XtendRecipes to build Code Generators for Non-Xtext Models with Xtend
Recipes to build Code Generators for Non-Xtext Models with Xtend
 

En vedette

DK Resume desk and dev
DK Resume desk and devDK Resume desk and dev
DK Resume desk and devDerek Knoblich
 
A Designer's Intro to Oracle JET
A Designer's Intro to Oracle JETA Designer's Intro to Oracle JET
A Designer's Intro to Oracle JETLauren Beatty
 
Working with LoopBack Models
Working with LoopBack ModelsWorking with LoopBack Models
Working with LoopBack ModelsRaymond Feng
 
Building a Node.js API backend with LoopBack in 5 Minutes
Building a Node.js API backend with LoopBack in 5 MinutesBuilding a Node.js API backend with LoopBack in 5 Minutes
Building a Node.js API backend with LoopBack in 5 MinutesRaymond Feng
 
Rapid API Development with LoopBack/StrongLoop
Rapid API Development with LoopBack/StrongLoopRapid API Development with LoopBack/StrongLoop
Rapid API Development with LoopBack/StrongLoopRaymond Camden
 

En vedette (6)

DK Resume desk and dev
DK Resume desk and devDK Resume desk and dev
DK Resume desk and dev
 
A Designer's Intro to Oracle JET
A Designer's Intro to Oracle JETA Designer's Intro to Oracle JET
A Designer's Intro to Oracle JET
 
Who I am.doc
Who I am.docWho I am.doc
Who I am.doc
 
Working with LoopBack Models
Working with LoopBack ModelsWorking with LoopBack Models
Working with LoopBack Models
 
Building a Node.js API backend with LoopBack in 5 Minutes
Building a Node.js API backend with LoopBack in 5 MinutesBuilding a Node.js API backend with LoopBack in 5 Minutes
Building a Node.js API backend with LoopBack in 5 Minutes
 
Rapid API Development with LoopBack/StrongLoop
Rapid API Development with LoopBack/StrongLoopRapid API Development with LoopBack/StrongLoop
Rapid API Development with LoopBack/StrongLoop
 

Similaire à Building Fast, Modern Web Applications with Node.js and CoffeeScript

Why Nodejs Guilin Shanghai
Why Nodejs Guilin ShanghaiWhy Nodejs Guilin Shanghai
Why Nodejs Guilin ShanghaiJackson Tian
 
Why Node.js
Why Node.jsWhy Node.js
Why Node.jsguileen
 
Streams of information - Chicago crystal language monthly meetup
Streams of information - Chicago crystal language monthly meetupStreams of information - Chicago crystal language monthly meetup
Streams of information - Chicago crystal language monthly meetupBrian Cardiff
 
"Applied Enterprise Metaprogramming in JavaScript", Vladyslav Dukhin
"Applied Enterprise Metaprogramming in JavaScript", Vladyslav Dukhin"Applied Enterprise Metaprogramming in JavaScript", Vladyslav Dukhin
"Applied Enterprise Metaprogramming in JavaScript", Vladyslav DukhinFwdays
 
soft-shake.ch - Hands on Node.js
soft-shake.ch - Hands on Node.jssoft-shake.ch - Hands on Node.js
soft-shake.ch - Hands on Node.jssoft-shake.ch
 
The Future of Node - @rvagg - NodeConf Christchurch 2015
The Future of Node - @rvagg - NodeConf Christchurch 2015The Future of Node - @rvagg - NodeConf Christchurch 2015
The Future of Node - @rvagg - NodeConf Christchurch 2015rvagg
 
node.js: Javascript's in your backend
node.js: Javascript's in your backendnode.js: Javascript's in your backend
node.js: Javascript's in your backendDavid Padbury
 
Developing realtime apps with Drupal and NodeJS
Developing realtime apps with Drupal and NodeJS Developing realtime apps with Drupal and NodeJS
Developing realtime apps with Drupal and NodeJS drupalcampest
 
A tour on ruby and friends
A tour on ruby and friendsA tour on ruby and friends
A tour on ruby and friends旻琦 潘
 
EuRuKo JRuby Talk 2008
EuRuKo JRuby Talk 2008EuRuKo JRuby Talk 2008
EuRuKo JRuby Talk 2008geraldbauer
 
Modern server side development with node.js - Benjamin gruenbaum
Modern server side development with node.js - Benjamin gruenbaumModern server side development with node.js - Benjamin gruenbaum
Modern server side development with node.js - Benjamin gruenbaumgeektimecoil
 
Top 30 Node.js interview questions
Top 30 Node.js interview questionsTop 30 Node.js interview questions
Top 30 Node.js interview questionstechievarsity
 
Asterisk, HTML5 and NodeJS; a world of endless possibilities
Asterisk, HTML5 and NodeJS; a world of endless possibilitiesAsterisk, HTML5 and NodeJS; a world of endless possibilities
Asterisk, HTML5 and NodeJS; a world of endless possibilitiesDan Jenkins
 
540slidesofnodejsbackendhopeitworkforu.pdf
540slidesofnodejsbackendhopeitworkforu.pdf540slidesofnodejsbackendhopeitworkforu.pdf
540slidesofnodejsbackendhopeitworkforu.pdfhamzadamani7
 
Introduction to node.js GDD
Introduction to node.js GDDIntroduction to node.js GDD
Introduction to node.js GDDSudar Muthu
 
Webconf nodejs-production-architecture
Webconf nodejs-production-architectureWebconf nodejs-production-architecture
Webconf nodejs-production-architectureBen Lin
 

Similaire à Building Fast, Modern Web Applications with Node.js and CoffeeScript (20)

Why Nodejs Guilin Shanghai
Why Nodejs Guilin ShanghaiWhy Nodejs Guilin Shanghai
Why Nodejs Guilin Shanghai
 
Why Node.js
Why Node.jsWhy Node.js
Why Node.js
 
Streams of information - Chicago crystal language monthly meetup
Streams of information - Chicago crystal language monthly meetupStreams of information - Chicago crystal language monthly meetup
Streams of information - Chicago crystal language monthly meetup
 
"Applied Enterprise Metaprogramming in JavaScript", Vladyslav Dukhin
"Applied Enterprise Metaprogramming in JavaScript", Vladyslav Dukhin"Applied Enterprise Metaprogramming in JavaScript", Vladyslav Dukhin
"Applied Enterprise Metaprogramming in JavaScript", Vladyslav Dukhin
 
Node.JS briefly introduced
Node.JS briefly introducedNode.JS briefly introduced
Node.JS briefly introduced
 
soft-shake.ch - Hands on Node.js
soft-shake.ch - Hands on Node.jssoft-shake.ch - Hands on Node.js
soft-shake.ch - Hands on Node.js
 
The Future of Node - @rvagg - NodeConf Christchurch 2015
The Future of Node - @rvagg - NodeConf Christchurch 2015The Future of Node - @rvagg - NodeConf Christchurch 2015
The Future of Node - @rvagg - NodeConf Christchurch 2015
 
node.js: Javascript's in your backend
node.js: Javascript's in your backendnode.js: Javascript's in your backend
node.js: Javascript's in your backend
 
Node js
Node jsNode js
Node js
 
Developing realtime apps with Drupal and NodeJS
Developing realtime apps with Drupal and NodeJS Developing realtime apps with Drupal and NodeJS
Developing realtime apps with Drupal and NodeJS
 
NodeJS for Beginner
NodeJS for BeginnerNodeJS for Beginner
NodeJS for Beginner
 
Node azure
Node azureNode azure
Node azure
 
A tour on ruby and friends
A tour on ruby and friendsA tour on ruby and friends
A tour on ruby and friends
 
EuRuKo JRuby Talk 2008
EuRuKo JRuby Talk 2008EuRuKo JRuby Talk 2008
EuRuKo JRuby Talk 2008
 
Modern server side development with node.js - Benjamin gruenbaum
Modern server side development with node.js - Benjamin gruenbaumModern server side development with node.js - Benjamin gruenbaum
Modern server side development with node.js - Benjamin gruenbaum
 
Top 30 Node.js interview questions
Top 30 Node.js interview questionsTop 30 Node.js interview questions
Top 30 Node.js interview questions
 
Asterisk, HTML5 and NodeJS; a world of endless possibilities
Asterisk, HTML5 and NodeJS; a world of endless possibilitiesAsterisk, HTML5 and NodeJS; a world of endless possibilities
Asterisk, HTML5 and NodeJS; a world of endless possibilities
 
540slidesofnodejsbackendhopeitworkforu.pdf
540slidesofnodejsbackendhopeitworkforu.pdf540slidesofnodejsbackendhopeitworkforu.pdf
540slidesofnodejsbackendhopeitworkforu.pdf
 
Introduction to node.js GDD
Introduction to node.js GDDIntroduction to node.js GDD
Introduction to node.js GDD
 
Webconf nodejs-production-architecture
Webconf nodejs-production-architectureWebconf nodejs-production-architecture
Webconf nodejs-production-architecture
 

Dernier

Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CVKhem
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)wesley chun
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 

Dernier (20)

Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 

Building Fast, Modern Web Applications with Node.js and CoffeeScript

  • 1. Node.js Building Fast, Modern Web 2.0 Applications Joe Einertson University of Minnesota, Morris October 30, 2013
  • 2. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Table of Contents 1 What is Node? 2 CoffeeScript 3 Node Basics 4 Node in Practice 5 Conclusion Joe Einertson Node.js
  • 3. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Background The Old Way The New Way What is Node? 1 What is Node? Background The Old Way The New Way Joe Einertson Node.js
  • 4. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Background The Old Way The New Way What is Node.js? Network application framework built on Google’s V8 JavaScript engine Released in 2009, now widely used (Yahoo, Microsoft, eBay, LinkedIn, etc.) Designed for scalability and performance Single-threaded concurrency model Joe Einertson Node.js
  • 5. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Background The Old Way The New Way The Old Way Older model of server design: One thread per client 2MB per thread I/O either blocks, is manually async, or is async through external library Large set of tools/capabilities built in Joe Einertson Node.js
  • 6. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Background The Old Way The New Way The New Way Node (and other newer frameworks like Akka, Vert.x, Tornado, etc.) use a different model: One thread, total Non-blocking, event-driven I/O Event loop drives entire server Barebones Goal: 10,000 concurrent connections Joe Einertson Node.js
  • 7. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Background The Old Way The New Way Benefits of the New Way Much less overhead per user No concurrency = no concurrency bugs Scaling is easy Really fast Joe Einertson Node.js
  • 8. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Background The Old Way The New Way Benefits of Node Some benefits are specific to Node: Underlying engine is fast, mature and well-maintained Same language on server and client (!) Joe Einertson Node.js
  • 9. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Background The Old Way The New Way CPU-intensive = I/O So, how do we handle CPU-intensive work? Turn it into I/O! Spin off new process Yield control Resume when computation finished Result is asynchronous and efficient Joe Einertson Node.js
  • 10. What is Node? CoffeeScript Node Basics Node in Practice Conclusion What is CoffeeScript? CoffeeScript in 10 Minutes CoffeeScript 2 CoffeeScript What is CoffeeScript? CoffeeScript in 10 Minutes Joe Einertson Node.js
  • 11. What is Node? CoffeeScript Node Basics Node in Practice Conclusion What is CoffeeScript? CoffeeScript in 10 Minutes What is CoffeeScript? First released in 2009 Syntax inspired by Python Transcompiles to easily readable JavaScript Seeing wider adoption with popularity of Node.js Joe Einertson Node.js
  • 12. What is Node? CoffeeScript Node Basics Node in Practice Conclusion What is CoffeeScript? CoffeeScript in 10 Minutes CoffeeScript Basics Example # Variables aren’t typed or declared x = 2 + 2 # Everything is an expression height = if isMobile then 300 else 800 # As in JS, easily declare arrays and objects arr = [1, 2, 3] obj = {year: 2004, model: "Camry"} Joe Einertson Node.js
  • 13. What is Node? CoffeeScript Node Basics Node in Practice Conclusion What is CoffeeScript? CoffeeScript in 10 Minutes CoffeeScript Functions Example # Functions are declared with () -> # Last value implicitly returned square = (x) -> x * x # Indentation is used instead of braces area = (r) -> if r <= 0 0 else pi = 3.14 pi * r * r Joe Einertson Node.js
  • 14. What is Node? CoffeeScript Node Basics Node in Practice Conclusion What is CoffeeScript? CoffeeScript in 10 Minutes More CoffeeScript Example # Parentheses are optional in function calls Math.pow(2, n) == Math.pow 2, n # Useful for functional-style invocations squares = util.map [1, 2, 3], (x) -> x * x # String interpolation is awesome... console.log "#{x} + #{y} = #{x+y}" # ...especially when compared to vanilla JS strings console.log "" + x + " + " + y + " = " + (x + y) Joe Einertson Node.js
  • 15. What is Node? CoffeeScript Node Basics Node in Practice Conclusion What is CoffeeScript? CoffeeScript in 10 Minutes Destructuring Assignment...? Example # Quickly assign multiple values [quotient, remainder] = divide 7, 3 # Take apart and put together objects easily {age, name} = dbResult x = 3 point = {x, y: 4} Joe Einertson Node.js
  • 16. What is Node? CoffeeScript Node Basics Node in Practice Conclusion What is CoffeeScript? CoffeeScript in 10 Minutes Classes! CoffeeScript has classes! Example class Point # Automatically assign params to instance fields constructor: (@x, @y) -> @sum = x + y difference: -> @x - @y p = new Point(4, 5) x.difference() # -1 Joe Einertson Node.js
  • 17. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Hello World Basic Web Server Show me the I/O Node Basics 3 Node Basics Hello World Basic Web Server Show me the I/O Joe Einertson Node.js
  • 18. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Hello World Basic Web Server Show me the I/O Hello World Example net = require ’net’ net.createServer (stream) -> stream.write ’Hello World!rn’ stream.pipe stream .listen(8000) Joe Einertson Node.js
  • 19. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Hello World Basic Web Server Show me the I/O Hello World Example http = require ’http’ http.createServer (request, response) -> # 200 = HTTP ’everything OK’ status response.writeHead 200, {’Content-Type’: ’text/plain’} response.end ’Hello World!’ .listen(8000) Response time: <1 ms Apache response time: 100 ms Joe Einertson Node.js
  • 20. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Hello World Basic Web Server Show me the I/O Asynchronous I/O Example http = require ’http’ db = require ’./server/db.coffee’ http.createServer (request, response) -> query = ’SELECT * FROM STOCK;’ db.request query, (err, stock) -> return sendError response, 500 if err response.writeHead 200, { ... } response.end stock.toString() .listen(8000) Joe Einertson Node.js
  • 21. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Libraries express Socket.IO Backbone swig Node in Practice 4 Node in Practice Libraries express Socket.IO Backbone swig Joe Einertson Node.js
  • 22. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Libraries express Socket.IO Backbone swig Libraries Web server framework: express Async control flow: async Client-server sync + MVC: Backbone ”Push” framework: Socket.IO Client library: jQuery/Prototype Templates: swig/Mustache/Hogan Utilities: Underscore Libraries and dependencies handled with Node Package Manager (npm) Joe Einertson Node.js
  • 23. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Libraries express Socket.IO Backbone swig express express is a widely used wrapper over the built-in Node HTTP library. Example express = require ’express’ app = express() app.get ’/news/:slug’, (req, res) -> res.send "You want the news about #{req.slug}!" app.get ’/*’, (req, res) -> res.sendfile ’index.html’ app.listen(8000) Joe Einertson Node.js
  • 24. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Libraries express Socket.IO Backbone swig Socket.IO Socket.IO provides a ”push” framework - essentially, a pipe between server and client. Example (Server) socketIO = require ’socket.io’ io = socketIO.listen(app) io.on ’connection’, (socket) -> ClientManager.add socket socket.on ’getData’, (username) -> socket.emit ’data’, cache.findPerson(username) Joe Einertson Node.js
  • 25. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Libraries express Socket.IO Backbone swig Socket.IO Example (Client) socket = io.connect ’http://localhost’ socket.emit ’getData’, auth.getUsername() socket.on ’data’, (personData) -> ... Joe Einertson Node.js
  • 26. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Libraries express Socket.IO Backbone swig Backbone Backbone provides the client a MVC model as well as automatic client-server syncing. Example (Models) class Message extends Backbone.Model initialize: -> @on ’change:message’, ’addEditMsg’ addEditMsg: -> newMsg = "#{ @get ’message’ } (Edited)" # Use silent: true to prevent infinite loop @set {message: newMsg}, {silent: true} Joe Einertson Node.js
  • 27. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Libraries express Socket.IO Backbone swig Backbone Example (Views) class MessageView extends Backbone.View tagName: ’div’ className: ’message’ template: ’message’ events: ’click .name’: ’showMsgAuthor’ initialize: -> @listenTo @model, ’change’, @render Joe Einertson Node.js
  • 28. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Libraries express Socket.IO Backbone swig Backbone Example (Views) class MessageView extends Backbone.View # Even complex rendering is easy with Backbone render: -> data = time: @get(’time’).toLocaleString() color: if @get(‘byAdmin’) ’red’ else ’white’ super(data) Joe Einertson Node.js
  • 29. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Libraries express Socket.IO Backbone swig Backbone Example (All Together Now) # Make a model... model = new Message(data) # ...make a view for that model... view = new MessageView({ model }) # ...and insert it into the document $(’.messages’).append view.render().el Joe Einertson Node.js
  • 30. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Libraries express Socket.IO Backbone swig Templates with Swig Building views with templates is easy. Example (message.html) From: {{ name }}<br /> Date: {{ time }}<br /> {{ message }} Example (Client or Server) msgTemplate = swig.compile rawTemplate msg = msgTemplate(msgData) $(’body’).append msg # Client only Joe Einertson Node.js
  • 31. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Webapp Demo Tying It All Together More Resources Questions Conclusion 5 Conclusion Webapp Demo Tying It All Together More Resources Questions Joe Einertson Node.js
  • 32. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Webapp Demo Tying It All Together More Resources Questions App Demo Simple webchat app Multi-user chat Changes propagate between server and all clients Very little implementation logic 99% business logic Joe Einertson Node.js
  • 33. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Webapp Demo Tying It All Together More Resources Questions How Big? Server: 200 lines Client: 100 lines HTML: 40 lines CSS: 30 lines Joe Einertson Node.js
  • 34. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Webapp Demo Tying It All Together More Resources Questions Why Node? Runs fast Codes fast Scales Cross-platform Huge library ecosystem Joe Einertson Node.js
  • 35. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Webapp Demo Tying It All Together More Resources Questions Why CoffeeScript? Compatible with JS Cleans up JS syntax About 30% shorter than equivalent JS code Joe Einertson Node.js
  • 36. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Webapp Demo Tying It All Together More Resources Questions More Resources Node’s own ”why?”: http://nodejs.org/about The C10K problem: http://www.kegel.com/c10k.html My app’s code: https://github.com/royaldark/node-chat-demo Everything Node, by popularity: http://www.nodecloud.org Joe Einertson Node.js
  • 37. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Webapp Demo Tying It All Together More Resources Questions Questions Any questions? Joe Einertson Node.js