Вот как я структурирую свое приложение:
У меня есть путь 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 должны быть как можно меньше для экономии трафика.