我尝试将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
文件一起工作。
你能帮我吗?谢谢!
2条答案
按热度按时间zaqlnxep1#
我遇到了同样的问题,经过大量的搜索,我相信我通过在我的项目中添加ember-derequire插件来解决它:
这会将应用中所有的“require”和“define”语句更改为“eriuqer”和“enifed”。如果你不喜欢eriuqer和enifed,你可以使用选项覆盖它Map的内容(注意你必须使用相同长度的内容)。
如果这没有帮助,我发现的另一个有希望的事情是loader.js有一个noConflict()函数,但是我不知道在哪里放置loader.noConflict()调用,或者让构建使用备用名称生成代码,但是如果第一个选项不适合您的情况,它可能会帮助您。
w1e3prcc2#
正如@Bjornicus(https://stackoverflow.com/a/39088322/5056421)所写的那样,内置的
loader.js
的noConflict()
函数看起来工作正常,我把它放在了主JS文件(app.js)中:并且
define
没有被覆盖(我将ember应用导入到另一个使用SystemJS的应用中)。但是我只做了几个测试,所以我不知道这是否会在以后破坏一些东西。