jeanphix

Building frontend web applications using backbone.js & brunch.io

02 Feb 2012

Last sunday I decided to grow up my javascript skills by playing with modern and cool libraries.

I planned to test:

First of all, I tried spine.js that is a frontend framework that provides:

But I trashed it cause of hard jQuery dependency (<troll>I hate jQuery</troll>).

So, next I discovered brunch.io that is a backbone.js projects bootstrapper that does quite the same things as spine.js with the possibility to replace jQuery by zepto.js.

The stack here is composed of:

Test project

My favorite RESTful API to test new client is github’s one, cause it has been well designed and CORS requests are allowed.

If you planned to write a client side application on top of that kind of library, make sure the service is consumable via XHR, otherwise you’ll have to make a server side “reverse proxy application”, and then doing the job client side will make no sence (IMHO).

Lets start the project:

$ npm install -g brunch
$ brunch new issues
$ cd issues

Now directory tree and configs has been created with default assets.

$ brunch watch --server

runs an express.js instance that delivers compiled files (just open http://localhost:3000 in your favorite browser).

Backbone main concepts

Routers

Backbone routers is the navigation layer that links UI actions to the views.

Sample router:

class exports.MainRouter extends Backbone.Router
  routes :
    ':username/:repository': 'repository'
    '': 'repository'

  repository: (username, repository) ->
    app.repositoryView.render(username, repository).el

Views

Views are controller classes that deal with your business models and the UI. Each view as an `el` member that is the DOM element where rendering will be displayed.

Starting a view via brunch.io:

$ brunch generate view issue_list_view

Then with a piece of logic:

{IssueView} = require 'views/issue_view'
{Issues} = require 'collections/issues'

issueListTemplate = require './templates/issue_list'


class exports.IssueListView extends Backbone.View
  el: 'section:first'

  initialize: (repository) ->
    @issues = new Issues
    @issues.url = repository.get 'url'
    @issues.url+= '/issues'
    @issues.bind 'reset', @addAll

  render: =>
    issues = @issues.fetch()
    @$(@el).html issueListTemplate
    this

  addOne: (issue) =>
    view = new IssueView model: issue
    $(@el).find('#issues tbody:first').append view.render().el

  addAll: =>
    @issues.each @addOne

Models

A model is a business entity, that is linked to an HTTP ressource using the `url` attribute.

May be persisted and fetched from local storage to.

$ brunch generate model issue

Sample:

class exports.Issue extends Backbone.Model
  ul: '/path/to/issue/ressource'

  defaults:
    title: 'New issue'
    body: null

Collections

Collection is a set of model objects, as models, they may be linked to an HTTP ressource.

That’s all for basics. For now, my application only lists issues for a given project. I’ll maybe add more features (like create / update / delete issues) later. You’ll find a live demo here.

See you.