您的位置:首页 > 产品设计 > UI/UE

SeaJS与RequireJS最大的区别

2016-09-20 17:38 239 查看
执行模块的机制大不一样

-----------------------------------

由于 RequireJS 是执行的 AMD 规范, 因此所有的依赖模块都是先执行.

使用 RequireJS 默认定义模块的方式, 在理解上会更清楚一些, 但个人还是偏爱 require('./mod1') 这样的方式

define(['dep1', 'dep2'], function (dep1, dep2) {

    //Define the module value by returning a value.

    return function () {};
});

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哪个更好一些, 仅仅是为了说明下他们的区别, 各种取舍请大家根据实际情况来定, 希望能帮到大家.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: