我已经使用require编写了一个jQuery插件,用杏仁包装它,并通过另一个应用程序中的shim配置加载它。不幸的是,require将全局jQuery暴露给插件而不是本地插件。我的代码:
(function() {
// almond code
// other dependencies
require(dependencies, function (dependencies) {
!function($) {
// window.jQuery == $ -> true
$.fn.plugin = function(options) { return this; }
}(jQuery);
});
})();
require.config({
paths: { 'jquery': 'vendor/jquery-1.9.1.min' },
shim: { 'plugin': ['jquery'] }
});
require(['jquery','plugin'], function ($) {
// window.jQuery == $ -> false
$('#plugin').plugin(options);
// error, object [Object object] has no method "plugin"
);
不应该填充插件代码,将本地jQuery模块暴露给插件的全局范围?
答案 0 :(得分:3)
我认为问题在于您尝试将shim
与AMD模块一起使用,而实际上该功能是针对非AMD模块设计的。来自that section of the documentation:
请记住:仅对非AMD脚本使用shim config,而脚本尚未调用define()。如果在AMD脚本上使用,则shim配置将无法正常工作,特别是,不会触发exports和init配置,并且deps配置会对这些情况造成混淆。
如果您希望将jQuery保留在全局范围之外并仍然将其与其他模块一起使用,则可以遵循Mapping Modules to use noConflict方法:
如果所有模块(包括依赖于jQuery的任何第三方jQuery插件或库代码)都是AMD兼容的,并且您希望在调用require时避免在全局命名空间中使用$或jQuery(['jquery']) ,您可以使用map config将jQuery的使用映射到一个调用noConflict的模块,并为'jquery'模块ID返回jQuery的值。
另请参阅Using private jquery with RequireJS - issue after optimisation以获取分步示例。