AMD异步模块定义介绍和Require.js中使用jQuery及jQuery插件的方法


Posted in Javascript onJune 06, 2014

AMD 模块

AMD(异步模块定义,Asynchronous Module Definition)格式总体的目标是为现在的开发者提供一个可用的模块化 JavaScript 的解决方案。

AMD 模块格式本身是一个关于如何定义模块的提案,在这种定义下模块和依赖项都能够异步地进行加载。它有很多独特的优势,包括天生的异步及高度灵活等特性,这些特性能够解除常见的代码与模块标识间的那种紧密耦合。目前它已经被很多项目所接纳,包括jQuery(1.7)。

RequireJS

RequireJS是一个工具库,主要用于客户端的模块管理。它可以让客户端的代码分成一个个模块,实现异步或动态加载,从而提高代码的性能和可维护性。它的模块管理遵守AMD规范。

jQuery 对AMD的支持

jQuery 1.7 开始支持将 jQuery 注册为一个AMD异步模块。有很多兼容的脚本加载器(包括 RequireJS 和 curl)都可以用一个异步模块格式来加载模块,这也就表示不需要太多 hack 就能让一切运行起来。可以看看jQuery 1.7 中的源码:

// Expose jQuery as an AMD module, but only for AMD loaders that
// understand the issues with loading multiple versions of jQuery
// in a page that all might call define(). The loader will indicate
// they have special allowances for multiple jQuery versions by
// specifying define.amd.jQuery = true. Register as a named module,
// since jQuery can be concatenated with other files that may use define,
// but not use a proper concatenation script that understands anonymous
// AMD modules. A named AMD is safest and most robust way to register.
// Lowercase jquery is used because AMD module names are derived from
// file names, and jQuery is normally delivered in a lowercase file name.
if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
 define( "jquery", [], function () { return jQuery; } );
}

其工作的原理是,所使用的脚本加载器通过指定一个属性,即 define.amd.jQuery 为 true,来标明自己可以支持多个 jQuery 版本。如果有兴趣了解特定的实现细节的话,我们可以将 jQuery 注册为一个具名模块,因为可能会有这样的风险,即它可能被与其它使用了 AMD 的 define() 方法的文件拼合在一起,而没有使用一个合适的、理解匿名 AMD 模块定义的拼合脚本。

高版本的jQuery (1.11.1) 去掉了define.amd.jQuery判断:

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

Require.js中使用jQuery

Require.js中使用jQuery非常方便,简单配置就可以了,例如:

// 简单的配置
require.config({    // RequireJS 通过一个相对的路径 baseUrl来加载所有代码。baseUrl通常被设置成data-main属性指定脚本的同级目录。
    baseUrl: "./js",
    // 第三方脚本模块的别名,jquery比libs/jquery-1.11.1.min.js简洁明了;
    paths: {
        "jquery": "libs/jquery-1.11.1.min.js"
    }
});
// 开始使用jQuery 模块
require(["jquery"], function ($) {
    //你的代码
    //这里直接可以使用jquery的方法,比如:$( "#result" ).html( "Hello World!" );
});

Require.js中使用jQuery 插件

虽然jQuery的支持AMD的API, 这并不意味着jQuery插件也是和AMD兼容的。

一般的jQuery 插件格式:

(function ($) {
    $.fn.m​​yPlugin = function () {
        //你自己的插件代码
    };
})(jQuery);

不过我们稍微修改一下就可以使用Require.js加载一个jQuery插件:
;(function (factory) {
    if (typeof define === "function" && define.amd) {
        // AMD模式
        define([ "jquery" ], factory);
    } else {
        // 全局模式
        factory(jQuery);
    }
}(function ($) {
    $.fn.jqueryPlugin = function () {
        //插件代码
    };
}));

Require.js中使用jQuery UI组件

Require.js中使用jQuery UI组件也类似的,只要改造一下jQuery Widget Factory 代码就可以了,并且感觉jQuery UI的依赖关系加载就可以了。例如:

