jQuery修改成SeaJs的模块代码非常简单,就是用下面这段语句将jQuery源代码包裹起来:

define('jquery',[],function(require, exports, module){
//这里放jQuery源代码
module.exports = jQuery;
});

也可以加一个判断,如果define已经被定义,就把jQuery模块化,如果define没有被定义,正常执行jQuery代码:

/*
* http://julabs.com
*/
(function(factory) {
if (typeof define === 'function') {
define('/jquery', [], factory);
}
else {
factory();
} })(function(require) {
//这里放jQuery源代码
if (require) return $.noConflict(true); });

如果你用的是jQuery1.7版本以上的,那就更方便了。可以看下jQuery源码的最后几行,你会发现类似下方的代码:

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

如果判断语句为真,那么jQuery就会自动模块化。所以改下判断语句,只留typeof define === "function"jQuery便可以自动模块化:

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

模块化后的调用代码如下:

<script src="/script/sea.js"></script>
<script>
/*
* http://julabs.com
*/
seajs.config({
'base':'/script',
'alias':{
'jquery':'jquery.sea.js'
}
}); seajs.use(['jquery'],function($){
console.log($);
});
</script>

jQuery插件的模块化:

以一个简单的插件为例:

/*!
* http://julabs.com
*/
(function($){
$.sayHello = function(){
console.log("Hello");
};
})(jQuery)

一般模块化代码像下面这样:

/*!
* http://julabs.com
*/
(function (factory) {
if (typeof define === 'function') {
// 如果define已被定义,模块化代码
define('jquerySayHello',['jquery'], function(){
// 返回构造函数
return factory
});
} else {
// 如果define没有被定义,正常执行插件代码
factory(jQuery);
}
}(function ($) {
// 这里才是插件真正的构造函数
console.log('init'); // 注意这行代码
$.sayHello = function(){
console.log("Hello");
};
}));

使用插件的代码如下:

seajs.config({
'base':'/script',
'alias':{
'jquery':'jquery.sea.js',
'jquerySayHello':'jquery.sayHello.sea.js'
}
}); seajs.use(['jquery','jquerySayHello'],function($,jquerySayHello){
jquerySayHello($); // 初始化插件
$.sayHello();
}); seajs.use(['jquery','jquerySayHello'],function($,jquerySayHello){
jquerySayHello($); // 初始化插件
$.sayHello();
});

注意我在插件构造函数里面写的console.log('init');这段代码,可以看到,如果我请求两次插件,插件就要初始化两次。这个虽然可以让代码只在使用时才执行,减少了资源消耗,但如果一个页面中多处需要这个插件的话,就要执行很多次。如果改成下面这种,直接在本模块里就执行:

/*!
* http://julabs.com
*/
(function (factory) {
if (typeof define === 'function') {
// 如果define已被定义,模块化代码
define('jquerySayHello',['jquery'], function(require,exports,moudles){
factory(require('jquery')); // 初始化插件
return jQuery; // 返回jQuery
});
} else {
// 如果define没有被定义,正常执行jQuery
factory(jQuery);
}
}(function ($) {
console.log('init');
$.sayHello = function(){
console.log("Hello");
};
}));

使用插件的代码如下:

/*
* http://julabs.com
*/
seajs.config({
'base':'/script',
'alias':{
'jquery':'jquery.sea.js',
'jquerySayHello':'jquery.sayHello.sea.js'
}
}); seajs.use(['jquery','jquerySayHello'],function($){
$.sayHello();
}); seajs.use(['jquery','jquerySayHello'],function($){
$.sayHello();
});

可以看到,插件的构造函数只执行了一次。

