require.js + Backbone.js的:如何构建有一个初始化函数模块?(require.

2019-07-30 17:07发布

我有三个页面(这是单页界面)的应用程序。 该网页有相似但不完全相同的功能。

所以,我想有JavaScript的模块,提供了常用的功能。 然后,每个页面可以定制/覆盖的常用功能的部件。

我使用Backbone.js的,所以我做的是:

  1. 加载包含常见型号的文件,意见,类别等
  2. 该自主的负载应用程序特定的文件/改写步骤1的部件
  3. 调用instanciates所有必要的模型/视图/集合的init()函数

目前,我存储我的模块在一个类似的模块容器: https://stackoverflow.com/a/9426071每个模块都有由我的主要init()函数中执行一个可选的init()函数。

例:

  1. 我有一个名为results.js文件。 它定义了常见的型号/系列/搜索结果的视图。 在它的init()函数一切都实例化,但这个功能尚未叫做:

     var resultView = new ResultView() 
  2. 然后我包括myApp.js,并在视图的部分将被覆盖。

  3. 主要的init()函数调用results.js的init(),它instanciates新的视图。 一切正常美观,平整,干燥。

现在我想切换到require.js,而不是我自己的模块容器,并想知道如何组织我的代码。

我既可以在实例化的myApp.js而不是每个模块的init()函数的所有模型/视图等。 这意味着有大量的重复的代码。

或者,我可以坚持到每个模块有它的init()函数,调用这些的init()函数中myApp.js。 我不喜欢这一点,因为我会到我的模块明确地记下我的每三页的三倍:

require(['module1', 'module2', 'module3', ...],
  function(module1, module2, module3, ...) {
    var init = function() {
      module1.init();
      module2.init();
      module3.init();
      ...
    }
    return {init: init};
  }
);

对于10个模块加上一些库,这不是很干爽。 有没有什么办法来访问(通过循环),其require.js保存所有模块?

还是我失去了一些东西,我应该构建我的代码以不同的方式?

任何提示/想法是值得欢迎的,

迈克尔

Answer 1:

作为评价上面所讨论的,可以避免使用对它们循环到显式引用函数的参数arguments对象的功能体的内部。 所以:

require(['module1', 'module2', 'module3', ..., 'moduleN'],
  function(module1, module2, module3, ..., moduleN) {
    var init = function() {
        module1.init();
        module2.init();
        module3.init();
        ...
        moduleN.init();
    };
    return {init: init};
});

变为:

require(['module1', 'module2', 'module3', ..., 'moduleN'],
  function() {
    var args = arguments;
    var init = function() {
        var module;
        for (module in args) {
            if (args.hasOwnProperty(module) && typeof module.init === 'function') {
                module.init.call(this);
            }
        }
    };
    return {init: init};
});

我在加入hasOwnProperty()内的检查for in循环,因为,对于一些原因,这是很好的做法 。 此外,您会看到显式检验init试图调用之前是一个功能。

之所以var args = arguments是这样你就可以从内部函数引用它-否则你会被引用传递到参数init()这是不是你想要的。

作为与一旁,对建筑的水平,我认为你所描述的项目结构的成效斐然 - 我用它了很多非常大的项目,它从来没有让我失望。 Require.js是真棒! :)



文章来源: require.js + backbone.js: How to structure modules that have an initialize function?