RequireJS - jquery依赖关系&优先

时间:2014-04-01 12:47:45

标签: javascript jquery requirejs

我一直在使用RequireJS已经有一段时间了,但我最近遇到了一些我以前从未见过的东西。

我有一个简单的页面,它将使用SelectBoxIt和Caroufredsel。 Caroufredsel需要jQuery。但SelectBoxIt需要jQueryUI(实际上只是小部件工厂)需要jQuery。

我的印象是,设置这些依赖项的方法是使用require.config shim,如下所示:

requirejs.config({
    paths: {
        "jquery" : [
            "//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min",
            "libs/jquery-1.8.2.min"
        ],

        jqueryui :    "libs/jquery.ui.widget",
        selectboxit : "libs/jquery.selectBoxIt.min",
        caroufredsel: "libs/jquery.carouFredSel-6.2.1-packed"

    },
    shim:{
        jqueryui:       ['jquery'],
        selectboxit:    ['jqueryui'],
        caroufredsel:   ['jquery']
    }
});

然而,这会产生级联错误:

Uncaught ReferenceError: jQuery is not defined jquery.ui.widget.js:528
Uncaught TypeError: undefined is not a function jquery.selectBoxIt.min.js:4
Uncaught ReferenceError: jQuery is not defined jquery.carouFredSel-6.2.1-packed.js:16

然后有人告诉我有关配置对象的优先级属性:

requirejs.config({
    priority: ["libs/jquery-1.8.2.min"],
    paths: {
        "jquery" : [
            "//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min"
          ,  "libs/jquery-1.8.2.min"
        ]

        , jqueryui :    "libs/jquery.ui.widget"
        , selectboxit : "libs/jquery.selectBoxIt.min"
        , caroufredsel: "libs/jquery.carouFredSel-6.2.1-packed"

    },
    shim:{  // update, removed jquery as it doesn't need shim
        jqueryui:       ['jquery']
        , selectboxit:    ['jqueryui']
        , caroufredsel:   ['jquery']
    }
});

每个人都对此感到满意,但感觉不对劲。我原以为放在优先级属性中的字符串将是“jquery”,它将解析为CDN版本或本地版本。

但是这引起了一个新的错误:

GET http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min,libs/jquery-1.8.2.min.js 404 (Not Found) 

但是我必须选择在优先级属性中放置哪个不是我在jquery占位符中放入两个项目的目的?

我错过了什么?我以前怎么没见过这个问题?

谢谢, 斯科特

1 个答案:

答案 0 :(得分:0)

您向我们展示的内容存在很大问题,可以解释您遇到的问题:

  • priority是RequireJS 1.x选项,不被RequireJS 2.x识别。

  • shim是RequireJS 2.x选项,RequireJS 1.x无法识别。

如果priority有所不同,则表明您使用的是RequireJS 1.x,并且您的垫片会被忽略。此外,jQuery 1.8.2不需要填充程序,因为它调用define