这是该系列的最后一篇。
作为模块加载器,最核心的是:模块书写格式。从表层看,RequireJS 和 SeaJS 最大的差异就是各自默认推荐的模块书写格式不同。
由于 RequireJS 支持 Simplified CommonJS Wrapper, 一定程度上可以说 SeaJS 是 RequireJS 的一个子集。甚至可以认为:SeaJS 是 RequireJS 中的 The Good Parts.(RequireJS 作者肯定不会同意,不过从社区中可以看出很多人很喜欢 Simplified CommonJS Wrapper 格式,这与 SeaJS 遵循的 Wrappings 基本一致。)
功能差异
从功能上讲,RequireJS 很丰富。下面这些功能是 RequireJS 有,而 SeaJS 没有的:
- domReady 插件
- i18n 插件
- order 插件
- 通过 r.js 支持 packages
- 支持 Web Worker
- 支持 Rhino
这些功能,SeaJS 现在没有,以后也不打算提供。因为 SeaJS 的定位是:浏览器端的模块加载器。
SeaJS 也有一些非常好用的功能,RequireJS 却没有的:
- 映射插件,可用来做 在线本地调试
- 通过 map 配置,对版本和时间戳提供更方便的管理
- 通过 preload 配置,可以预加载模块
- 更开放的插件机制,并默认提供 plugin-json 和 plugin-less
- 支持 css 文件的加载
- 由于延迟执行机制,可以很便捷地探测 404 等错误请求
场景差异
在使用场景上,两者之间的差异不小。
RequireJS 的例子一直是单项目,类库和业务脚本都放在一起:
project -- scripts -- require-jquery.js -- main.js -- sub -- some.js ... -- project.html
这种使用场景下,RequireJS 和 SeaJS 半斤八两,彼此彼此。
但上面的组织方式不是 SeaJS 推荐的。SeaJS 推荐通用类库独立存放:
libs --seajs/1.0.2/sea.js --jquery/1.6.4/jquery.js --underscore/1.2.1/underscore.js ... project-assets -- main.js -- sub -- some.js ... project -- project.html
这样,不同项目之间,可共用 libs. libs 的版本维护也很方便。比如:在 requirejs 里,如果用到 jquery, 当 jquery 更新时,得重新打包 require-jquery.js. 在 SeaJS 里则不需要更新 sea.js, 只需要更新配置中的 alias.
SeaJS 很适合大型网站,伸缩性很好,能适应的场景很广。这受益于 SeaJS 的广义定位:浏览器端的 NodeJS.
写在最后
RequireJS 我不是很喜欢,主要是因为其定位不纯粹,以及 API 在我看来不够优雅。但 RequireJS 的作者依旧是很让人敬佩的一个牛人。从在 CommonJS 积极讨论,到非常有激情地开发 RequireJS,以及后续坚持不懈布道,这些工作,看起来不难,实际上非常不易,很佩服这份激情、执着和毅力。
作为 SeaJS 的作者,我尽可能公平公正评价 RequireJS. 如果上面的文字有失偏颇,还希望你热心指正,欢迎所有真心诚恳的交流讨论。
(完)
感谢玉伯!!!!