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

时间:2012-08-28 06:16:11

标签: javascript requirejs js-amd

我们有一个使用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-extension加载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
    });
});

这部分的另一个解决方案是走绝对路径吗?

2 个答案:

答案 0 :(得分:4)

requirejs.config()可以在以后随时调用,并且加载器会将配置合并在一起。所以它应该等到你知道你想要用于'extension'的路径配置,然后通过另一个requirejs.config()调用设置它,然后用该路径加载扩展名。

答案 1 :(得分:2)

听起来你想要使用"paths" configuration option。例如:

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