node conf - building realtime webapps

24
Building Realtime Singlepage Apps @HenrikJoreteg (hurray for Twitter) Friday, May 6, 2011

Upload: henrik-joreteg

Post on 11-May-2015

9.190 views

Category:

Technology


0 download

DESCRIPTION

Building Realtime Web app

TRANSCRIPT

Page 1: Node conf - building realtime webapps

Building Realtime Singlepage Apps

@HenrikJoreteg(hurray for Twitter)

Friday, May 6, 2011

Page 2: Node conf - building realtime webapps

The web is in DIRECT

competition with native apps

Friday, May 6, 2011

Page 3: Node conf - building realtime webapps

Stop supporting crappy browsers.

Just STOP!

Friday, May 6, 2011

Page 4: Node conf - building realtime webapps

focus on providing compelling experiences

(with the latest technologies)

Friday, May 6, 2011

Page 5: Node conf - building realtime webapps

Adoption is directly related to how easy it is to tinker with.

Friday, May 6, 2011

Page 6: Node conf - building realtime webapps

Socket.io is to realtime what jQuery is to AJAX

Friday, May 6, 2011

Page 7: Node conf - building realtime webapps

Quick look at Socket.io

Friday, May 6, 2011

Page 8: Node conf - building realtime webapps

Servervar http = require('http'),      io = require('socket.io');

server = http.createServer(function(req, res){  // your normal server code  res.writeHead(200, {'Content-Type': 'text/html'});  res.end('<h1>Hello world</h1>'); });server.listen(80);  // socket.io var socket = io.listen(server); socket.on('connection', function(client){   // new client is here!   client.on('message', function(){ … })   client.on('disconnect', function(){ … }) });

Friday, May 6, 2011

Page 9: Node conf - building realtime webapps

Client<script src="http://{node_server_url}/socket.io/socket.io.js"></script> <script>   var socket = new io.Socket({node_server_url});   socket.connect();  socket.on('connect', function(){ … })   socket.on('message', function(){ … })   socket.on('disconnect', function(){ … }) </script>

Friday, May 6, 2011

Page 10: Node conf - building realtime webapps

It’s all about state

Friday, May 6, 2011

Page 11: Node conf - building realtime webapps

Quick Look at Backbone.js

Friday, May 6, 2011

Page 12: Node conf - building realtime webapps

Backbone gives you Observable Models & Collections

var App = Backbone.Model.extend({ initialize: function () { this.bind(‘change:myProperty’, _(this.writeIt).bind(this)); }, writeIt: function () { console.log(“my prop is: “ + this.get(‘myProperty’)); }});

app = new App();app.set({myProperty: true}); // outputs: “my prop is: true”

Friday, May 6, 2011

Page 13: Node conf - building realtime webapps

Views just listen to model changesvar AppView = Backbone.Model.extend({ initialize: function () { this.model.bind(‘change’, _(this.render).bind(this)); }, render: function () { this.el.html(ich.app(this.model.toJSON())); return this; }});

var app = new App(); // init our modelvar appView = new AppView({ model: app, el: document.body }); // init our view

appView.render();app.set({myProperty: true}); // will re-render the whole app

Friday, May 6, 2011

Page 14: Node conf - building realtime webapps

Quick look at Capsule

Friday, May 6, 2011

Page 15: Node conf - building realtime webapps

Backbone.js +

model nesting +

serialization+

event bubblingFriday, May 6, 2011

Page 16: Node conf - building realtime webapps

Models shared by Server + Client(function () { ... detect and set up environment for CommonJS or browser here // Main app model exports.AppModel = Capsule.Model.extend({ type: 'app', initialize: function (spec) { this.register(); this.addChildCollection('members', exports.Members); this.addChildModel('activityLog', exports.ActivityLogPage); } }); // other models exports.Members = ...})();

Friday, May 6, 2011

Page 17: Node conf - building realtime webapps

Server-sidesocket.on('connection', function (client) { var app, sessionId;

// this is split out so we have a reference to it function sendClientChanges(changes) { client.send(changes); } client.on('message', function(message){ var model, collection;

switch (message.event) { case 'session': ... // Here you'd fetch your user from DB based on sessionid // you'd also get the corresponding app state that they should have access to. // `require` your shared models file and inflate or instantiate your root app model // Then grab whatever else you need and send the intial state to the client. client.send({ event: 'initial', app: app.xport() });

// bind to the root `publish` events to send any changes to this client app.bind('publish', sendClientChanges); ...

Friday, May 6, 2011

Page 18: Node conf - building realtime webapps

Clientside$(function () { var app = window.app = new AppModel(); window.socket = new io.Socket();

// get and send our session cookie socket.on('connect', function() { socket.send({ event: 'session', cookie: $.cookie('&!') }); }); socket.on(‘message’, ...});

Friday, May 6, 2011

Page 19: Node conf - building realtime webapps

Clientside cont...socket.on('message', function (msg) { switch (msg.event) { case 'initial': //import app state app.mport(msg.app); // init and render our root view view = window.view = new AppView({ el: $('body'), model: app }).render(); break; case 'change': app.modelGetter(msg.id).set(msg.data); break;

... other cases for `add`, `remove` etc. }});

Friday, May 6, 2011

Page 20: Node conf - building realtime webapps

Friday, May 6, 2011

Page 21: Node conf - building realtime webapps

Friday, May 6, 2011

Page 22: Node conf - building realtime webapps

Friday, May 6, 2011

Page 23: Node conf - building realtime webapps

Challenges

• Partially shared stateHint, sync everything, have your view render what’s relevant

• Scaling• Providing external APIs

Friday, May 6, 2011

Page 24: Node conf - building realtime webapps

Thank you!

me on twitter: @HenrikJoreteg (hit me up for early invite to &!)

Backbone.js: http://documentcloud.github.com/backbone/

Capsule.js: https://github.com/andyet/capsule

App Testing: http://funcunit.com,

http://mwbrooks.github.com/dominator.js/

Helpful Resources:

Friday, May 6, 2011