Динамически загружать модули require.js по смешанным базовым URL-адресам

У нас есть приложение, использующее 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/bar из foo-extension.

Вот некоторый псевдокод, чтобы представить, где нам нужно обрабатывать установку пути/контекста:

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
    });
});

Есть ли другое решение для этой части пути по пути абсолютного пути?


person Nervetattoo    schedule 28.08.2012    source источник


Ответы (2)


requirejs.config() можно вызвать позже, в любое время, и загрузчик объединит конфиги вместе. Поэтому должно быть достаточно подождать, пока вы не узнаете, что вы хотите использовать для конфигурации путей для «расширения», затем установите его с помощью другого вызова requirejs.config(), а затем выполните загрузку расширения с этим путем.

person jrburke    schedule 28.08.2012

Похоже, вы хотите использовать параметр конфигурации "paths". Пример:

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

person Russ    schedule 28.08.2012
comment
Обратите внимание на бит dynamic здесь. Я не могу использовать пути, потому что это происходит после того, как моя конфигурация настроена. Если бы пути были каким-то образом интерполированы, я мог бы использовать /extension/{extension}/js/modules/. - person Nervetattoo; 28.08.2012
comment
В идеале мы могли бы передать/установить контекст для require.js, который ограничивал загрузку следующих модулей в пределах baseUrl... Это именно то, что делает опция paths. Если вам нужно динамическое решение на стороне сервера, могу ли я предложить опубликовать описание того, что происходит на стороне сервера? - person Russ; 28.08.2012
comment
Это для установки предопределенных путей. Мы выбираем этот путь из атрибутов данных в разметке, которая загружается через запросы ajax в более позднее время. Это произошло после того, как мы выложили конфигурацию require.js с нашими путями. Я обновляю вопрос еще одним псевдокодом... - person Nervetattoo; 28.08.2012
comment
суперп, я не знал, что вы также можете указать частичный путь, это мне очень помогло! - person Willem D'Haeseleer; 19.03.2013