SeaJS 是一个模块加载器,模块加载器须要实现两个基本功能:javascript
在 CMD 规范中,一个模块就是一个文件。代码的书写格式以下:css
define(factory)html |
// factory 为对象java
factory参数的使用以下:node
require是一个函数方法,用来获取其余模块提供的接口,并且是同步往下执行。require的模块不能被返回时,应该返回null。jquery
require.async(id, callback?):用来在模块内部异步加载模块,并在加载完成后执行指定回调。require的模块不能被返回时,callback应该返回null。callback接受返回的模块做为它的参数。编程
require.resolve(id):不会加载模块,只返回解析后的绝对路径缓存
为何那么死规定?!
首先你要知道SeaJS 是如何知道一个模块的具体依赖的。SeaJS 经过 factory.toString() 拿到源码,再经过正则匹配 require 的方式来获得依赖信息。这也是必须遵照 require 书写约定的缘由。异步
用来在模块内部对外提供接口。
exports 仅仅是 module.exports 的一个引用。在 factory 内部给 exports 从新赋值时,并不会改变 module.exports 的值。所以给 exports 赋值是无效的,不能用来更改模块接口。async
seajs.config({
base: 'http://code.jquery.com/'
});
// 在模块代码里:
require.resolve('jquery');
// 解析为 http://code.jquery.com/jquery.js
以下所示:
/js/b
可省略后缀.js,可是”.css” 后缀不可省略。
直接使用 script 标签同步引入sea.js文件后,就可使用seajs.use(id, callback?)在页面中加载模块了!
经过define定义许多模块后,得让它们能跑起来,以下:
最佳实践:
1
|
<script src="../gb/sea.js" id="seajsnode"></script>
|
讲到seajs.use,固然要提一下Sea.js 的调试接口。
模块加载大致流程:
文字描述:
RequireJS 遵循 AMD(异步模块定义)规范,SeaJS 遵循 CMD (通用模块定义)规范。
SeaJS按需执行依赖避免浪费,可是require时才解析的行为对性能有影响。
SeaJS是异步加载模块的没错, 但执行模块的顺序也是严格按照模块在代码中出现(require)的顺序。
RequireJS更听从js异步编程方式,提早执行依赖,输出顺序取决于哪一个 js 先加载完(不过 RequireJS 从 2.0 开始,也改为能够延迟执行)。若是必定要让 模块B 在 模块A 以后执行,须要在 define 模块时申明依赖,或者经过 require.config 配置依赖。