【问题标题】:Dynamic loading of modules from array using RequireJS使用 RequireJS 从数组中动态加载模块
【发布时间】:2012-08-21 02:18:42
【问题描述】:

我正在开发一个使用 RequireJS AMD 加载方法的应用程序。

我将我的模块从配置文件动态提取到一个数组中

var amd_modules = ["module1", "module2","module3"]

现在我有了我的 requireJS 代码

require(amd_modules, function(result) {
console.log("All modules loaded");
}

现在,结果变量显示了第一个模块,即“module1”。如何将其他模块也放入 function() 括号内的变量中。

例如,

require(amd_modules, function(module1, module2, module3) { //
}

我无法编写上述硬编码,因为动态变量的数量直到运行时才知道。请告诉我如何在函数内动态捕获对象。

谢谢

【问题讨论】:

    标签: javascript requirejs


    【解决方案1】:

    只需使用arguments:

    require(amd_modules, function() {
        console.log("All modules loaded");
        // arguments should now be an array of your required modules
        // in the same order you required them
    });
    

    但是,除非您有充分的理由这样做,否则您可能需要重新考虑设计应用程序的方式 - 即使在最顶层,您的模块也应该简单且可测试。具有广泛不同数量的依赖项表明您可能正在尝试在回调函数中做很多事情。将每个代码路径分解成自己的模块,然后只切换到您的顶级依赖项。在代码中:

    // Instead of this:
    require(amd_modules, function() {
        console.log("All modules loaded");
        if (complex_condition_A) {
            var x = arguments[0],
                    y = arguments[1],
                    z = arguments[2];
            // Do things with x, y and z
        }
        else if (complex_condition_B) {
            var a = arguments[0],
                    b = arguments[1];
            // Do things with a and b
        }
        else {
            // et cetera, et cetera, et cetera
        }
    });
    
    
    // Do this instead
    var rootModule;
    if (complex_condition_A) rootModule = "A";
    else if (complex_condition_B) rootModule = "B";
    else rootModule = "C";
    require(rootModule, function(root) {
        // Root has the same API, regardless of which implementation it is
        // This might be as simple as an `init` method that does everything
        // or as complex as, say Facebook's API, but with different libraries
        // loaded depending on the platform the page is loaded on
        // (IE vs. Android for example).
    });
    

    【讨论】:

    • 感谢您的意见。关于依赖的好消息。实际上,我正在以每个模块相互独立的方式构建。我写上述方法的原因是 - 通过查看这个场景。如果一个页面有三个模块模块 A、B 和 C。每个模块进入三个 div,并且一次只显示一个(通过选项卡)。所以,选项卡 A 显示模块 A。选项卡 B 显示模块 B,等等。现在我想 - 因为用户在选项卡 A,我只能为模块 A 调用 requireJS。然后一旦加载页面,调用其余模块。
    • 所以模块 A 首先被加载并执行,然后当 DOM 准备好时,我得到模块 B 和模块 B 文件的 requireJS 调用并执行它们。我认为这比用户必须等待所有模块 A、B 和 C 加载要好。我想这样做的另一个原因是 - 我认为如果以后其他开发人员添加更多模块,初始化页面加载应该只取决于该页面所需的模块。这是我计划的代码 sn-p。
    • var initModules = ['ModuleA'], deferedModules = ['Module C','ModuleD']; require(initLoad, function() { console.log("Initial components loaded."); CORE.create_module(arguments[0]); //这里我为那个模块组件创建一个模块。CORE.start_all(); //启动上面两个模块 setTimeout(loadRestComponents, 2000); });
    • loadRestComponents = function() { console.log("现在我加载并初始化其余组件"); require(deferedModules, function() { console.log("Loaded rest of components"); CORE.create_module(arguments[0]); //这里我为那个模块组件创建一个模块 CORE.create_module(arguments[1] ); // 为其他模块组件创建模块 CORE.start_all(); // 启动以上两个模块 }); }
    • @user1402539 - 延迟加载模块是一个不错的方法 - 我会使用这种模式:require([initModule, deferredModules], function(CORE, deferredModules) { CORE.create_module(); for (var i=0, l=deferredModules.length; i<l; i++) { CORE.create_module(deferredModules[i]); } });
    【解决方案2】:

    试试这样的:

    define(function () {
        var ClassLoader = function () {
            var _construct = function () {
                    return _public;
                },
                _loadClass = function (className, callback) {
                    //
                    require([className],
                        function (LoadedClass) {
                            callback(LoadedClass);
                        });
                },
    
                _public = {
                    loadClass: _loadClass
                };
            return _construct();
        }
        return ClassLoader;
    });
    

    【讨论】:

    • 请添加更多详细信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 2013-08-24
    • 2017-01-10
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多