(function (widgetFactory) {    if (typeof define === "function" && define.amd) {
        // AMD模式
        define("jquery.ui.widget", ["jquery"], function () {
            widgetFactory(window.jQuery);
        });
    } else {
        // 全局模式
        widgetFactory(window.jQuery);
    }
}
(function ($, undefined) {
    // jQuery Widget Factory 代码
}));
Javascript 相关文章推荐
jquery $("#variable") 循环改变variable的值示例
Feb 23 Javascript
轻松学习Javascript闭包函数
Dec 15 Javascript
JS实现的表格操作类详解(添加,删除,排序,上移,下移)
Dec 22 Javascript
老生常谈Javascript中的原型和this指针
Oct 09 Javascript
Vue.js Ajax动态参数与列表显示实现方法
Oct 20 Javascript
ES6教程之for循环和Map,Set用法分析
Apr 10 Javascript
如何开发出更好的JavaScript模块
Dec 22 Javascript
vue微信分享到朋友圈 vue微信发送给好友
Nov 28 Javascript
Vue.js实现开发购物车功能的方法详解
Feb 22 Javascript
vue改变循环遍历后的数据实例
Nov 07 Javascript
element-ui点击查看大图的方法示例
Dec 14 Javascript
vue.js实现点击图标放大离开时缩小的代码
Jan 27 Vue.js
jQuery插件开发详细教程
Jun 06 #Javascript
手写的一个兼容各种浏览器的javascript getStyle函数(获取元素的样式)
Jun 06 #Javascript
jquery进行数组遍历如何跳出当前的each循环
Jun 05 #Javascript
js检验密码强度(低中高)附图
Jun 05 #Javascript
原生js编写设为首页兼容ie、火狐和谷歌
Jun 05 #Javascript
js如何判断用户是否是用微信浏览器
Jun 05 #Javascript
如何获取网站icon有哪些可行的方法
Jun 05 #Javascript
You might like
PHP中模拟链表和链表的基本操作示例
2016/02/27 PHP
解决出现SoapFault (looks like we got no XML document)的问题
2017/06/24 PHP
PHP截取发动短信内容的方法
2017/07/04 PHP
Javascript-Mozilla和IE中的一个函数直接量的问题
2007/01/09 Javascript
javaScript对象和属性的创建方法
2007/01/15 Javascript
JavaScript 组件之旅(四):测试 JavaScript 组件
2009/10/28 Javascript
根据鼠标的位置动态的控制层的位置
2009/11/24 Javascript
js 内存释放问题
2010/04/25 Javascript
setInterval计时器不准的问题解决方法
2014/05/08 Javascript
jquery中$each()方法的使用指南
2015/04/30 Javascript
javascript DIV实现跟随鼠标移动
2020/03/19 Javascript
基于jQuery实现的打字机效果
2017/01/16 Javascript
vue.js指令和组件详细介绍及实例
2017/04/06 Javascript
vue上传图片组件编写代码
2017/07/26 Javascript
vue点击input弹出带搜索键盘并监听该元素的方法
2018/08/25 Javascript
基于JS实现web端录音与播放功能
2019/04/17 Javascript
Vue实现手机扫描二维码预览页面效果
2020/05/28 Javascript
vue中使用vue-pdf的方法详解
2020/09/05 Javascript
浅析微信小程序自定义日历组件及flex布局最后一行对齐问题
2020/10/29 Javascript
[03:17]2016完美“圣”典风云人物:冷冷专访
2016/12/08 DOTA
[01:03:41]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第三场 2月2日
2021/03/11 DOTA
Python装饰器入门学习教程(九步学习)
2016/01/28 Python
深入解析Python中的descriptor描述器的作用及用法
2016/06/27 Python
python中 chr unichr ord函数的实例详解
2017/08/06 Python
解决python 无法加载downsample模型的问题
2018/10/25 Python
Python使用字典的嵌套功能详解
2019/02/27 Python
Python搭建Spark分布式集群环境
2019/07/05 Python
Django如何批量创建Model
2020/09/01 Python
CSS3弹性盒模型开发笔记(三)
2016/04/26 HTML / CSS
利用Storage Event实现页面间通信的示例代码
2018/07/26 HTML / CSS
John Varvatos官方网站:设计师男士时装
2017/02/08 全球购物
简历中的自我评价范文
2014/02/05 职场文书
党员教师群众路线思想汇报范文
2014/10/28 职场文书
罚款通知怎么写
2015/04/22 职场文书
党员进社区活动总结
2015/05/07 职场文书
JavaScript中的LHS和RHS分析详情
2022/04/06 Javascript