SeaJS 与 RequireJS 的差别对比

这篇文章主要介绍了SeaJS 与 RequireJS 的差别对比,本文主要对CMD规范和AMD规范的弊端作了对比,并作出了一个总结,须要的朋友能够参考下前端

“历史不是过去,历史正在上演。随着 W3C 等规范、以及浏览器的飞速发展,前端的模块化开发会逐步成为基础设施。一切终究都会成为历史,将来会更好。”——引用玉伯原文最后一段话,我我的也很是赞同。既然谈到了“将来”,我我的认为:前端 js 模块若是继续发展,其模块格式极可能会成为将来 WEB 一种标准规范,产生多种实现方式。就比如 JSON 格式同样,最终成为标准、被浏览器原生实现。浏览器

谁更有能成为将来的异步模块标准?SeaJS 遵循 CMD 规范,RequireJS 遵循 AMD 规范,先从这两种不一样的格式提及。异步

CMD模块化

CMD 模块依赖声明方式:函数

define(function (require) {
    var a = require('./a');
    var b = require('./b');
    // more code ..
})

CMD 依赖是就近声明,经过内部require方法进行声明。可是由于是异步模块,加载器须要提早加载这些模块,因此模块真正使用前须要提取模块里面全部的依赖。不管是加载器即时提取,仍是经过自动化工具预先提取,CMD 的这种依赖声明格式只能经过静态分析方式实现,这也正是 CMD 的弊端所在。工具

CMD 规范的弊端ui

不能直接压缩:require是局部变量,意味着不能直接的经过压缩工具进行压缩,若require这个变量被替换,加载器与自动化工具将没法获取模块的依赖。
模块书写有额外约定:路径参数不能进行字符串运算,不能使用变量代替,不然加载器与自动化工具没法正确提取路径。
规范以外的约定意味着更多的文档说明,除非它们也是规范中的一部分。spa

注:SeaJS 静态分析实现是把模块包toString()后使用正则提取require部分获得依赖的模块路径。设计

AMDcode

AMD 模块依赖声明方式:

define(['./a', './b'], function (a, b) {
    // more code ..
})

AMD 的依赖是提早声明。这种优点的好处就是依赖无需经过静态分析,不管是加载器仍是自动化工具均可以很直接的获取到依赖,规范的定义能够更简单,意味着可能产生更强大的实现,这对加载器与自动化分析工具都是有利的。

AMD 规范的弊端

依赖提早声明在代码书写上不是那么友好。
模块内部与 NodeJS 的 Modules 有必定的差别。
关于第二点的问题须要特别说明下。其实不管是 CMD 仍是 AMD 的异步模块,都没法与同步模块规范保持一致(NodeJS 的 Modules),只有谁比谁更像同步模块而已。AMD 要转换为同步模块,除了去掉define函数的包裹外,须要在头部使用require把依赖声明好,而 CMD 只须要去掉define函数的包裹便可。

从规范上来讲,AMD 更加简单且严谨,适用性更广,而在 RequireJS 强力的推进下,在国外几乎成了事实上的异步模块标准,各大类库也相继支持 AMD 规范。

但从 SeaJS 与 CMD 来讲,也作了不少不错东西:

一、相对天然的依赖声明风格 
二、小而美的内部实现 
三、贴心的外围功能设计 
四、更好的中文社区支持

若是有可能,我但愿看到 SeaJS 也支持 AMD,与前端社区大环境保持一致最终幸福的是广大开发者。

相关文章
相关标签/搜索