0

我的应用程序的 JavaScript 使用 jQuery 和 jQuery 插件并在我无法控制的“敌对”环境中运行(这是电子商务平台的 PHP 扩展)。因此,无法确定我的 jQuery 代码是否会在有人附加他的 jQuery/插件实例(由其他扩展引入)之前或之后执行,或者有人会在页面呈现后动态加载 jQuery。

基本上问题是其他扩展也可以使用 jQuery(带有插件)并且仅将 jQuery 与标签连接是行不通的。

我有一种强烈的感觉,RequireJS 可能会帮助我将所需版本的 jQuery 加载到封装范围内的特定版本的 jQuery 插件,而不会污染全局范围(因此其他扩展仍然可以正常运行)。然后我将把我所有的代码包装到“require”语句中,它将使用它自己的一组 jQuery 和插件运行。我试过这个并且它有点工作(虽然没有在生产环境中测试过)但是以某种奇怪的方式。似乎这个问题与我遇到的问题有点相关。还回答建议使用与 AMD 兼容的 jQuery 版本。但是插件呢?我不认为我使用的所有插件都有这样的版本。

所以问题:

RequireJS 可以用来覆盖这样的用例(在未定义的环境中运行 jQuery+插件)吗?如果 RequireJS 可以在那里使用,那么任何示例代码或如何正确执行此操作的解释将不胜感激。如果没有办法用 RequireJS 来解决这个问题,您认为处理问题的最佳方法是什么?

4

1 回答 1

1

是的,我相信 RequireJS 可以在这里为您提供帮助。不过,据我所知,你必须做一些跑腿工作。看看(截至 2012 年 8 月 19 日)最新 jQuery 的来源:link。在底部,您可以看到window.jQuery正在设置、定义jQuery$. 之后会define调用 AMD 加载程序,因此jQuery无论如何都在全局范围内。您想要做的是保证您自己的 jQuery 和插件版本与其他 jQuery 实例和插件保持隔离,对吗?

将您的自定义 jQuery 和插件放入它们自己的目录(我们称之为“jqcustom”)并在脚本define调用中指定依赖项时使用该目录。您需要修改您的 jQuery 版本,方法是将其包装在一个define调用中并jQuery在最底部返回对象,取出 jQuerywindow.jQuerywindow.$赋值以及它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 配置选项为您包装插件。jQuery 插件通过向 jQuery 的原型对象添加方法来工作,所以我相信只要您将相同的jQuery(您的自定义jqcustom/jquery的)传递给带有define包装的每个插件,插件的扩展将全部设置在同一个对象上,并且可以在后续访问define调用将您的自定义jQuery或自定义插件指定为依赖项。祝你好运!

于 2012-08-19T20:49:36.540 回答