2012-03-27 7 views
0

В моем приложении мы используем RequireJs и Backboneколлекция Backbone/модель лучшей практики

Так типичная модель может выглядеть следующим образом в отдельном файле, так что мы можем попытаться модуляризуете это приложение лучше:

define([ 
'Require statements here if needed' 
], 
function() { 
var toDo = Backbone.Model.extend({ 

    // Model Service Url 
    url: function() { 
     var base = 'apps/dashboard/todo'; 
     return (this.isNew()) ? base : base + "/" + this.id; 
    }, 
    // Other functions here 

}); 

    return toDo; 
}); 

Прямо сейчас мы сохраняем каждую модель и коллекцию в собственном файле и возвращаем модель/коллекцию, как указано выше. Чем больше приложение становится сложнее, тем лучше держать файлы и соглашение об именах прямо. Я хотел бы объединить похожие коллекции/модели вместе в 1 файл и поддерживать модульность.

Что такое хороший способ достичь этого? Или я должен придерживаться их в отдельных файлах и получать лучшее соглашение об именах? Если да, что вы используете для своего соглашения об именах между аналогичными коллекциями/моделями?

ответ

0

Это способ, которым я структурировать мое заявление:

У меня есть яваскрипта путь, который я Минимизация по требованию на сервере, когда клиент доступа «/ JavaScript», поэтому у меня есть только одна строка сценария в моей index.html:

<script src='/javascript'></script> 

Моя структура каталогов/JavaScript заключается в следующем:

application.js 
router.js 
lib/ 
lib/jquery.js 
lib/underscore.js 
lib/backbone.js 
lib/require.js 
lib/other_libraries.js 
views/ 
views/navigation.js 
views/overlay.js 
views/content.js 
views/page 
views/page/constructor.js 
views/page/elements 
views/page/elements/constructor.js 
views/page/elements/table.js 
views/page/elements/form.js 
views/page/elements/actions.js 
collections/ 
collections/paginated.js 

Все эти файлы уменьшенная и загружены от клиента в первом запросе. Делая это, у меня есть много моего кода, уже загруженного в моем браузере, прежде чем приложение выполнит любые запросы с RequireJS.

На моем сервере у меня есть каталог, который также является общедоступным, но предназначен для динамической загрузки javascript и шаблонов (к нему обращается запрос от приложения в любой момент времени). Каталог выглядит следующим образом:

dynamic/ 
dynamic/javascript 
dynamic/javascript/pages 
dynamic/javascript/pages/articles.js 

dynamic/templates 
dynamic/templates/pages 
dynamic/templates/pages/articles.hb 
dynamic/templates/pages/items.hb 

Когда мои запросы к серверу «/templates/pages/articles.hb» сервер возвращает объект JSON, который выглядит следующим образом:

{ html : "<div class='page' id='articles'>blah blah blah</div>", javascript : "javascript/pages/articles.js" } 

И когда мой клиент получает приложение свойство "JavaScript" в возвращенном объекте JSON это вызывает RequireJS запросить

if (typeof json.javascript === string) { 
    require([ json.javascript ], function(constructor) { 
     window.app.page = new constructor(); 
    }); 
} 

в динамических/JavaScript/страниц/articles.js у меня есть что-то вроде:

define(function() { 
    var Model = Backbone.Model.extend({}); 

    // Collections.Paginated is in fact the Collection defined by /javascript/collection/paginated.js 
    // it is already loaded via the initial javascript loading 
    var Collection = Collections.Paginated.extend({ 
     url : '/api/articles' 
    }); 

    // Views.Page is in fact the View defined by /javascript/views/page/constructor.js 
    // it is also already loaded via the initial javascript loading 
    var articles = Views.Page.extend({ 

     collection : Collection, 

     initialize: function(options) { 
      this.collection = new Collection(); 
     }); 

    }); 

    return articles; 

}); 

Практически все. У меня минимальные запросы с RequireJS, потому что каждый раз, когда вы нажимаете require («something.js»), он делает запрос на сервер, что не подходит для скорости вашего приложения.

Таким образом, точный ответ на ваш вопрос (на мой взгляд) заключается в следующем: вы должны сделать как можно больше исходных загруженных файлов, но позже загруженные файлы с requireJS должны быть как можно меньше, чтобы сохранить трафик.