Интеграция RequireJS в сервер OSGi

Примечание. Не пугайтесь слова "OSGi".

Я интегрирую RequireJS в серверную среду Virgo на основе OSGi (хотя подробности не имеют значения). С конфигурацией OSGi у меня есть корневой «комплект OSGi», в котором есть JavaScript, который необходимо настроить для основного представления. Затем есть подсвязки, которые полагаются на корень, каждый со своим собственным JavaScript, который необходимо выполнить.

У меня RequireJS хорошо работает в корневом пакете с «основным» файлом, который настраивает основное представление.

Вопросы. Однако я не знаю, как лучше инициализировать выполнение подпакетов. Должен ли я добавить второй тег <script data-main="main" src="require.js"></script>, на этот раз в подпакет, чтобы запустить его выполнение JavaScript? Должен ли я просто импортировать основной файл JavaScript, как обычно, в подпакеты?


person Donald Taylor    schedule 26.06.2013    source источник
comment
Можете ли вы добавить путь, когда вам нужен объект; подпапка/мой объект?   -  person Gusten    schedule 26.06.2013
comment
Корневой путь будет resources/js/main.js, а примером конкретного подпакета будет sub-bundle/resources/js/main.js.   -  person Donald Taylor    schedule 26.06.2013
comment
Что вы подразумеваете под инициализацией выполнения подпакетов? Из вашего ответа ниже видно, что вы имеете в виду инициализацию конфигурации путей?   -  person explunit    schedule 02.07.2013
comment
Меня не пугает OSGi. Меня пугает JavaScript!   -  person Neil Bartlett    schedule 03.07.2013
comment
@explunit Необходимо запустить два исполнения: основной фреймворк и подпакеты (которые являются потребителями фреймворка).   -  person Donald Taylor    schedule 03.07.2013


Ответы (2)


Один из вариантов, который я нашел работающим, даже если это уродливое и нежелательное решение, заключается в создании глобального объекта в корневом пакете OSGi, в котором хранятся пути, относящиеся к корню. Затем вложенные пакеты могут расширять свои собственные пути к этому объекту и повторно инициализировать RequireJS.

Пример в корневом пакете:

var config = {
  paths: {
    // root bundle paths go here . . .
  }
};

require(config.requirejs);

Пример в подкомплекте:

$.extend(true, {
  paths: {
    // sub-bundle paths go here . . .
  }
}, config);

require(config.requirejs);

Но мне не нравится (как мне кажется) повторно инициализировать RequireJS. Надеюсь, кто-нибудь узнает о лучшем решении.

person Donald Taylor    schedule 26.06.2013

В итоге я настроил основные ресурсы JavaScript фреймворка со следующим тегом в корневом пакете:

<script data-main="js/main" src="<c:url value="require.js" />"></script>

. . . с "js/main.js":

require(['jquery'], function ($) {
  // main script goes here . . .
})

С вышеперечисленным в корневом пакете подпакеты просто вызывают свой собственный JavaScript с помощью:

<script>require(['sub-bundle/js/script.js'])</script>

Итак, ответ на мой вопрос прост: используйте функцию require в подпакетах!

person Donald Taylor    schedule 09.07.2013