1. Node.js
&
Mobile Apps
Richard Rodger
@rjrodger
nearform.com
2. •Why should you use Node.js?
•Node.js basics
•Lessons from a real world project
3. nodejs.org
• Code in JavaScript on the server
• Built using Chrome V8 Engine - so it's really fast!
• Everything is event-based; there are no threads
4. Node.js Web Server
var http = require('http');
var server = http.createServer( function(req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'})
res.end('Hello Worldn')
});
server.listen(80, '127.0.0.1');
console.log('Web server running at http://127.0.0.1:80');
14. Mobile
Hybrid Native
Web
HTML5/JS Gotta learn 'em all*
HTML5/JS
15. Mobile Web Apps
• Web Pages built using HTML5 features:
• Canvas for drawing
• In-built Video and Audio
• Geolocation
• Web Sockets
• Local Storage, Local Caching
• CSS3 transitions (not really HTML5)
• Use JavaScript as main programming language
ft.com business
• Designed for Touch Interfaces
post.ie
• Smart phone or Tablet form factors
• Don’t use Hover effects, instead convey touch affordance using 3D styling
• Dynamic single page apps. Changes are made to the HTML rather than loading
new pages.
18. Node.js and Mobile
nginx Node.js
• nginx
• high performance web server
• serves static resources: test files, images
• proxies requests through to Node.js app server
• Node.js
• high performance server-side JavaScript
• Executes business logic and database queries
19. • Runs high-performance server-side JavaScript
• open source, sponsored by joyent.com
• Uses the Google Chrome V8 engine
• just-in-time compilation to machine code
• generation garbage collection (like the Java JVM)
• creates virtual “classes” to optimise property lookups
• Has a well-designed module system for third party code - very
effective and simple to use
• Your code runs in a single non-blocking JavaScript thread
• That’s OK, most of the time you’re waiting for database or
network events
22. Working with Events
var http = require('http');
var server = http.createServer();
server.on( 'request', function(req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'})
var echo = ''
req.on('data',function(chunk){
echo += chunk
})
req.on('end', function(){
res.end( echo+'n' )
})
req.on('error', function(err){
res.end( "error: "+err )
})
})
server.listen(80, '127.0.0.1');
console.log('try: curl http://127.0.0.1 -d hello');
23. What does the core API give you?
Q
basics:
file system, ...
9
control:
events, streams, buffers...
g
networking:
sockets, DNS, ...
„
web server:
HTTP handling, ...
24. Node.js modules are so cool
• Easy syntax
• var moduleAPI = require("modulename");
• Central repository
• npmjs.org
• Easy command line install
• npm install modulename
• No version conflicts!
• intelligent dependency management
• Declarative project description
• package.json file goes into project root folder
25. Some important modules
(find them on npmjs.org or github.com)
• connect
• HTTP middleware infrastructure - requests pass through layers
• express
• JSP/ASP style dynamic server-side pages
• underscore
• same as client-side library! provides functional utilities: map, reduce, ...
• socket.io
• HTML5 real-time web sockets that "just work" - includes client-side API
• request
• easy outbound calls to web services
26. Node.js is It doesn't
overhyped matter
• Not a clear winner against • Chrome V8 Engine means
Node.js is "Good Enough"
other event servers on speed
• Asynchronous code is harder • JavaScript means almost all
libraries are asynchronous, unlike
than synchronous code other event servers
• No, you wont re-use much • JavaScript is a local maximum and
code between client and you're stuck with it
server
• Same language on client and
server makes your brain happy
• Memory can still leak
• Compile to JavaScript if you really
• It's not a mature platform hate the language
28. Web
Mobile Cloud
Services
Web Apps Services
API
Mobile & REST &
Database
Tablet Web JSON
Mobile & Horizontal Third Party
Tablet Apps Scale Services
Desktop Cloud
Monitoring
Web Hosted
29. Client-side
Router #! URLs
• Common code-base
• even for hybrid apps!
Models Data, biz logic
• backbone.js
• shims for weak browsers
Views DOM Layout
• browser-targeting: user-
agent & capabilities
• responsive layout
(mostly)
Helpers Shared code
30. Server-side
map /api/ URLs • nginx & Node.js
Router
to functions • Small code volume
API function( req, • Third party modules:
functions res ) { ... } • connect
Shared code
• express
Helpers (some with client) • seneca (my db layer)
Open source
• Deploy with:
Modules heavy-lifting • sudo killall node
32. Third Party Integration
JSON, XML, simple form data, text files, ...
... all easy using JavaScript and Node.js Modules
Analytics Twitter E-Commerce
In-App
Logging Facebook
Purchasing
Email LinkedIn Stock Feed
33. Native Apps
Same code as mobile web versions, ...
... wrapped using PhoneGap to run natively
... plus some native plugins
36. Lesson:
multi-platform client-side JavaScript is really hard
• a framework is a must • code against ECMA, use shims
to support older browsers
• backbone.js • Code/Test/Debug inside Safari
• business logic must be in • phonegap.github.com/weinre
common code for hard to reach places
• browser-specific code • use error capture in production
• virtual .js files • Finally, use a simple static site as
a fallback (also for Googlebot)
• use jshint to keep IE happy
37. Lesson:
multi-platform HTML/CSS is really hard
• "structured" CSS is a must • Clean, semantic HTML is not
optional
• sass or less • graceful degradation may
• Be happy with require radically different CSS
• media queries • 100% "Responsive" design is
tough
• CSS3 transforms • Responsive within browser
subsets has higher reward/
• browser-specific code effort
• virtual .css files
38. Lesson:
the app stores are not web sites
• that bug in version 1... • you can't deploy hot fixes
• will take two weeks to • make everything
fix via an update configurable!
• some users will never • All prices, text, host
update names, urls, ...
• appears after an OS • On launch, app "checks-in"
update for new configuration
• this will save your life
39. Lesson:
Node.js does what it says on the tin
• High performance • callback spaghetti is not a
problem in practice
• High throughput
• Low CPU usage • use functional style
• Constant memory usage • client-side code is far
more difficult
• leaks will kill, but then • Don't do CPU intensive stuff
• < 100ms startup time • ... there's a warning on
• means you may not the tin!
notice!
40. Lesson:
Outsource your database
• Remote MongoDB • Big productivity gain
hosting
• no production tuning
• mongohq.com • no configuration
• No downtime • no cluster set up
• Backups
• Low latency (in Amazon)
• Web-based admin (if lazy)
41. Node.js means Rapid Development
* Bruno Fernandez-Ruiz
http://www.olympum.com/architecture/the-
nodejs-innovation-advantage/
42. My Company
Mobile Apps + Node.js
My Book
richardrodger.com
Richard Rodger
@rjrodger
nearform.com