在混合基本 URL 下动态加载 require.js 模块



我们有一个使用 require.js 的应用程序,它同时允许扩展,并且这些扩展的 js 从不同的路径提供服务。所以在我们的配置中,我们有:

var require = {
  baseUrl : '/app/js/modules/'
}

但是扩展是从/extension/foo-extension/js/modules/ .此外,扩展是动态的,以至于它们将一些 html 注入到使用data-module="foo/bar"的页面中,我们拿起来加载该模块。

理想情况下,我们能够传递/设置一个 require.js 的上下文,该上下文将以下模块加载限定为 baseUrl /extension/foo-extension/js/modules/ 内。据我所知,我们需要做require('/extension/foo-extension/js/modules/foo/bar')才能从 foo 扩展加载foo/bar

这里有一些伪代码来想象我们需要在哪里处理设置路径/上下文:

define(['some-dep'], function(SomeDep) {
    $.get('somepage', function(html) {
        var extension = html.data('extension'); // "foo/bar"
        var extensionBase = html.data('extensionBase'); // extension/foo-extension/js/modules/
        // This is where we need to readjust require to use the base path for any foo module
    });
});

部分有没有其他解决方案,从绝对路径路线?

requirejs.config(( 可以在以后随时调用,加载器会将配置合并在一起。因此,等到你知道要用于"extension"的路径配置是什么,然后通过另一个requirejs.config((调用进行设置,然后使用该路径加载扩展就足够了。

听起来您想使用"路径"配置选项。例:

var require = {
  baseUrl : '/app/js/modules',
  paths   : {
    'extension' : '/extension/foo-extension/js/modules'  
  }
};

然后,您可以简单地调用require('extension/foo/bar')来加载/app/js/modules/extension/foo-extension/js/modules/foo/bar.js