我从一个使用Bootstrap 3和Require.js构建的大型合作客户端获得了一个设计库。它非常强大,并且使用Require.js加载jQuery的各种脚本构建良好。问题是,Drupal已经加载了jQuery并且双重负载导致一些项目失败。如果我删除所有Require.js调用,Drupal jQuery的东西效果很好。如果我删除基本的Drupal jQuery文件,使用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-sortable-amd
这是有道理的,因为他们都被宣布在一起。 uggg。
答案 0 :(得分:1)
关于选项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'
...
执行:
require.config({
...
shim: {
jquery: {
exports: 'jQuery' // NOTE THE CASE OF 'Q', THIS IS THE GLOBAL NAME
}
...
说明:如果在RequireJS之后加载jQuery,它将自己定义为jquery
(小写Q)。这是其他模块依赖于jQuery的名称。另一方面,如果它在RequireJS之前加载,它不会定义itdelf,而是留下jQuery
(可能还有$
)全局变量。上面的垫片指示RequireJS在模块依赖于jQuery
模块时使用全局jquery
变量,该模块有望实现您想要的,即仅通过Drupal加载jQuery。