Динамично зареждане на модули 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-разширение.

Ето малко псевдокод, за да си представим къде трябва да се справим със задаването на пътя/контекста:

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

Изглежда, че искате да използвате опцията за конфигуриране на „пътеки“. Пример:

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
Обърнете внимание на динамичния бит тук. Не мога да използвам пътеки, защото това се случва много след настройката на конфигурацията ми. Ако пътищата бяха интерполирани по някакъв начин, все пак бих могъл да използвам /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