seaJs的模块定义和模块加载浅析


Posted in Javascript onJune 06, 2014

SeaJS 是由玉伯开发的一个遵循 CommonJS 规范的模块加载框架,可用来轻松愉悦地加载任意 JavaScript 模块和css模块样式。SeaJS非常小巧,小巧在于压缩和gzip后体积只有4K,而且接口和方法也非常少,SeaJS 就两个核心:模块定义和 模块的加载及依赖关系。SeaJS非常强大,SeaJS可以加载任意 JavaScript 模块和css模块样式,SeaJS会保证你在使用一个模块时,已经将所依赖的其他模块载入到脚本运行环境中。玉伯的说法,SeaJS可以让你享受写代码的乐趣,不用去管那些加载的问题。你是否厌倦了如此多的js和css引用,我数了一下我们公司网站的个人主页首页上有39个css和js引用,带来的影响可想而知:

1.不利于维护,前端后端都一样
2.http请求过多,当然这个可以通过合并解决,但是如果没有后端直接合并,人工成本非常大,就算后端合并,维护的时候,这么长的一个字符串,眼睛肯定看花

用SeaJS就能非常好的解决这些问题。

模块的定义define

定义一个模块比较简单,例如定义一个sayHello模块,建一个sayHello.js文档:

define(function(require,exports,module){
 exports.sayHello = function(eleID,text) {
  document.getElementById(eleID).innerHTML=text;
 };
});

这里先看一下exports参数,exports参数是用来向外提供模块的 API.也就是通过这个exports其他的模块就能访问sayHello方法。

模块的加载use

例如我们页面上有一个id为“out”的元素,要输出“Hello SeaJS!”,
那么我们可以先引入sea.js
然后使用sayHello模块:

seajs.use("sayHello/sayHello",function(say){
 say.sayHello("out","Hello SeaJS!");
});

这里的use就是使用模块的方法:

第一个参数就是模块表示,他是相对于sea.js的相对路径来表示,sayHello.js后面的“.js”后缀可以省略,当然这个模块标识还有很多方法,具体查看官方说明:http://seajs.com/docs/zh-cn/module-identifier.html
第一个参数是一个callback函数。say.sayHello()就是调用sayHello模块的exports.sayHello方法,当然这callback函数中有个say参数。

模块的依赖关系

模块的依赖其实在模块定义的时候就应该存在了。比如说把上面的sayHello模块改写一下,假设我们已经有了一个通用的DOM模块,比如一些获取元素,设置样式等方法,例如这么一个DOM模块,如下编写DOM.js

define(function(require, exports, module) {
    var DOM = {
        /**
* 通过元素的id属性获取DOM对象,参数为字符串,或多个字符串
* @id getById
* @method getById
* @param {String} id the id attribute
* @return {HTMLElement | Object} The HTMLElement with the id, or null if none found.
*/
        getById: function() {
            var els = [];
            for (var i = 0; i < arguments.length; i++) {
                var el = arguments[i];
                if (typeof el == "string") {
                    el = document.getElementById(el);
                }
                if (arguments.length == 1) {
                    return el;
                }
                els.push(el);
            }
            return els;
        },
        /**
* get 获取对象,可以传入对象或字符串,如果传入字符串者以document.getElementById()的方式获取对象
* @id get
* @param {String} el html element
* @return {Object} HTMLElement object.
*/
        get: function(el) {
            if (el & amp; amp; amp; & amp; amp; amp; (el.tagName || el.item)) {
                return el;
            }
            return this.getById(el);
        }
    };
    return DOM;
});

那么sayHello模块可以这样编写,为了不影响原来的demo页面,所以我定一个新的sayHelloA模块,我们可以这样编写sayHelloA.js:
define(function(require, exports, module) {
    var DOM = require("DOM/DOM");
    require("sayHelloA/sayHello.css");
    exports.sayHello = function(eleID, text) {
        DOM.get(eleID).innerHTML = text;
    };
});

require 函数就是用来建立模块的依赖关系,比如上面sayHelloA模块,就是依赖于DOM模块,因为用到了DOM模块的get方法。
注意这里的var DOM=require("DOM/DOM"),这句是将应用进来的DOM模块赋值给DOM;require("sayHelloA/sayHello.css")是直接应用sayHello.css css模块或者说文件。这样页面上会引用这个css文件。

最近这几天一直捣腾SeaJS,越捣腾越喜欢,感谢玉伯!感谢SeaJS!当然你可能觉得这么简单的几个实例没必要这么做。确实如果js文件少的小项目感觉不错模块化的优势,但是,更多的在js文件多或着中型以上项目这个模块化的优势就体现出来了。

