rendr: sf node.js meetup presentation april 30, 2013

43
Rendr: Bacbone.js on the client and serer Spike Brehm @spikebrehm SF Node.js Meetup April 30, 2013

Upload: spike-brehm

Post on 15-Jan-2015

2.246 views

Category:

Technology


3 download

DESCRIPTION

The presentation @spikebrehm gave for the SF Node.js meetup group April 30 2013. http://www.meetup.com/Node-js-Serverside-Javascripters-Club-SF/events/114998792/

TRANSCRIPT

Page 1: Rendr: SF Node.js Meetup presentation April 30, 2013

Rendr: Bacbone.js on the client and serer

Spike Brehm@spikebrehm

SF Node.js MeetupApril 30, 2013

Page 2: Rendr: SF Node.js Meetup presentation April 30, 2013

2008

Page 3: Rendr: SF Node.js Meetup presentation April 30, 2013
Page 4: Rendr: SF Node.js Meetup presentation April 30, 2013

2013

Page 5: Rendr: SF Node.js Meetup presentation April 30, 2013
Page 6: Rendr: SF Node.js Meetup presentation April 30, 2013

Exciting times in the world of web apps.

<your framework here>

Page 7: Rendr: SF Node.js Meetup presentation April 30, 2013

Client-side MVC

Client

Serer

Your app API

Page 8: Rendr: SF Node.js Meetup presentation April 30, 2013
Page 9: Rendr: SF Node.js Meetup presentation April 30, 2013

+

Page 10: Rendr: SF Node.js Meetup presentation April 30, 2013

Poor SEO; not crawlable

Performance hit to download and parse JS

Duplicated application logic

Context switching

Page 11: Rendr: SF Node.js Meetup presentation April 30, 2013

Client-side MVCDownloadskeleton

HTML

Fetch data from API

User sees content

Download JavaScript

Evaluate JavaScript

Exacerbated on mobile: high latency, low bandwidth

Page 12: Rendr: SF Node.js Meetup presentation April 30, 2013

It’s still a PITA to build fast, maintainable rich-client apps.

Page 13: Rendr: SF Node.js Meetup presentation April 30, 2013

Wat if our app could run on the client and the serer?

Page 14: Rendr: SF Node.js Meetup presentation April 30, 2013

Client + serer MVC

Client

Serer

Your app API

Page 15: Rendr: SF Node.js Meetup presentation April 30, 2013

Provides SEO

Initial pageload is drastically faster

Consolidated application logic

Page 16: Rendr: SF Node.js Meetup presentation April 30, 2013

Evaluate JavaScript

Client + serer MVCDownload

fullHTML

User sees content

Download JavaScript

Page 17: Rendr: SF Node.js Meetup presentation April 30, 2013

Has anyone already done this?

Page 18: Rendr: SF Node.js Meetup presentation April 30, 2013

Meteor: client/serer, but no serer-side rendering; owns data layer

Derby: client+serer rendering, but owns data layer

Mojito: client+serer rendering, but full stack, and... I.

Page 19: Rendr: SF Node.js Meetup presentation April 30, 2013

Okay... how hard can it be?

Page 20: Rendr: SF Node.js Meetup presentation April 30, 2013

+

Page 21: Rendr: SF Node.js Meetup presentation April 30, 2013

+

Page 22: Rendr: SF Node.js Meetup presentation April 30, 2013

+

Page 23: Rendr: SF Node.js Meetup presentation April 30, 2013

Rendr.

Page 24: Rendr: SF Node.js Meetup presentation April 30, 2013

JavaScript MVC on client & server

Backbone & Handlebars

BaseView, BaseModel, BaseCollection, BaseApp, ClientRouter, ServerRouter...

Express middleware

Minimal glue between client & server

Wat it is.

Page 25: Rendr: SF Node.js Meetup presentation April 30, 2013

Batteries-included web framework

Finished

Wat it ain’t.

Page 26: Rendr: SF Node.js Meetup presentation April 30, 2013

Write application logic agnostic to environment.

Library, not a framework.

Minimize if (server) {...} else {...}.

Hide complexity in library.

Talk to RESTful API.

No server-side DOM.

Simple Express middleware.

Design goals.

Page 27: Rendr: SF Node.js Meetup presentation April 30, 2013

Classes:

- BaseApp < Backbone.Model- BaseModel < Backbone.Model- BaseCollection < Backbone.Collection- BaseView < Backbone.View- AppView < BaseView

