Внедренный проект ember-cli конфликтует с RequireJS

Я пытаюсь встроить приложение EmberJS в большое приложение портала, которое широко использует библиотеку RequireJS. Я использую ember-cli для создания проекта. Встроенное приложение состоит из двух файлов, dist/assets/vendor.js а также dist/assets/myapp.js, Приложение EmberJS работает после его встраивания, но javascript приложения портала ломается.

После некоторых исследований я обнаружил, что проблема в том, что vendor.js определяет свои собственные переменные require, requirejs, requireModule а также define которые конфликтуют с переменными сайта в глобальном пространстве имен. myapp.js Затем файл содержит define операторы, которые загружают модули приложения.

Есть ли способ переименовать их или поместить в другое пространство имен?

Единственное решение, которое я придумал, было вручную переименовать переменные в двух .js файлы. Кажется, это работает, но довольно громоздко, и было бы неплохо, если бы это можно было автоматизировать. Я также узнал об использовании оптимизатора RequireJS, но не могу заставить его работать с vendor.js файл.

Вы можете мне помочь? Спасибо!

1 ответ

У меня возникла та же проблема, и после долгих поисков, я думаю, мне удалось ее решить, добавив в свой проект дополнение ember-derequire:

ember install ember-derequire

Это изменит все операторы 'require' и 'define' в вашем приложении на 'eriuqer' и 'enifed'. Вы можете переопределить то, что он отображает, используя опции (будьте осторожны, если вы должны использовать что-то одинаковой длины), если вам не нравятся eriuqer и enifed.

В случае, если это не помогает, я обнаружил еще одну многообещающую вещь: в loader.js есть функция noConflict(), но я не мог понять, куда поместить вызов loader.noConflict() или получить сборку для генерации. код с использованием альтернативных имен, но, возможно, это поможет вам, если первый вариант не работает для вашей ситуации.

Как Bjornicus @ Bjornicus ( /questions/9354324/vnedrennyij-proekt-ember-cli-konfliktuet-s-requirejs/9354344#9354344), встроенныйloader.jsс noConflict()функция работает правильно. Я поместил его в основной JS файл (app.js):

window.loader.noConflict({
  define: "emberDefine"
});

а также defineне было переопределено (я импортирую приложение ember в другое приложение, которое использует SystemJS). Но я сделал только несколько тестов, поэтому не знаю, не сломается ли это позже.

Другие вопросы по тегам