Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you structure your Backbone + RequireJS applications?

I've been struggling trying to strike the right balance between reusability and complexity when it comes to organizing my Backbone objects into AMD's (for medium- to large-scale applications)

(A) Should every Backbone object (models, views, etc) be in their own module? (B) Should related Backbone objects be in the same AMD module? (ie: PersonModel, PersonCollection, PersonView objects in the same module definition)

Option (A) seems to allow the most flexibility and reusability, but also the most complexity because of the (potentially) high number of files. While option (B) may make it easier to manage things, but less flexible and really difficult to unit test.

How is (or has) everyone else structured these things?

like image 271
Maurice Avatar asked Aug 27 '12 02:08

Maurice


People also ask

What is module in Backbone JS?

js respectively. The rest of your application code should be divided into modules that can live under their own modules directory. A module is an encapsulated group of structures (for the purposes of our post, Backbone structures) that work cohesively to provide a subset of functionality in your application.

What is $El in backbone?

It is so late to answer it but --> this.$el is a reference to the element in the context of jQuery, typically for use with things like .html() or .addClass() , etc. For example, if you had a div with id someDiv, and you set it to the el property of the Backbone view, the following statements are identical: this.$


2 Answers

I good thing about requirejs is that it allow you to abstract the physical files into structured namespaces. You can take the approach (A) and create each backbone class in their own file, then create a "namespace" module to glue all the related classes together.

// Suppose you have PersonView.js, PersonCollectionjs, PersonModel.js as modules
// create a Person module to function as namespace
define(["PersonModel", "PersonCollection", "PersonView"], function(model, collection, view) {
     return {
        Model: model,
        Collection: collection,
        View: view
     };  
});

This keep the modules organized in their own files and gives you some flexibility to write one module per class without requiring you to expose this organization for the rest of the application (I really don't like to have to write require("PersonView", "PersonModel" ... ) every time I need to use the person's objects, it's easier and cleaner for consumers to declare a dependency on a "namespace" instead of independent classes).

like image 162
Marcelo De Zen Avatar answered Oct 05 '22 22:10

Marcelo De Zen


For medium to large backbone projects I prefer to use requirejs with a separate module for every model, collection, and view. I also use the "Text" plugin for requirejs so I can load underscore templates just as I would any other module. This for me seems to be the sanest way to manage a large project and I have never really felt overwhelmed with the number of files I have.

+1 on using the requirejs optimizer when pushing your app to production. Works really well. http://requirejs.org/docs/optimization.html

like image 20
Harborhoffer Avatar answered Oct 05 '22 22:10

Harborhoffer