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 相关文章推荐
IE和FireFox(FF)中js和css的不同
Apr 13 Javascript
对 lightbox JS 图片控件进行了一下改造, 使其他支持复杂的图片说明
Mar 20 Javascript
JavaScript高级程序设计(第3版)学习笔记4 js运算符和操作符
Oct 11 Javascript
JS动态获取当前时间,并写到特定的区域
May 03 Javascript
js处理json以及字符串的比较等常用操作
Sep 08 Javascript
jquery 倒计时效果实现秒杀思路
Sep 11 Javascript
jQuery简单tab切换效果实现方法
Apr 08 Javascript
jQuery插件简单实现方法
Jul 18 Javascript
浅析C/C++,Java,PHP,JavaScript,Json数组、对象赋值时最后一个元素后面是否可以带逗号
Mar 22 Javascript
JavaScript错误处理操作实例详解
Jan 04 Javascript
axios实现文件上传并获取进度
Mar 25 Javascript
Node.js学习之内置模块fs用法示例
Jan 22 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
一条久听不愿放下的DIY森海MX500,三言两语话神奇
2021/03/02 无线电
PHP+Tidy-完美的XHTML纠错+过滤
2007/04/10 PHP
PHP has encountered an Access Violation 错误的解决方法
2010/01/17 PHP
用PHP即时捕捉PHP中的错误并发送email通知的实现代码
2013/01/19 PHP
php中JSON的使用与转换
2015/01/14 PHP
Thinkphp通过一个入口文件如何区分移动端和PC端
2017/04/18 PHP
异步javascript的原理和实现技巧介绍
2012/11/08 Javascript
jquery使用正则表达式验证email地址的方法
2015/01/22 Javascript
Hallo.js基于jQuery UI所见即所得的Web编辑器
2016/01/26 Javascript
jQuery获取父元素及父节点的方法小结
2016/04/14 Javascript
详解JavaScript中Hash Map映射结构的实现
2016/05/21 Javascript
EasyUI折叠表格层次显示detailview详解及实例
2016/12/28 Javascript
微信小程序中为什么使用var that=this
2019/08/27 Javascript
vue cli3 调用百度翻译API翻译页面的实现示例
2019/09/13 Javascript
uni-app 自定义底部导航栏的实现
2020/12/11 Javascript
three.js显示中文字体与tween应用详析
2021/01/04 Javascript
用javascript实现倒计时效果
2021/02/09 Javascript
[05:39]2014DOTA2西雅图国际邀请赛 淘汰赛7月14日TOPPLAY
2014/07/14 DOTA
Python socket套接字实现C/S模式远程命令执行功能案例
2018/07/06 Python
python pyinstaller打包exe报错的解决方法
2019/11/02 Python
Django启动时找不到mysqlclient问题解决方案
2020/11/11 Python
python绘制汉诺塔
2021/03/01 Python
乌克兰香水和化妆品网站:Notino.ua
2018/03/26 全球购物
Melissa鞋英国官方网站:Nonnon
2019/05/01 全球购物
美国领先的眼镜和太阳镜在线零售商:Glasses.com
2019/08/26 全球购物
《一件运动衫》教学反思
2014/02/19 职场文书
2014年元旦促销活动方案
2014/02/22 职场文书
授权委托书范本(单位)
2014/09/28 职场文书
热情服务标语
2014/10/07 职场文书
教代会闭幕词
2015/01/28 职场文书
博士生专家推荐信
2015/03/25 职场文书
2015年乡镇工作总结范文
2015/04/22 职场文书
2016年全国助残日活动总结
2016/04/01 职场文书
使用react+redux实现计数器功能及遇到问题
2021/06/02 Javascript
vue使用refs获取嵌套组件中的值过程
2022/03/31 Vue.js
详解Spring Bean的配置方式与实例化
2022/06/10 Java/Android