seajs模块化jQuery与jQuery插件【转】的更多相关文章

  1. ***使用jQuery去封装插件(组件化、模块化的思想),即扩展方法

    如何使用jQuery去封装插件,区分扩展全局方法与扩展一个普通的jQuery实例对象的方法 1.给全局对象扩展方法:①$.方法 = function(参数可加可不加){}  ②使用:$.方法(有参数的 ...

  2. 使用requireJS的shim参数 解决插件 jquery.ui 等插件问题

    没有requireJS框架之前,如果我们想使用jquery框架,会在HTML页面中通过<script>标签加载, 这个时候jquery框架生成全局变量$和jQuery等全局变量.如果项目中 ...

  3. 推荐几款jquery图片切换插件

    一.前言 毕业季到了,大家都在匆匆忙忙的记录大学里最美好的时光,照片中各种花式.各种姿势都涌现出来了.这么多的照片怎么展示出来给自己的好友看呢?有人选择做成视频,有人选择ps之后做成图片集,而我选择利 ...

  4. 提升用户体验的最佳免费 jQuery 表单插件

    网页表单是一个老生常谈的话题.出于这样或那样的目的,一些示例中都会包括用户注册,电子商务结算,用户设置甚至联系人表格.而输入栏是非常容易用现代的CSS3技术来应用样式.但是到底什么决定整体用户体验? ...

  5. jQuery为开发插件提拱了两个方法:jQuery.fn.extend(); jQuery.extend();

    jQuery为开发插件提拱了两个方法,分别是: jQuery.fn.extend(); jQuery.extend(); jQuery.fn jQuery.fn = jQuery.prototype ...

  6. jQuery 人脸识别插件,支持图片和视频

    jQuery Face Detection 是一款人脸检测插件,能够检测到图片,视频和画布中的人脸坐标.它跟踪人脸并输出人脸模型的坐标位置为一个数组.我们相信,面部识别技术能够给我们的 Web 应用带 ...

  7. myWaterfall - jQuery瀑布流布局插件

    myWaterfall - jQuery瀑布流布局插件 Demo http://jsfiddle.net/q3011893/p5k2ogy8/embedded/result,html,css,js/ ...

  8. 推荐15款最佳的 jQuery 分步引导插件

    当用户浏览到一个网站,它可能从不知道如何浏览,如何操作网站或 Web 应用程序的内容和流程.在这篇文章中,我们编制了一些最好的 jQuery 引导插件列表.你会发现这些插件对于提高你的网站的整体用户体 ...

  9. Cropper – 简单的 jQuery 图片裁剪插件

    Cropper 是一个简单的 jQuery 图像裁剪插件.它支持选项,方法,事件,触摸(移动),缩放,旋转.输出的裁剪数据基于原始图像大小,这样你就可以用它们来直接裁剪图像. 如果你尝试裁剪跨域图像, ...

随机推荐

  1. 2. 构建DNS集群

    DNS是什么 DNS(Domain Name System,域名系统),是互联网上存储域名和IP映射关系的一个分布式数据库,他负责把域名转换为IP地址,或IP转换为域名,工作于OSI应用层之上,DNS ...

  2. [LeetCode]394. 字符串解码(栈)

    题目 给定一个经过编码的字符串,返回它解码后的字符串. 编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次.注意 k 保证为正整数. ...

  3. .NET 5.0 RC1 发布,离正式版发布仅剩两个版本

    原文:http://dwz.win/Qf8 作者:Richard 翻译:精致码农-王亮 说明:1. 本译文并不是完全逐句翻译的,存在部分语句我实在不知道如何翻译或组织就根据个人理解用自己的话表述了.2 ...

  4. ARL(资产侦察灯塔系统)-源码搭建

    freebuf能力中心开源了一套资产扫描系统(https://github.com/TophantTechnology/ARL),提供docker版,但并无源码搭建的文档(无完整文档).于是在星光哥及 ...

  5. cnblog维护

    title: 博客归纳 blog: CSDN data: Java学习路线及视频 2019 12/31 时间管理 2020 1/22 Git是什么? 1/23 Git安装--Windows 3/24 ...

  6. @Embedded 和 @Embeddable

    自定义类型在hibernate中实现自定义类型,需要去实现UserType接口即可或者以Component的形式提供. JPA的@Embedded注解有点类似,通过此注解可以在Entity模型中使用一 ...

  7. Shell学习(三)Shell参数传递

    一.传参实例 ##脚本文件内容 #执行的文件名 echo $0; #第一个参数 echo $1; #第二个参数 echo $2; #第三个参数 echo $3; ##调用语句 ./testShell. ...

  8. 使用SpringBoot的方式配置过滤器

    springboot 不存在web.xml 那么如何配置过滤器呢 springboot提供了一种方式 通过spring容器配置 @Bean public FilterRegistrationBean ...

  9. react-router 路由切换动画

    路由切换动画 因为项目的需求,需要在路由切换的时候,加入一些比较 zb 的视觉效果,所以研究了一下.把这些学习的过程记录下来,以便以后回顾.同时也希望这些内容能够帮助一些跟我一样的菜鸟,让他们少走些坑 ...

  10. MySQL 5.7二进制日志

    简介 二进制日志是MySQL服务器用来记录数据修改事件的,比如INSERT.UPDATE.DELETE等会导致数据发生变化的语句,SELECT语句不会被记录在内.MySQL必须先执行完一条语句才能知道 ...