Как синхронизировать / организовать модули, используя requirejs и Backbone.Marionette

Я организовал файловую структуру моего веб-приложения, которое используетRequireJs а такжеBackbone.Marionette,в этом случае:

|- main.js
|- app.js
|- /subapp1
    |- subapp1.js
    |- subapp1.router.js
|- /subapp2
    |- subapp2.js
    |- subapp2.router.js
|- /colections
|- /views

Для загрузки модулей я использую requireJs.
Вот мой код, для каждого модуля я задаю несколько вопросов.

// main.js
define([
    'app',
    'subapp1/subapp1.router',
    'subapp2/subapp2.router'
], function (app) {
    "use strict";
    app.start();
});

Вопросы:
1) Правильно ли асинхронно загружать приложение и вложенные приложения, даже если вложенные приложения нуждаются в приложении?
2) для subApps правильно загрузить роутер, которому нужно приложение?

// app.js
/*global define*/
define([
    'backbone',
    'marionette',
    'models/user'
], function (Backbone, Marionette, UserModel) {
    "use strict";

    var App = new Marionette.Application();

    App.addRegions({
        header: '#header',
        sidebar: '#sidebar',
        mainColumn: '#main-column',
        rightColumn: '#right-column'
    });

    App.on("initialize:before", function () {
        this.userModel = new UserModel();
        this.userModel.fetch();
    });

    App.on("initialize:after", function () {
        Backbone.history.start();
    });

    return App;
});

Вопросы:
3) Так какsubApps может понадобиться немногоmodels Я решил загрузить его вapp.js, Так ли это правильно?

// subapp1/subapp1.js
/*global define*/
define([
    'app',
    'subapp1/views/sidebarView',
    'subapp1/views/headerView'
], function (app, SidebarView, HeaderView) {
    "use strict";

    app.addInitializer(function(){
        app.header.show(new HeaderView({userModel: app.userModel}));
        app.sidebar.show(new SidebarView({userModel: app.userModel}));
    });

});

Вопросы:
4) насчет этого модуля я не уверенapp.addInitializer.
Я не уверен, например, еслиapp.userModel будет доставлен, когда я выполнюapp.header.show. Should it be ok?

// subapp1/subapp1.router.js
/*global define*/
define([
    'marionette',
    'tasks/app'
], function (Marionette, app) {
    "use strict";
    var Router = Marionette.AppRouter.extend({

        appRoutes: {
            'tasks': 'tasks',
            'tasks/:id': 'taskDetail',
            '*defaults': 'tasks'
        }

    });

    return new Router({
        controller: app
    });
});

Вопрос:
5) нормально ли загружать сmain.js subapp1/subapp1.router вместоsubapp1/subapp1?

Ответы на вопрос(1)

Ваш ответ на вопрос