Building SPA’s (Single Page App) with Backbone.js

76
Backbone js Richard Griffin Twitter RichGee Email [email protected]

description

More info on http://www.techdays.be

Transcript of Building SPA’s (Single Page App) with Backbone.js

Page 1: Building SPA’s (Single Page App) with Backbone.js

Backbone js

Richard GriffinTwitter RichGee Email [email protected]

Page 2: Building SPA’s (Single Page App) with Backbone.js
Page 3: Building SPA’s (Single Page App) with Backbone.js
Page 4: Building SPA’s (Single Page App) with Backbone.js

Where to start

• Consumerisation of technology has had a large impact on how we build apps

• Affordable portable devices means that consumers care more about mobility

• Customers desire their product to be available on a wide range of devices for consumers

Page 5: Building SPA’s (Single Page App) with Backbone.js

Impacts on development

• Multi tenanted development teams

• HTML stack / .net stack / iOS stack / Java stack

• Management of source code, testing, maintainability, consistency

Page 6: Building SPA’s (Single Page App) with Backbone.js

Snooze you loose

• Building x-platform x-device app

• Targeting wp7 and windows 7 tablet

• Performance problems with .net client side implementation

• Rebuilt in html and js

Page 7: Building SPA’s (Single Page App) with Backbone.js

A time for change

• Build apps that meet these needs

• Touch based

• Mouse based

• Consumable on anything anywhere

• Development costs

Page 8: Building SPA’s (Single Page App) with Backbone.js

Something's never change

• Software craftsmanship

• Still face the same problems

• Changing implementation language does not make it easier

• Actually some of the problems get bigger…much bigger!

• Browser inconsistency

Page 9: Building SPA’s (Single Page App) with Backbone.js

Something's do change

Improvements in

• Browser performance• HTML• CSS• ECMA Script• Frameworks• Development tools

Page 10: Building SPA’s (Single Page App) with Backbone.js

And so the journey begins

Client side Architecture

Async communication mechanism with server MV* framework Local storage mechanism Responsive web pages View management Data management UI interactions to enhance the experience

Page 11: Building SPA’s (Single Page App) with Backbone.js

Client side Architecture

Async communication mechanism with server MV* framework Local storage mechanism Responsive web pages View management Data management UI interactions to enhance the experience

Page 12: Building SPA’s (Single Page App) with Backbone.js

Async Communication

• Endpoints are REST based• Endpoints support JSON and Xml – JSON is preferred• jQuery $.ajax(query options)