Javascript 相关文章推荐
改进:论坛UBB代码自动插入方式
Dec 22 Javascript
10个基于jQuery或JavaScript的WYSIWYG 编辑器整理
May 06 Javascript
5秒后跳转效果(setInterval/SetTimeOut)
May 03 Javascript
javascript实现的弹出层背景置灰-模拟(easyui dialog)
Dec 27 Javascript
jQuery函数map()和each()介绍及异同点分析
Nov 08 Javascript
jQuery实现数秒后自动提交form的方法
Mar 05 Javascript
javascript中利用柯里化函数实现bind方法【推荐】
Apr 29 Javascript
深入理解JavaScript中的call、apply、bind方法的区别
May 30 Javascript
完美解决jQuery的hover事件在IE中不停闪动的问题
Feb 10 Javascript
canvas红包照片实例分享
Feb 28 Javascript
JS实现unicode和UTF-8之间的互相转换互转
Jul 05 Javascript
手把手带你入门微信小程序新框架Kbone的使用
Feb 25 Javascript
使用GruntJS构建Web程序之Tasks(任务)篇
Jun 06 #Javascript
javascript中加号(+)操作符的一些神奇作用
Jun 06 #Javascript
使用GruntJS构建Web程序之合并压缩篇
Jun 06 #Javascript
Javascript动态引用CSS文件的2种方法介绍
Jun 06 #Javascript
jquery 隐藏与显示tr标签示例代码
Jun 06 #Javascript
Node.js中对通用模块的封装方法
Jun 06 #Javascript
JavaScript中对循环语句的优化技巧深入探讨
Jun 06 #Javascript
You might like
PHP操作XML作为数据库的类
2010/12/19 PHP
Laravel 5框架学习之用户认证
2015/04/09 PHP
yii2使用ajax返回json的实现方法
2016/05/14 PHP
PHP面向对象五大原则之单一职责原则(SRP)详解
2018/04/04 PHP
PHP+MySQL使用mysql_num_rows实现模糊查询图书信息功能
2018/05/31 PHP
JQuery select控件的相关操作实现代码
2012/09/14 Javascript
js与jquery回车提交的方法
2015/02/03 Javascript
jQuery实现鼠标滑向当前图片高亮显示并且其它图片变灰的方法
2015/07/27 Javascript
基于Css3和JQuery实现打字机效果
2015/08/11 Javascript
JavaScript实现的MD5算法完整实例
2016/02/02 Javascript
如何判断Javascript对象是否存在的简单实例
2016/05/18 Javascript
AngularJs ng-repeat 嵌套如何获取外层$index
2016/09/21 Javascript
jquery购物车结算功能实现方法
2020/10/29 Javascript
js自定义QQ菜单效果
2017/01/10 Javascript
ES6学习教程之块级作用域详解
2017/10/09 Javascript
javascript实现移动端触屏拖拽功能
2020/07/29 Javascript
[05:03]显微镜下的DOTA2第十期——Ti3豪之超神幽鬼
2014/06/23 DOTA
[06:44]2014DOTA2国际邀请赛-钥匙体育馆开战 开幕式振奋人心
2014/07/19 DOTA
[01:32]dota2拉比克至宝(222)
2018/12/20 DOTA
详解Python中find()方法的使用
2015/05/18 Python
Python实现信用卡系统(支持购物、转账、存取钱)
2016/06/24 Python
Python Queue模块详细介绍及实例
2016/12/27 Python
python中的计时器timeit的使用方法
2017/10/20 Python
Python读取excel指定列生成指定sql脚本的方法
2018/11/28 Python
python列表删除和多重循环退出原理详解
2020/03/26 Python
python3实现将json对象存入Redis以及数据的导入导出
2020/07/16 Python
CSS3的Flexbox布局的简明入门指南
2016/04/08 HTML / CSS
CSS3实现3D翻书效果
2016/06/20 HTML / CSS
科颜氏美国官网:Kiehl’s美国
2017/01/31 全球购物
介绍一下XMLHttpRequest对象
2012/02/12 面试题
求职信的要素有哪些呢
2013/12/26 职场文书
运动会广播稿200字
2014/01/15 职场文书
购房协议书范本
2014/04/11 职场文书
学习与创新自我评价
2015/03/09 职场文书
《跨越海峡的生命桥》教学反思
2016/02/18 职场文书
CSS3实现列表无限滚动/轮播效果
2021/06/23 HTML / CSS