由于缺少更好的词,我正在开发一个“窗口小部件”,该窗口小部件将加载到我无法控制的许多不同网站中。
我们正在使用RequireJS来简化操作,但这具有破坏很多尚未使用/支持它的网站的副作用。
请清楚-我们不控制这些站点,原因是现有库中的许多站点正在加载到RequireJS中,而不是全局中,并且这些站点上的代码希望它们在全局中加载。
到目前为止,我能想到的唯一实用的解决方案是重命名RequireJS的require()和define()(也许还有其他),然后编辑我们依赖的每个库(当然使用sed)来使用'新功能。
还有其他人处理过吗?我有没有更好的方法?
答案 0 :(得分:0)
对于任何偶然发现此问题的人,这就是我最终要做的...
目前尚无一个好的解决方案,因为:
1)所有加载到RequireJS中的库都需要define()在执行时在其作用域中存在
和
2)除了eval()之外,没有任何一种机制可以异步加载脚本以允许在执行之前/之后定义(未定义双关)和未定义,这不是一个好选择。
这意味着,实际上不可能拥有某种范围的RequireJS,而不会干扰页面上可以使用RequireJS的其他脚本,但这些脚本打算在该特定站点上全局加载。
所以...这是我做的hacky解决方案...
我不是自己加载JS库,而是将它们与RequireJS捆绑在一起,并包装在立即执行的函数中。
动态执行此操作的原因是,程序必须具备一些特定于站点的数据才能正常运行,并且它会保存HTTP请求以获取该请求(以下载更大文件为代价)。
这使我能够:
1)使用需要在RequireJS(或类似版本)下运行的库才能工作
2)避免使jQuery之类的全局名称空间混乱
3)避免编辑库源代码(例如,将define()更改为my_special_define()或类似名称)
我希望这对某人尝试做与我相同的事情会有所帮助:)