Javascript Require.JS+;JQuery插件+;客户托管的JQuery冲突

Javascript Require.JS+;JQuery插件+;客户托管的JQuery冲突,javascript,jquery,requirejs,Javascript,Jquery,Requirejs,我们已经建立了一个类似于shopify的平台,在这个平台上我们为电子商务托管客户网页 在每个页面上,我们都有一些通过requireJS加载的平台javascript 这个平台javascript使用jquery Cookie作为插件 如果客户还安装了jQuery,则会导致Cookie插件将自身安装到客户的jQuery实例,而不是我们的jQuery实例 客户html: <script type="text/javascript" src="/jquery.js"></script

我们已经建立了一个类似于shopify的平台,在这个平台上我们为电子商务托管客户网页

在每个页面上,我们都有一些通过requireJS加载的平台javascript

这个平台javascript使用jquery Cookie作为插件

如果客户还安装了jQuery,则会导致Cookie插件将自身安装到客户的jQuery实例,而不是我们的jQuery实例

客户html:

<script type="text/javascript" src="/jquery.js"></script>
platform.js[我们的代码]:

require.config({
    "paths": {
        "jquery": "bower_components/jquery/jquery.min",
        "jquery-cookie": "bower_components/jquery-cookie/jquery.cookie",
    },
    "shim": {
        "jquery-cookie": ["jquery"]
    }
});
define(['jquery', 'jquerye-cookie'], function(jQuery, jQueryCookie) {
    console.dir(jQuery.cookie); // <-- Not available, sometimes
});
因此,您可以看到,即使我将jQuery重新命名为“platform$”之类的名称,插件仍会将自身加载到window.jQuery中,该窗口或jQuery的客户版本将是未定义的

编辑:


很明显,这不是“一个”客户,而是很多(希望最终是几千个)。

您是否允许客户向页面添加任何HTML内容。。。?一般来说,出于安全原因,再加上这样的情况,完全无辜的用户意外破坏了您的站点,这是一个坏主意。您可以尝试在noconflict模式下运行jquery,但如果客户可以输入任何旧的javascript,他们总会有办法破坏您站点的javascript。因此,我认为真正的答案是限制客户可以输入的内容。

当我查看jQuery cookie插件的时,我看到它检测是否在AMD风格的加载程序(RequireJS是)中运行,并使用
定义
。这意味着这个插件不需要垫片

现在,问题中的失败是怎么发生的

  • 客户机还使用RequireJS编写代码。这意味着将两个配置传递给RequireJS。他们可能会发生冲突。RequireJS的设计目的不是检测此类冲突。(只要生成的配置对RequireJS有意义,它就不会抱怨。)并且根据两个配置的加载方式,结果可能是不确定的

  • 客户机的代码不使用RequireJS。如果此客户端还将jQuery cookie插件合并到其自己的代码中,这可能会产生问题,因为无法确定加载插件版本时,
    $
    的值是多少


编辑了我的问题,以说明为什么我认为冲突不起作用。我们试图让客户能够完全控制他们的平台,并接受他们有办法破坏他们的网站并干扰我们的平台。然而,他们不应该仅仅通过包含jQuery就能够破坏它。同样,这只是开发模式中的一个问题,在生产环境中,我们只编译JS,不可能混淆jQuery名称空间。客户是否使用RequireJS?这是可能的-但一般来说,不是。这只是我发布到stackoverflow的代码中的一个输入错误。我会修好的。实际的代码没有那个打字错误。就像我说的,问题是间歇性故障,引用错误的jquery路径会导致100%的故障,而不是间歇性故障。我对这个问题很有把握,我很自信这是我所描述的,而不是我变量名的疏忽。根据你所知道的,你可以推断我所描述的失败是100%的失败,但根据你在问题中提供的大量信息,我们无法做出这种推断。例如,如果您的客户端碰巧有一个名为
jquery.cookie
的文件位于正确的目录中(毕竟,很多人都使用它),那么RequireJS将加载它。无论如何,我已经用进一步的想法更新了我的答案。jQueryCookie版本非常好,我们刚刚意识到我们的bower是为jQueryCookie1.2配置的,而jQueryCookie1.2没有进行AMD检查。我已经更新到1.4版本,这应该会有所帮助。现在唯一的问题是parsleyjs没有做同样的检查。所以我们对欧芹还是有同样的问题。我认为现在最好的办法就是根据我们的需要叉上欧芹,并让它与require配合使用。在您描述的两个场景中,#2就是正在发生的事情。我认为目前我们对处理requirejs冲突不感兴趣(场景1)。
(function ($, document, undefined) {
    $.cookie = function (key, value, options) {
    });
})(jQuery, document);