前端模块化
前端模块规范有三种:CommonJs,AMD和CMD
首先了解下模块定义:
模块就是实现特定功能的文件,把几个函数放在一个文件里就构成了一个模块。
模块写成一个对象,模块成员都封装在对象里,通过调用对象属性,访问使用模块成员。但同时也暴露了模块成员,外部可以修改模块内部状态。外部无法访问内部私有变量。
CommonJs是服务器端,而AMD和CMD则是浏览器环境
异同点:
AMD : RequireJS 在推广过程中对模块定义的规范化产出,提前执行(异步加载:依赖先执行)+延迟执行
CMD : SeaJS 在推广过程中对模块定义的规范化产出,延迟执行(运行到需加载,根据顺序执行)
最近主要学seajs,所以了解了下,做下笔记:
CMD(翻译Common Module Definition通用模块定义)有个浏览器的实现SeaJS,SeaJS要解决的问题和requireJS一样
在 CMD 规范中,一个模块就是一个文件。代码的书写格式如下
define(function(require, exports, module) {
//require是可以把其他模块导入进来的一个参数;
//exports是可以把模块内的一些属性和方法导出的;
//module 是一个对象,上面存储了与当前模块相关联的一些属性和方法
});先写个简单例子:
// 定义模块
myModule.js define(function(require, exports, module) {
var $ = require('jquery.js')
$('div').addClass('active');
exports.data = 1;
});
// 加载模块
seajs.use(['myModule.js'], function(my){
var star= my.data;
console.log(star);
});接下来是sea.js的使用:
1 .引入sea.js的库
2. 定义模块
- define
3.调用模块
-exports
-sea.js.use
4.依赖模块
-require
以下是我最近做的一个例子:前提引入所需文件--sea.js,jquery.js,这些官方文档可以下载
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script src="sea-modules/seajs/seajs/2.2.0/sea.js"></script>
<link rel="stylesheet" href="./hello.css">
<script>
seajs.config({
//设置路径
// paths: {
// '1.01.1': './sea-modules/jquery/jquery/1.10.1/'
// },
// 设置别名,方便调用
alias: {
'jquery': './sea-modules/jquery/jquery/1.10.1/jquery'
}
});
seajs.use(['./head'], function (header) {
new header()
});
</script>
</head>
<body>
</body>
</html>这里的path是设置路径,方便跨目录调用。可以省略掉,和alias写到一起。
接下来是head模块
define(function(require, exports, module) {
// 别名配置,配置之后可在模块中使用require调用 require('jquery');
// alias
var $ = require('jquery')
function header(){
this.render()
}
header.prototype.render = function(){
$('<h1 style="display:none;">Hello SeaJS !</h1>' +
'<div class="show"></div>')
.appendTo('body').fadeIn(0)
}
return header
});
当然也可以加载多个模块:
用来在页面中加载一个或多个模块。
seajs.use(id, callback?)
// 加载一个模块
seajs.use('./a');
// 加载一个模块,在加载完成时,执行回调
seajs.use('./a', function(a) {
a.doSomething();
});
// 加载多个模块,在加载完成时,执行回调
seajs.use(['./a', './b'], function(a, b) {
a.doSomething();
b.doSomething();
});