- ClientRouter < BaseRouter- ServerRouter < BaseRouter

- ModelStore < MemoryStore- CollectionStore < MemoryStore

- Fetcher

Page 28: Rendr: SF Node.js Meetup presentation April 30, 2013

|- client/|- shared/|- server/

Rendr directory structure

Sent to client}

Page 29: Rendr: SF Node.js Meetup presentation April 30, 2013

|- app/|- public/|- server/

App directory structure

Page 30: Rendr: SF Node.js Meetup presentation April 30, 2013

|- app/|--- collections/|--- controllers/|--- models/|--- templates/|--- views/|--- app.js|--- router.js|--- routes.js|- public/|- server/

App directory structure

Entire app dir gets sent to client}

Page 31: Rendr: SF Node.js Meetup presentation April 30, 2013

var User = require(‘app/models/user’);var BaseView = require(‘rendr/shared/base/view’);

CommonJS using Stitch

On the server:

On the client:var User = require(‘app/models/user’);var BaseView = require(‘rendr/shared/base/view’);

Page 32: Rendr: SF Node.js Meetup presentation April 30, 2013

Demo

github.com/airbnb/rendr-app-template

Page 33: Rendr: SF Node.js Meetup presentation April 30, 2013

Render lifecycle, serer.

Page 34: Rendr: SF Node.js Meetup presentation April 30, 2013

• On server startup, parse routes file and mount as Express routes

• GET /users/1337• Router matches "/users/:id" to "users#show" with

params = {"id": 1337}• Router finds controller:

require("app/controllers/users_controller")• Router executes show action with params = {"id": 1337}• The show action says to fetch User#1337 and use

UsersShowView view class• Router instantiates new UsersShowView with data• Router calls view.getHtml()• Hands HTML to Express, which decorates with layout

and serves response

Page 35: Rendr: SF Node.js Meetup presentation April 30, 2013

Render lifecycle, client.

Page 36: Rendr: SF Node.js Meetup presentation April 30, 2013

• On page load, Router parses routes file and mounts Backbone routes

• pushState /users/1337• Router matches "/users/:id" to "users#show" with

params = {"id": 1337}• Router finds controller:

require("app/controllers/users_controller")• Router executes show action with params = {"id": 1337}• The show action says to fetch User#1337 and use

UsersShowView view class• Router instantiates new UsersShowView with data• Router calls view.render()• Insert into DOM

Page 37: Rendr: SF Node.js Meetup presentation April 30, 2013

• On page load, Router parses routes file and mounts Backbone routes

• pushState /users/1337• Router matches "/users/:id" to "users#show" with

params = {"id": 1337}• Router finds controller:

require("app/controllers/users_controller")• Router executes show action with params = {"id": 1337}• The show action says to fetch User#1337 and use

UsersShowView view class• Router instantiates new UsersShowView with data• Router calls view.render()• Insert into DOM

Page 38: Rendr: SF Node.js Meetup presentation April 30, 2013

• On page load, Router parses routes file and mounts Backbone routes

• pushState /users/1337• Router matches "/users/:id" to "users#show" with

params = {"id": 1337}• Router finds controller:

require("app/controllers/users_controller")• Router executes show action with params = {"id": 1337}• The show action says to fetch User#1337 and use

UsersShowView view class• Router instantiates new UsersShowView with data• Router calls view.render()• Insert into DOM

Page 39: Rendr: SF Node.js Meetup presentation April 30, 2013

v0.4.0: CoffeeScript -> JavaScript

Almost done abstracting out Handlebars, supporting other templating languages

Example app with session handling

Recent developments.

Page 40: Rendr: SF Node.js Meetup presentation April 30, 2013

Share routing logic between client & server.

Lazy load views, templates, etc as needed.

Break down into smaller modules.

Much more...

TODO.

Page 41: Rendr: SF Node.js Meetup presentation April 30, 2013

Find the right set of primitives and abstractions for isomorphic JavaScript apps

Catalyze an isomorphic JavaScript movement within the community

Catalog the various approaches

Project goals.

Page 42: Rendr: SF Node.js Meetup presentation April 30, 2013

Hack with us.

github.com/airbnb/rendr

Page 43: Rendr: SF Node.js Meetup presentation April 30, 2013

@rendrjs@AirbnbNerds@spikebrehm

Thanks!