Javascript Drupal和Require.js玩得不好-jQuery的两倍负载

Javascript Drupal和Require.js玩得不好-jQuery的两倍负载,javascript,jquery,drupal-7,requirejs,Javascript,Jquery,Drupal 7,Requirejs,我得到了一个大型合作客户端的设计库,该客户端使用bootstrap3和Require.js构建。它非常健壮,使用Require.js加载jQuery的各种脚本构建得很好。问题是,Drupal已经加载了jQuery,双重加载导致一些项失败。如果我删除了所有Require.js调用,Drupal jQuery的东西会非常有用。如果我删除了基本的Drupal jQuery文件,那么使用Require.js的所有东西都会非常有用。以下是我考虑过的一些选择: 停止使用Drupal加载jQuery,使用re

我得到了一个大型合作客户端的设计库,该客户端使用bootstrap3和Require.js构建。它非常健壮,使用Require.js加载jQuery的各种脚本构建得很好。问题是,Drupal已经加载了jQuery,双重加载导致一些项失败。如果我删除了所有Require.js调用,Drupal jQuery的东西会非常有用。如果我删除了基本的Drupal jQuery文件,那么使用Require.js的所有东西都会非常有用。以下是我考虑过的一些选择:

  • 停止使用Drupal加载jQuery,使用require在每个页面上加载jQuery——我还没有尝试过,但它似乎是错误的。我想我可以在我的主题中用hook\u library\u alter()删除jQuery?不知道是否有人尝试过这个…我的前端和管理屏幕实际上使用了两个不同的主题,所以我想我必须修改这两个主题
  • 停止jQuery使用Require.js加载–我尝试了这个方法,如果没有使用Require.js加载,则使用Require.js加载的其他库都无法找到查询,因此我认为这个选项不起作用。这是我第一次使用require.js,所以可能有一些有趣的补丁我还没有弄明白
  • 使用Drupal将所有库添加到站点—这似乎是一项繁杂的工作,因为我必须删除库中的所有require.js依赖项,而且我们希望不修改库/框架,因此实现新版本很容易 还有其他建议吗

    根据Nikos Paraskevopoulos的回答更新:

    我已经将Drupal配置为加载require.js包附带的jQuery版本,Drupal对此很满意。因此,现在我在每一页上按以下顺序加载:

    /components/jquery/jquery.js
    /misc/jquery.once.js
    /misc/drupal.js
    /components/requirejs/require.js
    /js/require.config.js
    
    我的requires.config如下所示:

    requirejs.config({
        baseUrl: "./",
        paths: {
            .....
            jquery:
            "components/jquery/jquery", "jquery-csv": "components/jquery-csv/src/jquery.csv",
            "jqueryui-sortable-amd": "components/jqueryui-sortable-amd/js/jquery-ui-1.10.2.custom",
            .....
        },
        shim: {
            "jquery-backstretch": [
                "jquery"
            ],
            masonry: [
                "jquery"
            ],
            OpenLayers: {
                exports: "OpenLayers"
            },
            "jquery-csv": [
                "jquery"
            ]
        }
    });
    
    如果我从路径中删除jquery条目,并添加:

        jquery: {
            exports: 'jQuery' // NOTE THE CASE OF 'Q', THIS IS THE GLOBAL NAME
        }
    
    我立即得到如下错误:

    未捕获错误:jqueryui可排序amd的脚本错误

    这是有道理的,因为它们都是一起声明的。uggg.

    关于选项2:

    我不知道具体是如何加载的,但我猜Drupal加载jQuery+它需要的其他东西,然后加载RequireJS,然后再加载它自己版本的jQuery+它需要的其他东西

    首先,您应该确保Drupal和您的RequireJS应用程序都可以使用相同版本的jQuery。然后,在您的RequireJS配置中,使用shim jQuery代替正常加载,例如,代替:

    require.config({
        ...
        paths: {
            // REMOVE THIS IF USED (PROBABLY IS)
            jquery: 'lib/jquery-x.y.z'
            ...
    
    做:

    说明:如果jQuery是在RequireJS之后加载的,那么它将自己定义为
    jQuery
    (小写Q)。这是其他模块用来依赖jQuery的名称。另一方面,如果它是在RequireJS之前加载的,那么它不会定义itdelf,只剩下
    jQuery
    (可能还有
    $
    )全局变量。当模块依赖于
    jQuery
    模块时,上面的垫片指示RequireJS使用全局
    jQuery
    变量,这有望实现您想要的,即仅通过Drupal加载jQuery

    require.config({
        ...
        shim: {
            jquery: {
                exports: 'jQuery' // NOTE THE CASE OF 'Q', THIS IS THE GLOBAL NAME
            }
            ...