我的应用程序的JavaScript使用jQuery和jQuery插件并在“敌对”环境中运行我无法控制(这是电子商务平台的PHP扩展)。因此无法确定我的jQuery代码是否会在某人将附加他的jQuery / plugins实例(由其他扩展引入)之后执行,或者在此之后或某人将在页面呈现后动态加载jQuery。
基本上问题是其他扩展也可以使用jQuery(带插件),只是将jQuery与tag连接起来是行不通的。
我强烈感觉RequireJS可以帮助我将所需版本的jQuery加载到封装范围内的特定版本的jQuery插件,而不会污染全局范围(因此其他扩展仍然可以正常运行)。然后我将我的所有代码都包装到“require”语句中,它将使用它自己的jQuery和插件集运行。我试过这个并且有点工作(虽然没有在生产环境中对此进行过测试)但是有些奇怪的方式。好像this question似乎与我遇到的问题有关。还回答建议使用AMD兼容版本的jQuery。但插件怎么样?我不认为我使用的所有插件都有这样的版本。
所以问题:
可以使用RequireJS来覆盖这样的用例(在未定义的环境中运行jQuery +插件)吗?如果可以在那里使用RequireJS,那么将非常感谢任何示例代码或如何正确执行此操作的说明。 如果用RequireJS无法解决这个问题,您认为处理问题的最佳方法是什么?
答案 0 :(得分:1)
是的,我相信RequireJS可以帮助你。据我所知,你不得不做一些腿部工作。看一下(截至2012-08-19)最新jQuery的来源:link。在底部,您可以看到正在设置window.jQuery
,定义jQuery
和$
。对{AMD}加载器的define
调用发生在此之后,因此jQuery
无论如何都在全局范围内。你想要做的是保证你自己的jQuery版本和插件与其他jQuery实例和插件保持隔离,对吗?
将自定义jQuery和插件放入他们自己的目录(让我们称之为“jqcustom”),并在脚本的define
调用中指定依赖项时使用该目录。你需要修改你的jQuery版本,方法是将它包装在define
调用中并返回最底层的jQuery
对象,取出jQuery的window.jQuery
和window.$
赋值以及在此过程中默认的define
调用(这些都在底部,请记住)。然后,您需要将所有插件包装在define
调用中,并指定您自己的jQuery
版本作为依赖项。例如:
define(['jqcustom/jquery'], function(jQuery) {
//inside this method 'jQuery' will override any predefined global window.jQuery
//in case any plugins use the $ variable, define that locally too
var $ = jQuery;
//... plugin code ...
});
如果你使用RequireJS'优化器,它可以使用shim config选项为你包装插件。 jQuery插件通过向jQuery的原型对象添加方法来工作,所以我相信只要你将同一个jQuery
(你的自定义jqcustom/jquery
)传递到每个包含define
包装的插件,插件'扩展将全部设置在同一个对象上,并可在后续define
调用中访问,并将自定义jQuery
或自定义插件指定为依赖项。祝你好运!