`
web322_szb
  • 浏览: 23306 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

SeaJS中jQuery插件模块化及其调用方式

阅读更多

jQuery插件本质上是将命名空间挂在全局的jQuery或jQuery.fn上而非使用define定义的模块。 
JQuery的这种扩展机制同模块化要求模块的独立性,以及模块互相隔离有点冲突。

jQuery插件数目众多,我们不打算做大量的转换工作,为模块化而模块化,甚至改变插件的调用方式, 
这样对开发带来的价值不大。只希望通过模块加载器实现自动的依赖管理,按需加载,并且使用方式自然。

1.常见的jQuery插件的模块化方式

把jquery插件作为一个函数返回,带一个jquery参数,由调用者完成插件的初始化。

以jquery-themeswitch插件为例子,该插件依赖jquery.cookie插件。

/* jquery-themeswitch.js */

define(function(require) { 

  return function(jQuery) {

      //先初始化依赖的模块
      require('./jquery.cookie')(jQuery);   

     //put plugin code here

  }//end of function

}); 

2.jquery模块化后调用方式

下面的demo对模块的引用采用相对路径,实际的业务开发中可以通过seajs提供的alias来重命名

(1)模块内部使用

    var $ = require('./libs/jquery');
    require('./libs/jquery-themeswitch')($);
    require('./libs/jquery-ui')($);         //demo涉及jquery ui组件

    $(document).ready(function(){          //在DOM加载完成时运行代码

        $('#elem').themeswitcher();
        ...

    }
    ...

(2)在script代码片段中

seajs.use(['./libs/jquery','./libs/jquery-themeswitcher', './lib/jquery-ui'],
      function ($, themeswitcher,jqueryui){

        themeswitcher($);               //init jquery plugin     
        jqueryui($);

        $(function(){                   //dom ready调用的另外一种方式

            $('#elem').themeswitcher()
            ...

        });

   });

优缺点对比:

优点: 
* 依赖管理自动化 
* 支持多个版本的jQuery使用。(需要这个优点吗?)

缺点: 
* 每次调用一次require('plugin')($),会重新初始化一次插件 
* 调用方式也不是很方便,调用代码不是很直观

提示:可以在jQuery中添加一个cachedPlugins对象来保存加载过的插件模块id来防止重复加载

3.另外一种插件模块化方式

假定我们去掉jquery多版本的支持,让每个jquery插件模块返回$,看看代码调用方式是否会更自然一些。 
另外每个模块只能被编译一次,利用该特性,我们还可以做到让每个插件只会被初始化一次。

说明:模块编译过程就是构建模块的exports的过程。

还以themeswitcher为例子:

jquery-theme-switcher.js

define(function (require, exports, module) {

    var jQuery  = require('./jquery');

    require('./jquery-cookie');

    //put plugin in code here

    return jQuery;

});

(1)模块内部使用

    require('./libs/jquery-ui');   //可以不处理返回值    
    var $ = require('./libs/jquery-themeswitch')  //返回的还是$

     $(function(){

         $('#elem').themeswitcher();

     });

    ...

(2)在script代码片段中

seajs.use(['./libs/jquery-themeswitcher', './lib/jquery-ui'],function ($){

        $(function(){

            $('#elem').themeswitcher()
            ...

        });

   });

4.简化jquery插件的引用

如果你使用的插件比较多,还可以通过这样的方式来简化jquery插件的引用。 
定义一个myjquery.js

define(function(require) {

    require('some-plugin1');  //会自动加载相关的依赖插件
    require('some-plugin2');  //如果记不清依赖关系,重复require也没有影响。
    require('some-plugin3');  

    return require('some-plugin');  //每个插件模块都会返回$,取最后一个返回就可以了。


});

在其他的业务代码中,你只需要引入自己定制好的myjquery.js即可。 
注意不要在该文件中引入过多的模块,避免影响性能,其他不常用的插件可以按需加载。

main.js

define(function(require) {

   var $ =  require('./myjquery');  //所有你定制加载的插件都已经初始化好了

   //do something

});
分享到:
评论

相关推荐

    把jQuery的类、插件封装成seajs的模块的方法

    在JavaScript的世界里,Seajs是一个流行的模块加载器,它遵循CommonJS规范,使得代码组织更加模块化。...通过这种方式,我们可以在Seajs环境下充分利用jQuery的强大力量,同时保持代码的模块化和组织性。

    SeaJS(Javascript 模块加载框架) v1.0.2

    SeaJS 的出现,使得在前端开发中可以像在服务器端使用Node.js那样,方便地进行模块化的编程。 SeaJS的核心功能包括以下几个方面: 1. **模块定义**:SeaJS 使用 `seajs.use` 和 `define` 方法来定义和加载模块。`...

    模块化的js.pdf

    在非模块化环境下,引入jQuery、jQuery插件和其他自定义脚本会导致复杂的文件依赖问题。而采用CMD规范后,我们只需在`test.html`中引入SeaJS加载器,然后通过`seajs.use`函数指定需要加载的模块,如`index.js`,即可...

    jquery配合seajs框架实现返回顶部特效.zip

    综上所述,"jquery配合seajs框架实现返回顶部特效"项目展示了如何将传统的 jQuery 动画和事件处理能力与现代的前端模块化工具 SeaJS 结合,以创建一个既实用又具有良好用户体验的功能。同时,它也涉及到 CSS 和 ...

    基于RequireJS和JQuery的模块化编程日常问题解析

    在RequireJS中使用jQuery时,可以在RequireJS的配置中设置jquery模块的路径,然后在模块依赖中引入jquery,这样就可以在模块内部使用$符号或者jQuery变量进行操作了。 在实际应用中,模块化编程可以带来很多好处。...

    Seajs是什么及sea.js 由来,特点以及优势

    Seajs 遵循 Common Module Definition (CMD) 规范,该规范是由 SeaJS 社区推广的一种模块化编程方式。CMD 的核心思想是延迟执行和依赖注入,使得代码更具灵活性和可维护性。 SeaJS 的主要特点是: 1. **模块化**:...

    seajs加载jquery时提示$ is not a function该怎么解决

    在JavaScript的世界里,模块化是组织代码的一种重要方式,它能帮助我们保持代码的清晰性和可维护性。AMD(Asynchronous Module Definition)和CMD(Common Module Definition)是两种常见的模块化规范,它们分别由...

    seajs中模块依赖的加载处理实例分析

    了解了上述知识点,我们能够更加高效地在项目中使用SeaJS来管理JavaScript代码的模块化和依赖,实现更优雅的代码结构和更高的性能表现。同时,对URI、URL和URN的理解也会帮助我们在开发中准确使用这些资源标识符。

    struts2+Jquery分页插件

    以struts2标签的形式提供分页功能,使用简便,杜绝手工去拼分页标签的样式。目前提供了两种方式,直接原生的jquery调用,使用seajs模块化的方式。 源码地址:http://code.google.com/p/paginationex/source/checkout

    jQuery遮罩Loading加载特效.zip

    在这些文件中,jQuery库和自定义的jQuery插件可能会通过这些模块管理器进行加载。RequireJS使用AMD(Asynchronous Module Definition)规范,而Sea.js则遵循CMD(Common Module Definition)规范。 在`src`目录下,...

    javascript模块化是什么及其优缺点介绍

    JavaScript模块化是现代Web开发中不可或缺的一部分,随着前端技术的快速发展,如Backbone、Ember.js、Spine.js和Batman.js等MVC框架以及CommonJS、AMD、Node.js、RequireJS、SeaJS和curljs等模块化解决方案的普及,...

    关于seaJsDemo

    Sea.js 是一个用于浏览器端模块加载的工具,它遵循 CommonJS 规范,使得 JavaScript 开发可以采用模块化的组织方式,提高代码的可维护性和复用性。这个名为 "Sea.js Demo" 的项目旨在展示 Sea.js 如何在实际应用中...

    SeaJS入门教程系列之SeaJS介绍(一)

    总结来说,SeaJS为JavaScript开发提供了一种模块化、高效且易于管理的方式。它通过遵循CommonJS规范,简化了模块加载过程,解决了传统JavaScript开发模式中常见的依赖管理问题,使得代码结构更加清晰,开发效率得到...

    sea.js常用的api简易文档

    Sea.js 是一款轻量级的前端模块加载器,它遵循 CommonJS 规范,使得 JavaScript 可以实现模块化开发。以下是一些 Sea.js 的常用 API 和其应用示例: ### 1. `seajs.config` `seajs.config` 用于配置 Sea.js 的加载...

    JavaScript模块规范之AMD规范和CMD规范

    目前,前端开发中采用模块化编程是非常重要的,而SeaJS因其灵活性和适应性,仍是一种实用的选择,尽管可能需要对某些插件进行适配。 总结一下AMD和CMD的主要区别: 1. 依赖执行时机:AMD通常在定义时执行依赖,CMD...

    web前端问题[归类].pdf

    - 包括数据类型、面向对象、继承、闭包、插件、作用域、跨域、原型链、模块化、自定义事件、内存泄漏、事件机制、异步处理、模板引擎等。 13. **其他技术**: - 涉及HTTP协议、安全性、正则表达式、性能优化、...

Global site tag (gtag.js) - Google Analytics