Javascript requirejs不使用shim将本地jquery公开给jquery插件
我使用require编写了一个jQuery插件,将其包装在almond中,并通过另一个应用程序中的shim配置加载它。不幸的是,require将全局jQuery公开给插件,而不是本地插件。我的代码: plugin.js main.jsJavascript requirejs不使用shim将本地jquery公开给jquery插件,javascript,jquery,jquery-plugins,requirejs,almond,Javascript,Jquery,Jquery Plugins,Requirejs,Almond,我使用require编写了一个jQuery插件,将其包装在almond中,并通过另一个应用程序中的shim配置加载它。不幸的是,require将全局jQuery公开给插件,而不是本地插件。我的代码: plugin.js main.js 难道shim不应该加载插件代码,将本地jQuery模块暴露在插件的全局范围内吗?我认为问题在于,您试图在AMD模块中使用shim,而实际上该功能是为非AMD模块设计的。发件人: 请记住:仅对非AMD脚本使用垫片配置,这些脚本尚未调用define()。如果在AMD脚
难道shim不应该加载插件代码,将本地jQuery模块暴露在插件的全局范围内吗?我认为问题在于,您试图在AMD模块中使用
shim
,而实际上该功能是为非AMD模块设计的。发件人:
请记住:仅对非AMD脚本使用垫片配置,这些脚本尚未调用define()。如果在AMD脚本上使用,垫片配置将无法正常工作,尤其是导出和初始化配置将不会被触发,并且在这些情况下,deps配置将令人困惑
如果您希望将jQuery排除在全局范围之外,并且仍将其用于其他模块,则可以遵循以下方法:
如果您的所有模块(包括依赖于jQuery的任何第三方jQuery插件或库代码)都是AMD兼容的,并且您希望在调用require(['jQuery'])时避免在全局命名空间中使用$或jQuery,您可以使用映射配置将jQuery的使用映射到调用noConflict的模块,并为“jQuery”模块ID返回该jQuery值
另请参见一个分步示例。既然
$
不是require回调中的参数,那么$
怎么可能不是plugin.js中的全局jQuery?我不明白你的问题。requirejs文档说,应该将shim与希望使用全局范围变量的插件一起使用,例如jquery插件。这就是我在这里要做的:我试图像插件代码中的任何插件一样使用全局jQuery对象,然后填充它。我可能也误解了。我原以为您希望plugin.js中的window.jQuery==$
为FALSE,但不明白为什么您会这样想。如果让main.js具有require(['jquery','plugin'],function(){
(去掉$as参数)会怎么样?我确实希望它是错误的。我希望它是错误的。我希望在插件中加载代码,本地jQuery暴露在插件的全局范围内,运行代码,然后删除全局暴露。你的解决方案就是我目前拥有的,但它与我使用的其他jQuery插件的工作方式不同我希望它能在依赖jquery的require应用程序中与标准垫片一起工作。
(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"
);