aganliang 2011-10-26
RequireJS发布1.0.0了,很值得关注,看是否有可借鉴之处。
本次比较不涉及具体实现代码,主要比较两者的API设计。
http://requirejs.org
http://seajs.com
从定位谈起
首先,从http://requirejs.org首页可以得知,RequireJS的定位是:
RequireJS是一个JavaScript文件和模块加载器,特别为浏览器优化,同时也可运行在Rhino和Node环境中。
SeaJS的定位是:
SeaJS是一个适用于浏览器端的JavaScript模块加载器。
不要小看这两句话,任何类库/框架的定位,或者说愿景/目标,最终会决定该类库/框架的方方面面。比如:
RequireJS的定位中,除了是模块加载器,还是文件加载器,这决定了RequireJS需要实现类似LABjs等scriptloader的功能。LABjs的核心功能是异步加载脚本并提供运行的依赖等待:
$LAB .script("a.js") .script("b.js").wait() .script("c.js");
为了提供类似功能,RequireJS开发了order插件:
require(["order!one.js", "order!two.js", "order!three.js"], function () { //This callback is called after the three scripts finish loading. });
order功能是JavaScript文件加载器必备的功能,RequireJS有文件加载器的定位,因此才有了order插件的设计。
而对于SeaJS来说,定位为很纯粹的模块加载器,因此不需要考虑普通脚本的order加载,如果需要脚本加载功能,直接和LABjs一块用就好:
define(function(require) { var $LAB = require('labjs/2.0.3/lab.js'); $LAB .script('a.js') .script('b.js').wait() .scrpt('c.js'); );
SeaJS推荐用组合的思路解决问题:LABjs+SeaJS=JavaScript文件和模块加载器。
上面是SeaJS的狭义定位,SeaJS还有一个广义定位:
SeaJS是浏览器端的NodeJS.
在广义定位下,SeaJS包括以下部分:
1.一套模块书写格式。
2.一个适用于浏览器端的模块加载器。
3.一组默认推荐的模块。
4.类似npm的包管理工具。
5.调试等开发者工具。
6.等等。
狭义定位对应github中的:https://github.com/seajs/seajs
广义定位对应github中的:https://github.com/seajs
RequireJS和SeaJS狭义定位上的差异,将直接导致两者之间的最佳使用场景和API设计差异,后续博文会进一步提及。
SeaJS广义定位中的定语很重要,是“浏览器端的”,这将直接决定SeaJS和NodeJS的差异,后续博文会进一步提及。
兼容性
requirejs.org首页还列举了RequireJS支持的浏览器,这和SeaJS没什么差异。其实两者涉及到的DOM操作都不多,大部分代码是纯JavaScript代码,兼容性上都很不错。
参考文章
1.http://blog.getify.com/2010/12/on-script-loaders/
后续博文地址:http://lifesinger.wordpress.com/