RequireJS - 加载多个配置文件

li-*_*raz 6 requirejs

我正在尝试加载几个RequireJS配置.在我的HTML中我通过加载我的主配置

 <script src="../lib/require.js" data-main="../app/requireConfig"></script>
Run Code Online (Sandbox Code Playgroud)

一旦文档准备好,我想加载我的所有插件配置.所以我创建了一个新的定义文件,其中包含一个调用的函数require.config:

define(['sharedServices/logger'], function (logger) {

    function configVideo() {
        logger.info('Adding video modules');

        require.config({
            path: {

                Capabilities: 'videoProvider/Capabilities',
                VideoProviderEnums: 'videoProvider/VideoProviderEnums',
                VideoProviderCommon: 'videoProvider/VideoProviderCommon',
                VideoProviderInstance: 'videoProvider/VideoProviderInstance',
                DummyVideoInstance: 'videoProvider/DummyProvider/DummyVideoInstance'
            }
        });
    }

    return {
        configVideo: configVideo
    };

})
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下错误:

未捕获的错误:匿名的define()模块不匹配:function(logger){

art*_*rtm 4

您收到的错误与所述问题(加载多个配置)没有直接关系,而是由代码加载的组织方式引起的。正如手册所说:

为了避免该错误:

  • 请务必加载通过 RequireJS API 调用 Define() 的所有脚本。不要在 HTML 中手动编写脚本标记来加载其中包含 Define() 调用的脚本。
  • 如果您手动编写 HTML 脚本标记,请确保它仅包含命名模块,并且不会加载与该文件中的模块之一同名的匿名模块。

所以现在的问题是,当手动加载模块时(正如您所说的“当文档准备好时”,您能否澄清引用的源代码实际上是如何加载的?)requirejs 不知道模块来自哪里,所以它可以' t 为其指定一个名称。如果模块是通过 requirejs api 加载的(例如,如果它出现在调用的依赖项列表中define)并且是 requirejs 本身确定其脚本路径,则它将在文件之后命名模块。

一般来说,建议只使用一个脚本标签来加载所有 requirejs 管理的 javascript。这使得开发设置更紧密地匹配最终的优化情况(所有脚本都连接在一起)。如有必要,仍然可以require.config在各个模块内进行调用,并仅在文档准备好后才执行某些代码。例如,我们的许多应用程序在其main.js(由 requirejs 脚本标记加载的模块)中执行类似以下操作:

// sort of bootstrap config
require.config({
  packages: [{ 
    name: "our-framework",
    location: "../../our-framework/src/"
  }],
  // here some app-specific requirejs options
  waitSeconds: 5
});

// load the framework, the "our-framework/rjs-config" contains 
// framework specific requirejs config (another require.config call)
require(["our-framework/rjs-config"], function() {

  // in this context both require configs are loaded

  require(["application"], function(application) {
    application.init().run();
  });

});
Run Code Online (Sandbox Code Playgroud)