seajs初学
seajs初学
a.什么是seaJS
SeaJS是一个遵循 CMD (通用模块定义)规范的JavaScript模块加载框架,可以像 Node.js 一般书写模块代码;
可以实现JavaScript的模块化开发及加载机制。
b.引用-reference
去seajs官网下载http://seajs.org/docs/#downloads,在页面头部head标签内引入seaJS,如下:
<script src="js/sea.js" id="seajsnode"></script>
,注意,这里加上了id=”seajsnode”,原因如下:
-
- SeaJS加载自身的script标签的其他属性(如data-config、data-main)等来实现不同的功能
-
- SeaJS内部通过document.getElementById(“seajsnode”)来获取这个script标签
入口-eajs.use
seajs.use 用来在页面中加载一个或多个模块。
example,如下文件结构
1
2
3
4
5
6
-helloSeajs
index.html
-js
seajs
main.js
a.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>seajs</title>
<script src="js/sea.js" id="seajsnode" ></script>
<script>
seajs.use("main");
</script>
</head>
<body>
hi
</body>
</html>
attention,以上index.html引用main.js的目录是相对于seajs所在的路劲
在调用 seajs.use 之前,需要先引入 sea.js 文件
// 加载一个模块
seajs.use('mian');
// 加载一个模块,在加载完成时,执行回调
seajs.use('a', function(a) {
a.doSomething();
});
// 加载多个模块,在加载完成时,执行回调
seajs.use(['main', 'a'], function(main, a) {
main.doSomething();
a.doSomething();
});
seajs.config 配置
seajs.config({
// 设置路径,方便跨目录调用
paths: {
'arale': 'https://a.alipayobjects.com/arale',
'jquery': 'https://a.alipayobjects.com/jquery'
},
// 设置别名,方便调用
alias: {
'class': 'arale/class/1.0.0/class',
'jquery': 'jquery/jquery/1.10.1/jquery'
}
});
define 定义模块
Sea.js 推崇一个模块一个文件,遵循统一的写法: define define(factory) define 接受 factory 参数,factory 可以是一个函数,也可以是一个对象或字符串。
//a.js
define({
"my":"pengyouyi"
})
or
//a.js
define(function(require,exports,module){
exports.sayhi = function(){
alert("hello world");
};
})
or
//a.js
define(function(require,exports,module){
var $ = require('jquery');
var a = {};
a.sayhi = function(){
$("#demo").append("hello seajs");
};
module.exports = a;
})
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>seajs</title>
<script src="js/sea.js" id="seajsnode"></script>
<script>
seajs.use(["main","a"],function(main,a){
//console.log(a)
a.sayhi();
});
</script>
</head>
<body>
<div id="demo"></div>
</body>
</html>
attention: 上面var $ = require(“jquery”)的使用,需要按照CMD定义封装一次jQuery原文件
define(function(){
//jquery源代码
return $.noConflict();
});
define 更多https://github.com/seajs/seajs/issues/242
require
require 用来获取指定模块的接口。
//main.js
define(function(require){
var a = require('a');
a.sayhi();
})
attention
1.模块 factory 构造方法的第一个参数 必须 命名为 require , 不能是req等其他的
2.不要重命名 require 函数,或在任何作用域中给 require 重新赋值。 如var req = require; …are error
3.require 的参数值 必须 是字符串直接量。 require(myModule); … are error
require 更多https://github.com/seajs/seajs/issues/259
require.async
用来在模块内部异步加载一个或多个模块。
//other.js
define(function(require) {
// 异步加载一个模块,在加载完成时,执行回调
require.async('./b', function(b) {
b.doSomething();
});
// 异步加载多个模块,在加载完成时,执行回调
require.async(['./c', './d'], function(c, d) {
c.doSomething();
d.doSomething();
});
});
exports
用来在模块内部对外提供接口。
define(function(require,exports){
exports.foo = "bar";
exports.add = function(a,b){
return a + b;
}
})
module.exports
与 exports 类似,用来在模块内部对外提供接口。
define(function(require, exports, module) {
module.exports = {
foo: 'bar',
doSomething: function() {}
};
});