building reactive, realtime apps without writing javascript

46
Building Reactive, Realtime Apps Without Writing JavaScript Bryan Powell @bryanp All Things Open 2015

Upload: all-things-open

Post on 23-Jan-2018

279 views

Category:

Technology


5 download

TRANSCRIPT

Page 1: Building Reactive, Realtime Apps Without Writing Javascript

Building Reactive, Realtime AppsWithout Writing JavaScript

Bryan Powell @bryanp

All Things Open 2015

Page 2: Building Reactive, Realtime Apps Without Writing Javascript

The web should not be single-page.

We need a better way to build the web.

Page 3: Building Reactive, Realtime Apps Without Writing Javascript
Page 4: Building Reactive, Realtime Apps Without Writing Javascript
Page 5: Building Reactive, Realtime Apps Without Writing Javascript
Page 6: Building Reactive, Realtime Apps Without Writing Javascript

Collaboration

Content

Page 7: Building Reactive, Realtime Apps Without Writing Javascript
Page 8: Building Reactive, Realtime Apps Without Writing Javascript
Page 9: Building Reactive, Realtime Apps Without Writing Javascript
Page 10: Building Reactive, Realtime Apps Without Writing Javascript
Page 11: Building Reactive, Realtime Apps Without Writing Javascript

Progressive enhancement is necessary when content has priority.

Page 12: Building Reactive, Realtime Apps Without Writing Javascript

Sorry, web standards will win.

Page 13: Building Reactive, Realtime Apps Without Writing Javascript

But isomorphic JavaScript!

Page 14: Building Reactive, Realtime Apps Without Writing Javascript
Page 15: Building Reactive, Realtime Apps Without Writing Javascript

Server Rendered w/ Real-Time Layer

Keep Business Logic on Server

(real-time as progressive enhancement)

(write no JavaScript)

WAT.

Page 16: Building Reactive, Realtime Apps Without Writing Javascript

Example Time!!!Disclaimer: everything you’re about to see

works and is available now on GitHub.

Page 17: Building Reactive, Realtime Apps Without Writing Javascript

<div data-scope="stats"> <span data-prop="active"> 1 </span>

<span data-prop="total"> 2 </span> </div>

Page 18: Building Reactive, Realtime Apps Without Writing Javascript

<div data-scope="stats"> <span data-prop="active"> 1 </span>

<span data-prop="total"> 2 </span> </div>

Page 19: Building Reactive, Realtime Apps Without Writing Javascript

<div data-scope="stats"> <span data-prop="active"> 1 </span>

<span data-prop="total"> 2 </span> </div>

Page 20: Building Reactive, Realtime Apps Without Writing Javascript

<div data-scope="stats"> <span data-prop="active"> 1 </span>

<span data-prop="total"> 2 </span> </div>

Page 21: Building Reactive, Realtime Apps Without Writing Javascript

<div data-scope="stats"> <span data-prop="active"> 1 </span>

<span data-prop="total"> 2 </span> </div>

Page 22: Building Reactive, Realtime Apps Without Writing Javascript

<div data-scope="stats"> <span data-prop="active"> 1 </span>

<span data-prop="total"> 2 </span> </div>

{ active: 3,

total: 42

}

<

Page 23: Building Reactive, Realtime Apps Without Writing Javascript

<div data-scope="stats"> <span data-prop="active"> 1 </span>

<span data-prop="total"> 2 </span> </div>

{ active: 3,

total: 42

}

view.scope(:stats).apply(data)

<

Page 24: Building Reactive, Realtime Apps Without Writing Javascript

<div data-scope="stats"> <span data-prop="active"> 1 </span>

<span data-prop="total"> 2 </span> </div>

{ active: 3,

total: 42

}

view.scope(:stats).apply(data)

<

Page 25: Building Reactive, Realtime Apps Without Writing Javascript

<div data-scope="stats"> <span data-prop="active"> 1 </span>

<span data-prop="total"> 2 </span> </div>

{ active: 3,

total: 42

}

view.scope(:stats).apply(data)

<

Page 26: Building Reactive, Realtime Apps Without Writing Javascript

<div data-scope="stats"> <span data-prop="active"> 3 </span>

<span data-prop="total"> 42 </span> </div>

{ active: 3,

total: 42

}

view.scope(:stats).apply(data)

<

Page 27: Building Reactive, Realtime Apps Without Writing Javascript

<div data-scope="stats"> <span data-prop="active"> 3 </span>

<span data-prop="total"> 42 </span> </div>

{ active: 3,

total: 42

}

view.scope(:stats).apply(data)

<

Non-Destructive Rendering

Page 28: Building Reactive, Realtime Apps Without Writing Javascript

get '/' do view.scope(:stats).render(:display, with: data(:stats).all ).subscribe end

Page 29: Building Reactive, Realtime Apps Without Writing Javascript

get '/' do view.scope(:stats).render(:display, with: data(:stats).all ).subscribe end

Page 30: Building Reactive, Realtime Apps Without Writing Javascript

get '/' do view.scope(:stats).render(:display, with: data(:stats).all ).subscribe end

Page 31: Building Reactive, Realtime Apps Without Writing Javascript

get '/' do view.scope(:stats).render(:display, with: data(:stats).all ).subscribe end

Page 32: Building Reactive, Realtime Apps Without Writing Javascript

get '/' do view.scope(:stats).render(:display, with: data(:stats).all ).subscribe end

Page 33: Building Reactive, Realtime Apps Without Writing Javascript

get '/' do view.scope(:stats).render(:display, with: data(:stats).all ).subscribe end

Page 34: Building Reactive, Realtime Apps Without Writing Javascript

server

>

<

websocket

JavaScript Library

Page 35: Building Reactive, Realtime Apps Without Writing Javascript

state change server> transformations>

JavaScript Library

>

<<

[ "apply", [ { "total": "4", "active": "2" } ] ] websocket

Page 36: Building Reactive, Realtime Apps Without Writing Javascript

View Transformation Protocol

Page 37: Building Reactive, Realtime Apps Without Writing Javascript

View Transformation ProtocolBusiness logic is written once, stays on the server.

Page 38: Building Reactive, Realtime Apps Without Writing Javascript

View Transformation ProtocolFaster since we render only the changes.

Page 39: Building Reactive, Realtime Apps Without Writing Javascript

View Transformation ProtocolThe real-time web as progressive enhancement.

Page 40: Building Reactive, Realtime Apps Without Writing Javascript

mutable

server> transformations> >

<<

state change

websocket

Page 41: Building Reactive, Realtime Apps Without Writing Javascript

Simple State Propagation

Page 42: Building Reactive, Realtime Apps Without Writing Javascript

Simple State PropagationAll changes in view state come from the server.

Page 43: Building Reactive, Realtime Apps Without Writing Javascript

Simple State PropagationServer contains the ultimate truth, client follows.

Page 44: Building Reactive, Realtime Apps Without Writing Javascript

Simple State PropagationPrioritizes user trust over performance.

Page 45: Building Reactive, Realtime Apps Without Writing Javascript

pakyow.org

Page 46: Building Reactive, Realtime Apps Without Writing Javascript

pakyow.org

metabahn.com

@bryanp

bryanp/realtime-talk