Внедренный проект 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). Но я сделал только несколько тестов, поэтому не знаю, не сломается ли это позже.