如何使用requirejs加载jQuery插件

Nic*_*tti 87 javascript jquery requirejs

我正在使用requirejs + jquery,我想知道是否有一种聪明的方法可以使jQuery插件与require一起使用.

例如,我正在使用jQuery-cookie.如果我理解正确,我可以创建一个名为jquery-cookie.js的文件,并在里面做

define(["jquery"], // Require jquery
       function($){
// Put here the plugin code. 
// No need to return anything as we are augmenting the jQuery object
});
requirejs.config( {
    "shim": {
        "jquery-cookie"  : ["jquery"]
    }
} );
Run Code Online (Sandbox Code Playgroud)

我想知道我是否可以像jQuery那样做,这是这样的:

if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
    define( "jquery", [], function () { return jQuery; } );
}
Run Code Online (Sandbox Code Playgroud)

或者,这是使jQuery插件与requirejs或任何amd兼容的唯一方法

Car*_*ond 104

http://requirejs.org/docs/api.html#config-shim中指出,在RequireJS中使用shim配置有一些注意事项.即,当您使用优化器时,"不要在构建中混合CDN加载与shim配置".

我一直在寻找一种方法,在有和没有RequireJS的网站上使用相同的jQuery插件代码.我在https://github.com/umdjs/umd/blob/master/jqueryPlugin.js找到了jQuery插件的这个片段.您将插件包装在此代码中,它将以任何方式正常工作.

(function (factory) {
if (typeof define === 'function' && define.amd) {
    // AMD. Register as an anonymous module depending on jQuery.
    define(['jquery'], factory);
} else {
    // No AMD. Register plugin with global jQuery object.
    factory(jQuery);
}
}(function ($) {

    $.fn.yourjQueryPlugin = function () {
        // Put your plugin code here
    };  

}));
Run Code Online (Sandbox Code Playgroud)

归功于jrburke; 像这么多的javascript,它的功能在函数内部作用于其他函数.但我想我已经解开了它正在做的事情.

factory第一行中的函数参数本身就是一个函数,它被调用来定义$参数上的插件.如果没有与AMD兼容的加载器,则直接调用它来定义全局jQuery对象上的插件.这就像常见的插件定义习惯用法:

function($)
{
  $.fn.yourjQueryPlugin = function() {
    // Plugin code here
  };
}(jQuery);
Run Code Online (Sandbox Code Playgroud)

如果有一个模块加载器,则factory在加载jQuery后注册为加载器调用的回调.加载的jQuery副本是参数.它相当于

define(['jquery'], function($) {
  $.fn.yourjQueryPlugin = function() {
     // Plugin code here
  };
})
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这个答案,因为即使问题是关于jQuery插件,这适用于任何类型的模块或库,而不仅仅是jQuery.我花了一分钟时间围绕你的代码,但是一旦我做了,它就完全有道理了. (3认同)

Han*_*ans 66

你只需要做

define(["jquery"], // Require jquery
       function($){
// Put here the plugin code. 
// No need to return anything as we are augmenting the jQuery object
});
Run Code Online (Sandbox Code Playgroud)

在jquery-cookie.js的末尾,或者

requirejs.config( {
    "shim": {
        "jquery-cookie"  : ["jquery"]
    }
} );
Run Code Online (Sandbox Code Playgroud)

在包含jquery-cookie之前的任何地方(例如,数据主要指向的地方).

您发布的最后一个代码块适用于jQuery等重新分发的内容,可能是也可能不在AMD环境中.理想情况下,每个jQuery插件都已经设置好了.

我更喜欢将包含的库保持为尽可能不掺杂,因此每页一次的全局填充程序配置对我来说似乎是最干净的解决方案.这样升级更安全,CDN成为可能.

  • 乔希:你赌博说一切都会以正确的顺序加载.您网站上的某些用户可能会看到破碎的内容.问题不在于插件加载,插件加载_When_以及当时正在执行的其他操作.使用require的主要原因是基于依赖性而不是猜测来确保合理的操作顺序. (3认同)