Architecture 木偶和;“子应用程序”;

Architecture 木偶和;“子应用程序”;,architecture,marionette,Architecture,Marionette,我正在开发一个具有多个不同功能区域的木偶TeJS web应用程序。例如,一个是“仪表板”,另一个是“组”,第三个是“事件”,每个事件都有自己的特定路线 例如 /仪表板#显示 /组#列表 /小组#秀/123 /活动#v/9876/与会者 等等 在过去,我使用木偶模块将主应用程序对象分割成可以启动和停止的部分。当正在开发的应用程序是100%单页应用程序时,这非常有用,这意味着我可以从服务器加载MVC路由(例如),并启动适当的木偶组件将启动一组不同的木偶组件 在其当前状态下(在撰写本文时为2.4.

我正在开发一个具有多个不同功能区域的木偶TeJS web应用程序。例如,一个是“仪表板”,另一个是“组”,第三个是“事件”,每个事件都有自己的特定路线

例如

  • /仪表板#显示
  • /组#列表
  • /小组#秀/123
  • /活动#v/9876/与会者
等等

在过去,我使用木偶模块将主应用程序对象分割成可以启动和停止的部分。当正在开发的应用程序是100%单页应用程序时,这非常有用,这意味着我可以从服务器加载MVC路由(例如
),并启动适当的木偶组件<代码>将启动一组不同的木偶组件

