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 相关文章推荐
用js实现预览待上传的本地图片
Mar 15 Javascript
Javascript 面向对象之重载
May 04 Javascript
javascript整除实现代码
Nov 23 Javascript
javascript对中文按照拼音排序代码
Aug 20 Javascript
让人蛋疼的JavaScript语法特性
Sep 30 Javascript
JavaScript中实现sprintf、printf函数
Jan 27 Javascript
JS实现文字掉落效果的方法
May 06 Javascript
javascript实现延时显示提示框特效代码
Apr 27 Javascript
BootStrapValidator初使用教程详解
Feb 10 Javascript
vuejs实现递归树型菜单组件
Jan 13 Javascript
使用Ajax和Jquery配合数据库实现下拉框的二级联动的示例
Jan 25 jQuery
浅析webpack-bundle-analyzer在vue-cli3中的使用
Oct 23 Javascript
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
setcookie中Cannot modify header information-headers already sent by错误的解决方法详解
2013/05/08 PHP
如何使用php输出时间格式
2013/08/31 PHP
php5.2以下版本无json_decode函数的解决方法
2014/05/25 PHP
PHP判断字符串长度的两种方法很实用
2015/09/22 PHP
作为程序员必知的16个最佳PHP库
2015/12/09 PHP
POST一个JSON格式的数据给Restful服务实例详解
2017/04/07 PHP
jQuery中使用了document和window哪些属性和方法小结
2011/09/13 Javascript
js获取日期:昨天今天和明天、后天
2014/06/11 Javascript
详解JavaScript的while循环的使用
2015/06/03 Javascript
bootstrap模态框远程示例代码分享
2017/05/22 Javascript
Javascript ES6中对象类型Sets的介绍与使用详解
2017/07/17 Javascript
详解angular2.x创建项目入门指令
2018/10/11 Javascript
js实现倒计时秒杀效果
2020/03/25 Javascript
使用纯前端JavaScript实现Excel导入导出方法过程详解
2020/08/07 Javascript
[59:32]Liquid vs Fnatic 2019国际邀请赛淘汰赛败者组BO1 8.20.mp4
2020/07/19 DOTA
Python Web框架Flask中使用七牛云存储实例
2015/02/08 Python
Python基于贪心算法解决背包问题示例
2017/11/27 Python
详解Python odoo中嵌入html简单的分页功能
2019/05/29 Python
PyCharm 配置远程python解释器和在本地修改服务器代码
2019/07/23 Python
python使用协程实现并发操作的方法详解
2019/12/27 Python
python 线程的五个状态
2020/09/22 Python
html5设计原理(推荐收藏)
2014/05/17 HTML / CSS
HTML5 canvas基本绘图之文字渲染
2016/06/27 HTML / CSS
英国最大的专业户外零售商:Mountain Warehouse
2018/06/06 全球购物
怎样建立和理解非常复杂的声明?例如定义一个包含N 个指向返回 指向字符的指针的函数的指针的数组?
2013/03/19 面试题
毕业生个人求职的自我评价
2013/10/28 职场文书
投资合作协议书范本
2014/04/17 职场文书
青年志愿者先进事迹
2014/05/06 职场文书
优秀党员学习焦裕禄精神思想汇报范文
2014/09/10 职场文书
化学专业大学生职业生涯规划范文
2014/09/13 职场文书
2014年小学教研工作总结
2014/12/06 职场文书
2015年初一班主任工作总结
2015/05/13 职场文书
2015年社区居委会工作总结
2015/05/18 职场文书
详解Mysql 函数调用优化
2021/04/07 MySQL
Pandas加速代码之避免使用for循环
2021/05/30 Python
Windows和Linux上部署Golang并运行程序
2022/04/22 Servers