RequireJS 發(fā)布 1.0.0 了,很值得關(guān)注,看是否有可借鑒之處。
本次比較不涉及具體實現(xiàn)代碼,主要比較兩者的 API 設(shè)計。
http://requirejs.org
http://seajs.com
從定位談起
首先,從 requirejs.org 首頁可以得知,RequireJS 的定位是:
RequireJS 是一個 JavaScript 文件和模塊加載器,特別為瀏覽器優(yōu)化,同時也可運行在 Rhino 和 Node 環(huán)境中。
SeaJS 的定位是:
SeaJS 是一個適用于瀏覽器端的 JavaScript 模塊加載器。
不要小看這兩句話,任何類庫/框架的定位,或者說愿景/目標,最終會決定該類庫/框架的方方面面。比如:
LABjs 的核心功能是異步加載腳本并提供運行的依賴等待:
1 | $LAB |
2 | .script("a.js") |
3 | .script("b.js").wait() |
4 | .script("c.js"); |
為了提供類似功能,RequireJS 開發(fā)了 order 插件:
1 | require(["order!one.js", "order!two.js", "order!three.js"], function () { |
2 | //This callback is called after the three scripts finish loading. |
3 | }); |
order 功能是 JavaScript 文件加載器必備的功能,RequireJS 有文件加載器的定位,因此才有了 order 插件的設(shè)計。
而對于 SeaJS 來說,定位為很純粹的模塊加載器,因此不需要考慮普通腳本的 order 加載,如果需要腳本加載功能,直接和 LABjs 一塊用就好:
1 | define(function(require) { |
2 | var $LAB = require('labjs/2.0.3/lab.js'); |
3 |
4 | $LAB |
5 | .script('a.js') |
6 | .script('b.js').wait() |
7 | .scrpt('c.js'); |
8 | ); |
SeaJS 推薦用組合的思路解決問題:LABjs + SeaJS = JavaScript 文件和模塊加載器。
上面是 SeaJS 的狹義定位,SeaJS 還有一個廣義定位:
SeaJS 是瀏覽器端的 NodeJS.
在廣義定位下,SeaJS 包括以下部分:
- 一套模塊書寫格式。
- 一個適用于瀏覽器端的模塊加載器。
- 一組默認推薦的模塊。
- 類似 npm 的包管理工具。
- 調(diào)試等開發(fā)者工具。
- 等等。
狹義定位對應(yīng) github 中的:seajs/seajs
廣義定位對應(yīng) github 中的:seajs
RequireJS 和 SeaJS 狹義定位上的差異,將直接導致兩者之間的最佳使用場景和 API 設(shè)計差異,后續(xù)博文會進一步提及。
SeaJS 廣義定位中的定語很重要,是“瀏覽器端的”,這將直接決定 SeaJS 和 NodeJS 的差異,后續(xù)博文會進一步提及。
兼容性
requirejs.org 首頁還列舉了 RequireJS 支持的瀏覽器,這和 SeaJS 沒什么差異。其實兩者涉及到的 DOM 操作都不多,大部分代碼是純 JavaScript 代碼,兼容性上都很不錯。