Лучшая практика для коллекции / модели позвоночника - PullRequest
0 голосов
/ 27 марта 2012

В моем приложении мы используем RequireJs и 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 голосов
/ 27 марта 2012

Вот как я структурирую свое приложение:

У меня есть путь javascript, который я сокращаю по требованию сервера при доступе клиента "/ javascript", поэтому у меня есть только одна строка сценарияmy 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 / pages / article.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 ('thing.js '), он отправляет запрос на сервер, что не соответствует скорости вашего приложения.

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

...