$.ajax({ type: "POST", url: "some.php", data: { name: "John", location: “Birmingham" }}).done(function( msg ) { alert( "Data Saved: " + msg );});

Page 13: Building SPA’s (Single Page App) with Backbone.js

Client side Architecture

Async communication mechanism with server MV* framework Local storage mechanism Responsive web pages View management Data management UI interactions to enhance the experience

Page 14: Building SPA’s (Single Page App) with Backbone.js

MV* framework

• Extensive range of JS frameworks that support MVC, MVP and MVVM

• YAFS! – each week there seems to be a new one

• IMHO there should be more focus on scaffolding tools

• Confused! Try this out! http://todomvc.com/

Page 15: Building SPA’s (Single Page App) with Backbone.js

MV* framework – KO js

I want something that will make it easy to build complex dynamic UIs with a clean underlying data model and declarative bindings. It should automatically update my UI on model changes using two-way bindings and support dependency tracking of model data. I should be able to use it with whatever framework I prefer, or even an existing app. It should also come with templating built-in and be easily extensible.

Resource: Addy Osmani

Page 16: Building SPA’s (Single Page App) with Backbone.js

MV* framework – backbone js

I want something flexible which offers a minimalist solution to separating concerns in my application. It should support a persistence layer and RESTful sync, models, views (with controllers), event-driven communication, templating and routing. It should be imperative, allowing one to update the View when a model changes. I’d like some decisions about the architecture left up to me. Ideally, many large companies have used the solution to build non-trivial applications

Resource: Addy Osmani

Page 17: Building SPA’s (Single Page App) with Backbone.js

Client side Architecture

Async communication mechanism with server MV* framework Local storage mechanism Responsive web pages View management Data management UI interactions to enhance the experience

Page 18: Building SPA’s (Single Page App) with Backbone.js

Local Storage - amplify

• Amplifyjs http://amplifyjs.com/

• Simple to use as everything is all done via key value pairs

• Amplify works out what browser your app is running in and makes a choice which local storage option to use

Local Storage if available (latest browsers) Cookie in older browsers

Page 19: Building SPA’s (Single Page App) with Backbone.js

Client side Architecture

Async communication mechanism with server MV* framework Local storage mechanism Responsive web pages View management Data management UI interactions to enhance the experience

Page 20: Building SPA’s (Single Page App) with Backbone.js

Responsive layout

• As I eluded earlier supporting x-devices, x-browser means that we need to up our game

• We want to be pragmatic about it and thus avoid tumbling/cascading conditional blocks of code to handle the different browser

Page 21: Building SPA’s (Single Page App) with Backbone.js

Responsive layout - bootstrap

• Bootstrap http://twitter.github.com/bootstrap/

• Bootstrap provides everything that we need to build responsive web pages

• Provides a 12-column responsive grid

• Builds on CSS media queries to provide responsive functionality

• Uses LESS to help with maintainability of CSS from a Developer prospective

Page 22: Building SPA’s (Single Page App) with Backbone.js

Client side Architecture

Async communication mechanism with server MV* framework Local storage mechanism Responsive web pages View management Data management UI interactions to enhance the experience

Page 23: Building SPA’s (Single Page App) with Backbone.js

View Layout Management

• Layout Manager https://github.com/tbranyen/backbone.layoutmanager

• When building a complex UI there is always the issue of how we manage our views and also our sub-views

• Reusable views

• To be pragmatic we want to insure that we adhere to the DRY principle

• Backbone does not provide a formalised way for how we do templatingttps://github.com/tbranyen/backbone.layoutmanager

Page 24: Building SPA’s (Single Page App) with Backbone.js

Single Page App Design

• Taking Ajax to the next level

• Provide a UX which is closer to an app or desktop app UX

• Our application UX all happens in a single page and is not spread across multiple pages

• Don’t think about a web site think about an app a web app experience

Page 25: Building SPA’s (Single Page App) with Backbone.js

Ajax everything…

• Dynamically loading templates

• Html templates are defined on the server and loaded async when required

• Html templates are associated with the backbone view

• Layout manager provides a strategy for managing views

Page 26: Building SPA’s (Single Page App) with Backbone.js

Everything ajax…

• Asynchronous Module Definitions

• Use Requirejs http://requirejs.org/• • Provides a mechanism for include/import/require• Ability to load nested dependencies

• Ease of use for developer but then backed by an optimisation tool that helps with deployment

Page 27: Building SPA’s (Single Page App) with Backbone.js

Client side Architecture

Async communication mechanism with server MV* framework Local storage mechanism Responsive web pages View management Data management UI interactions to enhance the experience

Page 28: Building SPA’s (Single Page App) with Backbone.js

Data Management

• Backbone paginator https://github.com/addyosmani/backbone.paginator

• Pagination of data

• Client side pagination

• Server side pagination

https://github.com/addyosmani/backbone.paginator

Page 29: Building SPA’s (Single Page App) with Backbone.js

Client side Architecture

Async communication mechanism with server MV* framework Local storage mechanism Responsive web pages View management Data management UI interactions to enhance the experience

Page 30: Building SPA’s (Single Page App) with Backbone.js

UI Interactions

• jQuery does everything that you need and more

• jQuery and Backbone play nice together

• jQuery Mobile

Page 31: Building SPA’s (Single Page App) with Backbone.js

Client side Architecture

Bucket list

Async communication mechanism with server MV* framework Local storage mechanism Responsive web pages View management Data management UI interactions to enhance the experience

Page 32: Building SPA’s (Single Page App) with Backbone.js

Tool up

• BDD / TDD

• Grunt

• Sublime Text Editor

• Development server

Page 33: Building SPA’s (Single Page App) with Backbone.js

Tool up

• BDD / TDD

• Grunt

• Sublime Text Editor

• Development server

Page 34: Building SPA’s (Single Page App) with Backbone.js

Jasmine

• Jasmine http://pivotal.github.com/jasmine/

• Does not depend on any other JS framework

• Does not require a DOM

• Given, When, Then syntax

• Works on windows 8!

Client side Architecture

Page 35: Building SPA’s (Single Page App) with Backbone.js

Tool up

• BDD / TDD

• Grunt

• Sublime Text Editor

• Development server

Page 36: Building SPA’s (Single Page App) with Backbone.js

Grunt

• grunt http://gruntjs.com/

• Requires Node – install using npm grunt

• Provides the ability for developers to have a pseudo compilation mechanism

• MSBuild analogy where by developers can create a script that performs a series of actions

Page 37: Building SPA’s (Single Page App) with Backbone.js

Grunt

Build Script• Run tests

• JSHint code• http://www.jshint.com/

• Uglification / Compression of code• https://github.com/mishoo/UglifyJS

• Bundling of code ready for deployment

Page 38: Building SPA’s (Single Page App) with Backbone.js

Tool up

• BDD / TDD

• Grunt

• Sublime Text Editor

• Development server

Page 39: Building SPA’s (Single Page App) with Backbone.js

Sublime text editor

• Nuget style package management console

• Support for backbone snippets

• Support for jQuery snippets

• Supports grunt build files

• Supports jshint configuration

Page 40: Building SPA’s (Single Page App) with Backbone.js

Tool up

• BDD / TDD

• Grunt

• Sublime Text Editor

• Development server

Page 41: Building SPA’s (Single Page App) with Backbone.js

Web Matrix

• Local Server for running web apps

• Awesome for deployment to Azure

• Has its own editor

Page 42: Building SPA’s (Single Page App) with Backbone.js

Backbone

EventsModelsCollectionsViewsRouters

http://backbonejs.org/

router

view

collection model

events

events

Page 43: Building SPA’s (Single Page App) with Backbone.js

Router

• Provides methods for routing client-side pages, and connecting them to actions and events

• Until recently, hash fragments (#page) were used to provide these permalinks, but with the arrival of the History API, it's now possible to use standard URLs (/page)

• For browsers which don't yet support the History API, the Router handles graceful fallback and transparent translation to the fragment version of the URL

Page 44: Building SPA’s (Single Page App) with Backbone.js

Router

var Workspace = Backbone.Router.extend({ routes: { "help": "help", // #help "search/:query": "search", // #search/kiwis "search/:query/p:page": "search" // #search/kiwis/p7 },

help: function() {},

search: function(query, page) {}});

Page 45: Building SPA’s (Single Page App) with Backbone.js

Events

• Events is a module that can be mixed into any object• Provides the ability to bind and trigger custom named events• Normally used in the view so that it can update when our

model changes

this.model.on("destroy", this.close, this);

this.model.on(“reset”, this.addAll, this);

this.model.on(“add”, this.addOne, this);

Page 46: Building SPA’s (Single Page App) with Backbone.js

Models

• Models are at the heart of any js app

• Models contain interactive data as well as a large part of the logic surrounding it

• Models are databound to the html

• Models can also be extended to help contain common functionality

• By convention the initialise function gets called with the arguments passed into the constructor

Page 47: Building SPA’s (Single Page App) with Backbone.js

Collections

• Collections are ordered sets of models

• Bind “change” events to be notified when any model in the collection has been modified

• Common change events to listen for Add Remove

Page 48: Building SPA’s (Single Page App) with Backbone.js

Collections

Fetch()

• Call to populate collection with data

Page 49: Building SPA’s (Single Page App) with Backbone.js

Collections

Sync(crud method, model, options callback)

• CRUD – Create, Read, Update or Delete

• Model – Model to be operated on

• Options – callbacks success and error

Page 50: Building SPA’s (Single Page App) with Backbone.js

Collections

CRUD to REST

• Create -> POST /collection

• Read -> GET /collection[id]

• Update -> PUT /collection/id

• Delete -> DELETE /collection/id

Page 51: Building SPA’s (Single Page App) with Backbone.js

Views

• More convention than they are code

• They don't determine anything about your HTML or CSS for you, and can be used with any JavaScript templating library

• Organize your interface into logical views, backed by models, each of which can be updated independently when the model changes, without having to redraw the page

• Bind your view's render function to the model's "change" event and now everywhere that model data is displayed in the UI, it is always immediately up to date

Page 52: Building SPA’s (Single Page App) with Backbone.js

Backbone

router

view

collection model

events

events

Page 53: Building SPA’s (Single Page App) with Backbone.js

View model

view

collection model

events

events

MVVM

Page 54: Building SPA’s (Single Page App) with Backbone.js

Underscore

• http://underscorejs.org/

• 80 odd helper functions

• Works seamlessly with jQuery and Backbone

• Provides the ability to shape data similar to how we would use linq or lambda in .net

• Provides the ability to add script into our html templates

Page 55: Building SPA’s (Single Page App) with Backbone.js

Underscore

Shaping data

• each

• map

• where

• sortBy, groupBy

Page 56: Building SPA’s (Single Page App) with Backbone.js

Underscore

Templating

Works in the same way as other templating frameworks

<td> <%= typeof(model.get("foo")) !== 'undefined' ? model.get("foo").toPrecision(4) : '' %></td>

Page 57: Building SPA’s (Single Page App) with Backbone.js

Putting it all together

Page 58: Building SPA’s (Single Page App) with Backbone.js

router

domview

collection model

events

events

events

web reques

t

layout manager

pagination

local storage

Page 59: Building SPA’s (Single Page App) with Backbone.js
Page 60: Building SPA’s (Single Page App) with Backbone.js

Web Request

Initialise App Router Collection

ViewLayout Manager

Render PageFetch data

Sync On success Populate Collection

Notify UI that data changed

Render View

Page 61: Building SPA’s (Single Page App) with Backbone.js

Web app

• News reader – uses Guardian API

• Router / Models / Views

• Pagination

• Local Storage

• View Management

Page 62: Building SPA’s (Single Page App) with Backbone.js

Main layout

Main.html

Section List View

section/list.html

Section List Item View

section/item.html

Section Header View

section/header.html

Story List View

story/list.html

Story List Item Viewstory/

item.html

Page 63: Building SPA’s (Single Page App) with Backbone.js

Section List View

section/list.html

Story List View

story/list.htmlStory List Item Viewstory/

item.html

<ul class="nav"></ul>

<a href="<%= model.get("id") %>"><%= typeof(model.get("webTitle")) !== 'undefined' ?

model.get("webTitle") : '' %></a>

<span><%= typeof(model.get("webTitle")) !== 'undefined' ?

model.get("webTitle") : '' %></span>

Section List Item View

section/item.html

<div class="nav-collapse sectionListView"></div><div id="sectionHeaderView" class="hero-unit sectionHeaderView"></div><div id="storyListView" class="storyListView"></div> Main

layoutMain.html

Section Header View

section/header.html

Page 64: Building SPA’s (Single Page App) with Backbone.js

Section List View

section/list.html

Section List Item View

section/item.html

<div class="nav-collapse sectionListView"></div><div id="sectionHeaderView" class="hero-unit sectionHeaderView"></div><div id="storyView" class="storyView"></div> Story

layoutstory.html

Section Header View

section/header.html <p><img width="20%" src="<%= model.get('fields').thumbnail %>" type=""

media=""></p><h1><%= model.get("fields").headline %></h1> <div style="columns:100px 2; -webkit-columns:100px 2; -moz-columns:100px 2;"> <p><%= model.get("fields").body %></> </div>

Story List View

story/list.html

Page 65: Building SPA’s (Single Page App) with Backbone.js
Page 66: Building SPA’s (Single Page App) with Backbone.js

Winjs

• Provides access to winrt interfaces via javascript

• Uses the chakra engine same engine used in IE10

• Introduces some rather desirable programming concepts such as namespaces, data binding, background tasks and more

• Builds on ECMA script 5 such as promises

Page 67: Building SPA’s (Single Page App) with Backbone.js

Winjs and backbone

• Use backbone for all our data

• Use winjs as our UI Framework

• Ability to integrate and weave the backbone types into winjs binding list types

• Ability to abstract backbone implementation behind more complex winjs implementations

Page 68: Building SPA’s (Single Page App) with Backbone.js

Putting it all together

Page 69: Building SPA’s (Single Page App) with Backbone.js

navigation

domview

collection model

events

events

events

appload

binding list

pagination

local storage

events

Page 70: Building SPA’s (Single Page App) with Backbone.js
Page 71: Building SPA’s (Single Page App) with Backbone.js

App Load Initialise App Navigation Collection

ViewProcess Fragment

Render FragmentFetch data

Sync On success Populate Collection

Convert to Binding List

Notify UI that data changed

Render Fragment

Page 72: Building SPA’s (Single Page App) with Backbone.js

Winjs app

• Reader port to windows 8

• Changes to note

Change in User Experience impacts how and what data needs to be displayed

Removal views (css, html and js) and replaced with winjs ui controls Replacing jQuery $Ajax with winjs xhr Replacing router with winjs navigation Extending data list source to be used in conjunction with Backbone

collection

Page 73: Building SPA’s (Single Page App) with Backbone.js
Page 74: Building SPA’s (Single Page App) with Backbone.js

Looking back

• Overview of some useful js frameworks that allow us to create maintainable client side apps in js/html/css

• Building on our experiences with xaml and .net, databinding, composite UI and separation of view model controller designs

• Ability to reuse underpinning modules in browser and win8

Page 75: Building SPA’s (Single Page App) with Backbone.js

Looking forwards

• Improvements in the frameworks and plugins

• Improvements in scaffolding for building apps

• Better tools to help manage larger client side apps

• Better support for winjs binding list

• Better support for jQuery

Page 76: Building SPA’s (Single Page App) with Backbone.js