执行模块的机制大不同
-----------------------------------
因为 RequireJS 是执行的 AMD 规范, 所以全部的依赖模块都是先执行.
使用 RequireJS 默认定义模块的方式, 在理解上会更清楚一些, 但我的仍是偏心 require('./mod1') 这样的方式
define(['dep1', 'dep2'], function (dep1, dep2) {
//Define the module value by returning a value.
return function () {};
});
但愿文章没有误人子弟, 谢谢
@Jaward华仔 的意见, 请你们多看评论, 评论更有料...
---------------------------------------------------------------------------
SeaJS对模块的态度是懒执行, 而RequireJS对模块的态度是预执行
不明白? 让咱们来举个例子
以下模块经过SeaJS/RequireJS来加载, 执行结果会是怎样?
define(function(require, exports, module) {
console.log('require module: main');
var mod1 = require('./mod1');
mod1.hello();
var mod2 = require('./mod2');
mod2.hello();
return {
hello: function() {
console.log('hello main');
}
};
});
猜猜看?
先试试SeaJS的执行结果
require module: main
require module: mod1
hello mod1
require module: mod2
hello mod2
hello main
 |
很正常嘛, 我也是这么想的...
|
再来是RequireJS的执行结果
require module: mod1
require module: mod2
require module: main
hello mod1
hello mod2
hello main
 |
神马状况? 你他么是在逗我吗?
|
RequireJS你坑的我一滚啊, 这也就是为何我不喜欢RequireJS的缘由, 坑隐藏得太深了.
终于明白
玉伯说的那句: "
RequireJS 是没有明显的 bug,SeaJS 是明显没有 bug"是什么意思了
所以咱们得出结论(分别使用SeaJS 2.0.0和RequireJS 2.1.6进行测试)
-------------------------
SeaJS只会在真正须要使用(依赖)模块时才执行该模块
SeaJS是异步加载模块的没错, 但执行模块的顺序也是严格按照模块在代码中出现(require)的顺序, 这样才更符合逻辑吧! 你说呢, RequireJS?
而RequireJS会先尽早地执行(依赖)模块, 至关于全部的require都被提早了, 并且模块执行的顺序也不必定100%就是先mod1再mod2
所以你看到执行顺序和你预想的彻底不同! 颤抖吧~ RequireJS!
详细的代码请参考
-------------------------
SeaJS测试加载/执行模块
RequireJS测试加载/执行模块
后记
-------
注意我这里说的是执行(真正运行define中的代码)模块, 而非加载(load文件)模块.
模块的加载都是并行的, 没有区别, 区别在于执行模块的时机, 或者说是解析.
为了说明阻塞的问题, 翠花上图
 |
SeaJS的懒执行
|
 |
RequireJS的预执行
|
注意图中巨大的pinyin-dict.js模块, 取自
pinyin.js, 复制了N次后以增长它的"重量", 加强演示效果, 你们有兴趣的话能够亲手试试. 能够很明显的看出RequireJS的作法是并行加载全部依赖的模块, 并完成解析后, 再开始执行其余代码, 所以执行结果只会"停顿"1次, 完成整个过程是会比SeaJS要快. 而SeaJS同样是并行加载全部依赖的模块, 但不会当即执行模块, 等到真正须要(require)的时候才开始解析, 这里耗费了时间, 由于这个特例中的模块巨大, 所以形成"停顿"2次的现象, 这就是我所说的SeaJS中的"懒执行". 最后感谢你们的各类意见建议, 我这里并无说SeaJS与RequireJS哪一个更好一些, 仅仅是为了说明下他们的区别, 各类取舍请你们根据实际状况来定, 但愿能帮到你们.