在其当前状态下(在撰写本文时为2.4.2),Marionette不推荐使用模块组件,而支持其他模块加载机制。在上面给出的示例中,是否仍然可以使用不同的体系结构方法将木偶应用程序分割为独立触发的部分?在我看来,我可以:

  • 创建多个木偶.Application()对象,并彼此独立地加载它们
  • 利用Marionette.Object()并以某种方式将Marionette.Application()对象扩展到子组件中
  • 创建一个“主”路由器,用于侦听根URL(事件/、仪表板、组),然后创建“子路由器”,扩展此路由器以提供更多功能

  • 我将使用CommonJS模块采用以下方法。这些子应用程序或模块不能启动或停止,但它们提供了良好的分离

    app.js

    var Marionette = require('backbone.marionette');
    var _ = require('underscore');
    
    module.exports = Marionette.Application.extend({
        initialize: function() {
            this._modules = [];
        },
    
        addModule: function(name, klass ,options) {
            var module = new klass(options);
    
            this._modules[name] = module;
        }
    });
    
    var Marionette = require('backbone.marionette');
    
    module.exports = Marionette.LayoutView.extend({
        el: '#app',
    
        regions: {
            header: '[data-region="header"]',
            main: '[data-region="main"]'
        }
    });
    
    var Marionette = require('backbone.marionette');
    
    var Router = require('./router');
    
    var Group = require('./model/group');
    var GroupCollection = require('./model/group_collection');
    
    var GroupListView = require('./list/collection_view');
    var GroupDetailView = require('./detail/group_view');
    
    module.exports = Marionette.Object.extend({
        initialize: function(options) {
            this.container = options.container;
    
            this.router = new Router({
                controller: this
            });
    
            this.groups = new GroupCollection();
        },
    
        groupList: function() {
            var groupListView = new GroupListView({
                collection: this.groups
            });
    
            this.groups.fetch();
    
            this.container.show(groupListView);
        },
    
        groupDetail: function(id) {
            var groupDetailView = new GroupDetailView({
                model: this.groups.findWhere({id: id})
            });
    
            this.container.show(groupDetailView);
        }
    });
    
    var Marionette = require('backbone.marionette');
    
    module.exports = Marionette.AppRouter.extend({
        appRoutes: {
            'groups': 'groupList',
            'groups/:id': 'groupDetail'
        }
    });
    
    var Backbone = require('backbone');
    
    var Application = require('./app');
    var MainLayout = require('./layout');
    
    var HeaderApp = require('./header');
    var GroupsApp = require('./groups');
    
    var app = new Application();
    var layout = new MainLayout();
    
    app.addModule('header', HeaderApp, {
        container: layout.getRegion('header')
    });
    
    app.addModule('groups', GroupsApp, {
        container: layout.getRegion('main')
    });
    
    app.start();
    
    Backbone.history.start({
        pushState: true
    });
    
    layout.js

    var Marionette = require('backbone.marionette');
    var _ = require('underscore');
    
    module.exports = Marionette.Application.extend({
        initialize: function() {
            this._modules = [];
        },
    
        addModule: function(name, klass ,options) {
            var module = new klass(options);
    
            this._modules[name] = module;
        }
    });
    
    var Marionette = require('backbone.marionette');
    
    module.exports = Marionette.LayoutView.extend({
        el: '#app',
    
        regions: {
            header: '[data-region="header"]',
            main: '[data-region="main"]'
        }
    });
    
    var Marionette = require('backbone.marionette');
    
    var Router = require('./router');
    
    var Group = require('./model/group');
    var GroupCollection = require('./model/group_collection');
    
    var GroupListView = require('./list/collection_view');
    var GroupDetailView = require('./detail/group_view');
    
    module.exports = Marionette.Object.extend({
        initialize: function(options) {
            this.container = options.container;
    
            this.router = new Router({
                controller: this
            });
    
            this.groups = new GroupCollection();
        },
    
        groupList: function() {
            var groupListView = new GroupListView({
                collection: this.groups
            });
    
            this.groups.fetch();
    
            this.container.show(groupListView);
        },
    
        groupDetail: function(id) {
            var groupDetailView = new GroupDetailView({
                model: this.groups.findWhere({id: id})
            });
    
            this.container.show(groupDetailView);
        }
    });
    
    var Marionette = require('backbone.marionette');
    
    module.exports = Marionette.AppRouter.extend({
        appRoutes: {
            'groups': 'groupList',
            'groups/:id': 'groupDetail'
        }
    });
    
    var Backbone = require('backbone');
    
    var Application = require('./app');
    var MainLayout = require('./layout');
    
    var HeaderApp = require('./header');
    var GroupsApp = require('./groups');
    
    var app = new Application();
    var layout = new MainLayout();
    
    app.addModule('header', HeaderApp, {
        container: layout.getRegion('header')
    });
    
    app.addModule('groups', GroupsApp, {
        container: layout.getRegion('main')
    });
    
    app.start();
    
    Backbone.history.start({
        pushState: true
    });
    
    groups/index.js

    var Marionette = require('backbone.marionette');
    var _ = require('underscore');
    
    module.exports = Marionette.Application.extend({
        initialize: function() {
            this._modules = [];
        },
    
        addModule: function(name, klass ,options) {
            var module = new klass(options);
    
            this._modules[name] = module;
        }
    });
    
    var Marionette = require('backbone.marionette');
    
    module.exports = Marionette.LayoutView.extend({
        el: '#app',
    
        regions: {
            header: '[data-region="header"]',
            main: '[data-region="main"]'
        }
    });
    
    var Marionette = require('backbone.marionette');
    
    var Router = require('./router');
    
    var Group = require('./model/group');
    var GroupCollection = require('./model/group_collection');
    
    var GroupListView = require('./list/collection_view');
    var GroupDetailView = require('./detail/group_view');
    
    module.exports = Marionette.Object.extend({
        initialize: function(options) {
            this.container = options.container;
    
            this.router = new Router({
                controller: this
            });
    
            this.groups = new GroupCollection();
        },
    
        groupList: function() {
            var groupListView = new GroupListView({
                collection: this.groups
            });
    
            this.groups.fetch();
    
            this.container.show(groupListView);
        },
    
        groupDetail: function(id) {
            var groupDetailView = new GroupDetailView({
                model: this.groups.findWhere({id: id})
            });
    
            this.container.show(groupDetailView);
        }
    });
    
    var Marionette = require('backbone.marionette');
    
    module.exports = Marionette.AppRouter.extend({
        appRoutes: {
            'groups': 'groupList',
            'groups/:id': 'groupDetail'
        }
    });
    
    var Backbone = require('backbone');
    
    var Application = require('./app');
    var MainLayout = require('./layout');
    
    var HeaderApp = require('./header');
    var GroupsApp = require('./groups');
    
    var app = new Application();
    var layout = new MainLayout();
    
    app.addModule('header', HeaderApp, {
        container: layout.getRegion('header')
    });
    
    app.addModule('groups', GroupsApp, {
        container: layout.getRegion('main')
    });
    
    app.start();
    
    Backbone.history.start({
        pushState: true
    });
    
    groups/router.js

    var Marionette = require('backbone.marionette');
    var _ = require('underscore');
    
    module.exports = Marionette.Application.extend({
        initialize: function() {
            this._modules = [];
        },
    
        addModule: function(name, klass ,options) {
            var module = new klass(options);
    
            this._modules[name] = module;
        }
    });
    
    var Marionette = require('backbone.marionette');
    
    module.exports = Marionette.LayoutView.extend({
        el: '#app',
    
        regions: {
            header: '[data-region="header"]',
            main: '[data-region="main"]'
        }
    });
    
    var Marionette = require('backbone.marionette');
    
    var Router = require('./router');
    
    var Group = require('./model/group');
    var GroupCollection = require('./model/group_collection');
    
    var GroupListView = require('./list/collection_view');
    var GroupDetailView = require('./detail/group_view');
    
    module.exports = Marionette.Object.extend({
        initialize: function(options) {
            this.container = options.container;
    
            this.router = new Router({
                controller: this
            });
    
            this.groups = new GroupCollection();
        },
    
        groupList: function() {
            var groupListView = new GroupListView({
                collection: this.groups
            });
    
            this.groups.fetch();
    
            this.container.show(groupListView);
        },
    
        groupDetail: function(id) {
            var groupDetailView = new GroupDetailView({
                model: this.groups.findWhere({id: id})
            });
    
            this.container.show(groupDetailView);
        }
    });
    
    var Marionette = require('backbone.marionette');
    
    module.exports = Marionette.AppRouter.extend({
        appRoutes: {
            'groups': 'groupList',
            'groups/:id': 'groupDetail'
        }
    });
    
    var Backbone = require('backbone');
    
    var Application = require('./app');
    var MainLayout = require('./layout');
    
    var HeaderApp = require('./header');
    var GroupsApp = require('./groups');
    
    var app = new Application();
    var layout = new MainLayout();
    
    app.addModule('header', HeaderApp, {
        container: layout.getRegion('header')
    });
    
    app.addModule('groups', GroupsApp, {
        container: layout.getRegion('main')
    });
    
    app.start();
    
    Backbone.history.start({
        pushState: true
    });
    
    main.js

    var Marionette = require('backbone.marionette');
    var _ = require('underscore');
    
    module.exports = Marionette.Application.extend({
        initialize: function() {
            this._modules = [];
        },
    
        addModule: function(name, klass ,options) {
            var module = new klass(options);
    
            this._modules[name] = module;
        }
    });
    
    var Marionette = require('backbone.marionette');
    
    module.exports = Marionette.LayoutView.extend({
        el: '#app',
    
        regions: {
            header: '[data-region="header"]',
            main: '[data-region="main"]'
        }
    });
    
    var Marionette = require('backbone.marionette');
    
    var Router = require('./router');
    
    var Group = require('./model/group');
    var GroupCollection = require('./model/group_collection');
    
    var GroupListView = require('./list/collection_view');
    var GroupDetailView = require('./detail/group_view');
    
    module.exports = Marionette.Object.extend({
        initialize: function(options) {
            this.container = options.container;
    
            this.router = new Router({
                controller: this
            });
    
            this.groups = new GroupCollection();
        },
    
        groupList: function() {
            var groupListView = new GroupListView({
                collection: this.groups
            });
    
            this.groups.fetch();
    
            this.container.show(groupListView);
        },
    
        groupDetail: function(id) {
            var groupDetailView = new GroupDetailView({
                model: this.groups.findWhere({id: id})
            });
    
            this.container.show(groupDetailView);
        }
    });
    
    var Marionette = require('backbone.marionette');
    
    module.exports = Marionette.AppRouter.extend({
        appRoutes: {
            'groups': 'groupList',
            'groups/:id': 'groupDetail'
        }
    });
    
    var Backbone = require('backbone');
    
    var Application = require('./app');
    var MainLayout = require('./layout');
    
    var HeaderApp = require('./header');
    var GroupsApp = require('./groups');
    
    var app = new Application();
    var layout = new MainLayout();
    
    app.addModule('header', HeaderApp, {
        container: layout.getRegion('header')
    });
    
    app.addModule('groups', GroupsApp, {
        container: layout.getRegion('main')
    });
    
    app.start();
    
    Backbone.history.start({
        pushState: true
    });
    
    我省略了这个示例中的模型、集合和视图,但我希望您能理解要点

    您的应用程序是一个扩展的木偶应用程序,您可以在其中注册模块

    每个模块都位于自己的文件夹中,其中包含一个index.js文件,作为模块的入口点。在此文件中,您将构建一个木偶对象,用作模块的控制器

    每个模块都有自己的路由器,index.js文件中的木偶对象作为其控制器

    根据需要添加模型、集合、视图和模板。对于模块之间的通信,您可以使用Backbone.Radio

    最后,在main.js中引导应用程序、主布局和模块,并使用browserify或webpack进行构建

    免责声明


    这种体系结构不是我自己发明的,但目前我不记得最初的来源。

    谢谢,这是一种有趣的方式。我在我的子应用程序中使用了一个派生的木偶对象。