首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Drupal和Require.js不玩很好的jQuery双负载

Drupal和Require.js不玩很好的jQuery双负载
EN

Stack Overflow用户
提问于 2014-11-23 21:02:16
回答 1查看 417关注 0票数 0

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

  1. 停止使用jQuery加载Drupal,使用require在每个页面上加载jQuery --我还没有尝试过这一点,但这似乎是错误的。我想我可以用主题中的jQuery ()删除hook_library_alter()。想知道是否有人尝试过这个…我的前端和管理屏幕实际上使用了两个不同的主题,所以我认为我必须修改这两个主题。
  2. 停止使用jQuery加载Require.js --我尝试过这样做,其他加载了Require.js的库都找不到查询,如果没有require.js加载,所以我认为这个选项行不通。这是我第一次使用require.js,所以也许有一些有趣的解决办法,我还没有弄清楚呢?
  3. 使用Drupal将所有库添加到站点中--这似乎是一项杂乱无章的工作,因为我必须删除库中的所有require.js依赖项,而且人们期望我们不会修改库/框架,因此实现新版本很容易。

还有其他建议吗?

更新按Nikos Paraskevopoulos的回答:

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

代码语言:javascript
复制
/components/jquery/jquery.js
/misc/jquery.once.js
/misc/drupal.js
/components/requirejs/require.js
/js/require.config.js

我的requires.config看起来是这样的:

代码语言:javascript
复制
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条目,并添加:

代码语言:javascript
复制
    jquery: {
        exports: 'jQuery' // NOTE THE CASE OF 'Q', THIS IS THE GLOBAL NAME
    }

我马上就会犯这样的错误:

未知错误:用于: jqueryui-sortable-amd的脚本错误

这是合情合理的,因为他们都被宣布在一起。麻瓜。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-24 09:51:29

关于备选案文2:

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

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

代码语言:javascript
复制
require.config({
    ...
    paths: {
        // REMOVE THIS IF USED (PROBABLY IS)
        jquery: 'lib/jquery-x.y.z'
        ...

做:

代码语言:javascript
复制
require.config({
    ...
    shim: {
        jquery: {
            exports: 'jQuery' // NOTE THE CASE OF 'Q', THIS IS THE GLOBAL NAME
        }
        ...

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27094264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档