Dcjq node.js presentation

9,254 views

Published on

Node.js: What Is It, How Does It Work, and What Can I Use It For Tomorrow?

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

No Downloads
Views
Total views
9,254
On SlideShare
0
From Embeds
0
Number of Embeds
2,569
Actions
Shares
0
Downloads
0
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n\n
  • \n\n
  • \n\n
  • \n\n
  • \n\n\n
  • \n\n\n\n
  • \n\n\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n\n
  • \n\n
  • \n\n
  • \n\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Dcjq node.js presentation

    1. 1. dcjq[5] Node.js: What Is It, How Does It Work, and What Can I Use It For Tomorrow? April 28, 2011 Jonathan Altman http://async.io/ @async_io
    2. 2. what we’ll cover• What node is• Why node is the way it is• What you can do with it• Set up a running framework to build web apps• Dissect a simple node web application
    3. 3. node.js is:• A non-browser Javascript toolkit/ framework started by Ryan Dahl• Available for *nix-based systems: Linux, OS X, OpenSolaris (and Windows)• Built on top of Google’s V8 Javascript engine• Compatible with many common Javascript libraries out of the box via CommonJS support (http://www.commonjs.org/)• A batteries-included framework: HTTP and socket support baked into the core of the framework• A framework that is easy to build tooling on top of• Most importantly: asynchronous from the ground up
    4. 4. node.js is:• A non-browser Javascript toolkit/framework started by Ryan Dahl• Available for *nix-based systems: Linux, OS X, OpenSolaris (and Windows)• Built on top of Google’s V8 Javascript engine• Compatible with many common Javascript libraries out of the box via CommonJS support (http://www.commonjs.org/)• A batteries-included framework: HTTP and socket support baked into the core of the framework• A framework that is easy to build tooling on top of• Most importantly: asynchronous from the ground up
    5. 5. node.js is:• A non-browser Javascript toolkit/framework started by Ryan Dahl• Available for *nix-based systems: Linux, OS X, OpenSolaris (and Windows)• Built on top of Google’s V8 Javascript engine• Compatible with many common Javascript libraries out of the box via CommonJS support (http://www.commonjs.org/)• A batteries-included framework: HTTP and socket support baked into the core of the framework• A framework that is easy to build tooling on top of• Most importantly: asynchronous from the ground up
    6. 6. node.js is:• A non-browser Javascript toolkit/framework started by Ryan Dahl• Available for *nix-based systems: Linux, OS X, OpenSolaris (and Windows)• Built on top of Google’s V8 Javascript engine• Compatible with many common Javascript libraries out of the box via CommonJS support (http://www.commonjs.org/)• A batteries-included framework: HTTP and socket support baked into the core of the framework• A framework that is easy to build tooling on top of• Most importantly: asynchronous from the ground up
    7. 7. node.js is:• A non-browser Javascript toolkit/framework started by Ryan Dahl• Available for *nix-based systems: Linux, OS X, OpenSolaris (and Windows)• Built on top of Google’s V8 Javascript engine• Compatible with many common Javascript libraries out of the box via CommonJS support (http://www.commonjs.org/)• A batteries-included framework: HTTP and socket support baked into the core of the framework• A framework that is easy to build tooling on top of• Most importantly: asynchronous from the ground up
    8. 8. node.js is:• A non-browser Javascript toolkit/framework started by Ryan Dahl• Available for *nix-based systems: Linux, OS X, OpenSolaris (and Windows)• Built on top of Google’s V8 Javascript engine• Compatible with many common Javascript libraries out of the box via CommonJS support (http://www.commonjs.org/)• A batteries-included framework: HTTP and socket support baked into the core of the framework• A framework that is easy to build tooling on top of• Most importantly: asynchronous from the ground up
    9. 9. node.js is:• A non-browser Javascript toolkit/framework started by Ryan Dahl• Available for *nix-based systems: Linux, OS X, OpenSolaris (and Windows)• Built on top of Google’s V8 Javascript engine• Compatible with many common Javascript libraries out of the box via CommonJS support (http://www.commonjs.org/)• A batteries-included framework: HTTP and socket support baked into the core of the framework• A framework that is easy to build tooling on top of• Most importantly: asynchronous from the ground up
    10. 10. so what does code look like?
    11. 11. node.js script to determine if a file exists Running it yields:
    12. 12. whoa, back up: asynchronous?• Core trait of the framework• Provides scalability• Long-running operations do not block your server• Coding looks odd for server writers
    13. 13. whoa, back up: asynchronous?• Core trait of the framework• Provides scalability• Long-running operations do not block your server• Coding looks odd for server writers
    14. 14. whoa, back up: asynchronous?• Core trait of the framework• Provides scalability• Long-running operations do not block your server• Coding looks odd for server writers
    15. 15. whoa, back up: asynchronous?• Core trait of the framework• Provides scalability• Long-running operations do not block your server• Coding looks odd for server writers
    16. 16. code looks odd?• node: • jQuery:var sys = require(sys), $(.station_map).live("pagecreate", function() { path = require(path),     if(navigator.geolocation) { fs = require(fs);       navigator.geolocation.getCurrentPosition(function(position){         initializeMap(position.coords.latitude,position.coords.longitvar fileName = process.ARGV[2]; ude);path.exists(fileName, function(exists) {       }); if (!exists) {     } sys.puts(fileName + not found);   }); return; // snippet taken from https://github.com/mikeymckay/Capital- } Bikeshare/blob/master/capitalbikeshare.js sys.puts(w00t! + fileName + exists!);});// https://github.com/jonathana/dcjq_5_nodejs/blob/master/node_async_example.js Doesn’t the code look just like the event-driven javascript DHTML- based web apps have been written in for years?
    17. 17. node: up and running• node.js and its ecosystem still evolves very fast• Highly recommended to not put any of it in your system paths• We’ll use ~/local (lots of examples do so...)
    18. 18. node: up and running• node.js and its ecosystem still evolves very fast• Highly recommended to not put any of it in your system paths• We’ll use ~/local (lots of examples do so...)
    19. 19. node: up and running• node.js and its ecosystem still evolves very fast• Highly recommended to not put any of it in your system paths• We’ll use ~/local (lots of examples do so...)
    20. 20. be careful for:• Highly recommended not to install node in “system” locations yet• Uncertain security/threat model• Hide behind a reverse proxy
    21. 21. be careful for:• Highly recommended not to install node in “system” locations yet• Uncertain security/threat model• Hide behind a reverse proxy
    22. 22. be careful for:• Highly recommended not to install node in “system” locations yet• Uncertain security/threat model• Hide behind a reverse proxy
    23. 23. be careful for:• Highly recommended not to install node in “system” locations yet• Uncertain security/threat model• Hide behind a reverse proxy• Everything in this presentation could be wrong by now!
    24. 24. basic components• node.js itself• nave: manages multiple versions of node• npm: node package manager. Like ruby’s gem or python’s easy_install
    25. 25. basic components• node.js itself• nave: manages multiple versions of node• npm: node package manager. Like ruby’s gem or python’s easy_install
    26. 26. basic components• node.js itself• nave: manages multiple versions of node• npm: node package manager. Like ruby’s gem or python’s easy_install
    27. 27. managing versions-nave• Again, node.js and its libraries move fast• Like python’s virtualenv or ruby’s rvm, there are nave and nvm for node• Let’s use nave• Allows us to have a “stable” environment• Allows us to test newer versions without risking “stable”
    28. 28. managing versions-nave• Again, node.js and its libraries move fast• Like python’s virtualenv or ruby’s rvm, there are nave and nvm for node• Let’s use nave• Allows us to have a “stable” environment• Allows us to test newer versions without risking
    29. 29. managing versions-nave• Again, node.js and its libraries move fast• Like python’s virtualenv or ruby’s rvm, there are nave and nvm for node• Let’s use nave• Allows us to have a “stable” environment• Allows us to test newer versions without risking “stable”
    30. 30. managing versions-nave• Again, node.js and its libraries move fast• Like python’s virtualenv or ruby’s rvm, there are nave and nvm for node• Let’s use nave• Allows us to have a “stable” environment• Allows us to test newer versions without risking “stable”
    31. 31. managing versions-nave• Again, node.js and its libraries move fast• Like python’s virtualenv or ruby’s rvm, there are nave and nvm for node• Let’s use nave• Allows us to have a “stable” environment• Allows us to test newer versions without risking “stable”
    32. 32. install node.js via nave• node.js must be built from source• nave handles this for you. Examples: nave use stable nave use latest nave use 0.4.6• nave downloads, builds, and installs the node version you asked for!
    33. 33. install node.js via nave• node.js must be built from source• nave handles this for you. Examples: nave use stable nave use latest nave use 0.4.6• nave downloads, builds, and installs the node version you asked for!
    34. 34. install node.js via nave• node.js must be built from source• nave handles this for you. Examples: nave use stable nave use latest nave use 0.4.6• nave downloads, builds, and installs the node version you asked for!
    35. 35. installing nave• Adapted from https://gist.github.com/ 579814#file_use_nave.sh mkdir ~/.nave pushd ~/.nave wget http://github.com/isaacs/nave/raw/master/ nave.sh ln -s $PWD/nave.sh ~/local/bin/nave
    36. 36. nave installing a version...Several thousand lines of build output deleted...
    37. 37. npm: node package manager• Handles easy installation of node packages• Databases: mysql, postgresql, sqlite, mongodb, etc• DOM: jsdom• web frameworks: e.g. express, connect, spark/spark2• DOM manipulation: YUI3, jQuery• Utility libraries: backbone/spine, underscore, socket.io• Templating: mustache, handlebars, ejs, etc• Testing: vows, expresso, nodemock, nodeunit
    38. 38. npm: node package manager• Handles easy installation of node packages• Databases: mysql, postgresql, sqlite, mongodb, etc• DOM: jsdom• web frameworks: e.g. express, connect, spark/spark2• DOM manipulation:YUI3, jQuery• Utility libraries: backbone/spine, underscore, socket.io• Templating: mustache, handlebars, ejs, etc• Testing: vows, expresso, nodemock, nodeunit
    39. 39. install npmcurl http://npmjs.org/install.sh | sh That’s it, there is no step 2!
    40. 40. it’s alivejonathan@ubuntu:~$ node --versionv0.4.7jonathan@ubuntu:~$ npm --version1.0.3jonathan@ubuntu:~$
    41. 41. installing node packages Some more output deleted...
    42. 42. let’s write a web appvar sys = require(sys), http = require(http);http.createServer(function(req, res) { res.writeHead(200, {Content-Type: text/html}); res.write(<h1>Hello World</h1>); res.end();}).listen(8000);sys.puts(Server running at http://127.0.0.1:8000/);//https://github.com/jonathana/dcjq_5_nodejs/blob/master/helloworld.js
    43. 43. let’s run the web app jonathan@ubuntu:~/src/dcjq_5_nodejs$ nave use stable Already installed: 0.4.7 using 0.4.7 jonathan@ubuntu:~/src/dcjq_5_nodejs$ PATH=$PATH:`npm bin` jonathan@ubuntu:~/src/dcjq_5_nodejs$ node helloworld.js Server running at http://0.0.0.0:8000/• That PATH= command is for npm-installed executables
    44. 44. and visit our webpage
    45. 45. now let’s debug the web app• node-inspector is an npm package for debugging node over http! jonathan@ubuntu:~/src/dcjq_5_nodejs$ node-inspector & [1] 6274 visit http://0.0.0.0:8080/debug?port=5858 to start debugging jonathan@ubuntu:~/src/dcjq_5_nodejs$ node --debug helloworld.js debugger listening on port 5858 Server running at http://0.0.0.0:8000/• The webkit javascript debugging engine works really well with this. Debugging in Chrome FTW!
    46. 46. and see us stop at a breakpoint!
    47. 47. advantages of node• Javascript makes callback-based (“event”) programming familiar• Fast: framework says take operations that normally block webserver and make them asynchronous• Same language on client and server• Same libraries on client and server• Long-running connections to lots of clients: Comet
    48. 48. advantages of node• Javascript makes callback-based (“event”) programming familiar• Fast: framework says take operations that normally block webserver and make them asynchronous• Same language on client and server• Same libraries on client and server• Long-running connections to lots of clients: Comet
    49. 49. advantages of node• Javascript makes callback-based (“event”) programming familiar• Fast: framework says take operations that normally block webserver and make them asynchronous• Same language on client and server• Same libraries on client and server• Long-running connections to lots of clients: Comet
    50. 50. advantages of node• Javascript makes callback-based (“event”) programming familiar• Fast: framework says take operations that normally block webserver and make them asynchronous• Same language on client and server• Same libraries on client and server• Long-running connections to lots of clients: Comet
    51. 51. advantages of node• Javascript makes callback-based (“event”) programming familiar• Fast: framework says take operations that normally block webserver and make them asynchronous• Same language on client and server• Same libraries on client and server• Long-running connections to lots of clients: Comet
    52. 52. sample web development stack • node-inspector: debugging • express (and connect): web framework, middleware, routing, controllers • spark2: nice front-end for controlling node servers • ejs templates: embedded javascript, for views • connect-mongodb: mongoDB-backed sessions • mongoose: mongoDB-based object mapper for models • test: yeah, you should pick some packages and use them • jsdom: manipulate html DOMs server-side • jquery and/or YUI3: do cool stuff server side with the DOM
    53. 53. examples/sample app• See https://github.com/jonathana/dcjq_5_nodejs for the example code used in this presentation and a heavily- commented simple web app built using many of the packages on the previous slides
    54. 54. appendix: Resources• Ryan Dahl: (http://tinyclouds.org/, https://github.com/ry)• Ryan’s jsconf 2009 presentation: http://s3.amazonaws.com/four.livejournal/ 20091117/jsconf.pdf• Simon Willison’s blog post re: node.js: http://simonwillison.net/2009/Nov/23/node/• node.js home: http://nodejs.org/, git repo: https://github.com/joyent/node/• node modules: https://github.com/joyent/node/wiki/modules• Isaac Schlueter: (npm and nave) https://github.com/isaacs/, http://blog.izs.me/• Dav Glass’ mind-bending demonstration of using YUI server-side: http:// developer.yahoo.com/yui/theater/video.php?v=glass-node• Nice list of some apps built using node.js + express: http://expressjs.com/ applications.html

    ×