天天看點

從 RequireJS 到 SeaJS(5)

這是該系列的最後一篇。

作為子產品加載器,最核心的是:子產品書寫格式。從表層看,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 的例子一直是單項目,類庫和業務腳本都放在一起:

這種使用場景下,RequireJS 和 SeaJS 半斤八兩,彼此彼此。

但上面的組織方式不是 SeaJS 推薦的。SeaJS 推薦通用類庫獨立存放:

這樣,不同項目之間,可共用 libs. libs 的版本維護也很友善。比如:在 requirejs 裡,如果用到 jquery, 當 jquery 更新時,得重新打包 require-jquery.js. 在 SeaJS 裡則不需要更新 sea.js, 隻需要更新配置中的 alias.

SeaJS 很适合大型網站,伸縮性很好,能适應的場景很廣。這受益于 SeaJS 的廣義定位:浏覽器端的 NodeJS.

RequireJS 我不是很喜歡,主要是因為其定位不純粹,以及 API 在我看來不夠優雅。但 RequireJS 的作者依舊是很讓人敬佩的一個牛人。從在 CommonJS 積極讨論,到非常有激情地開發 RequireJS,以及後續堅持不懈布道,這些工作,看起來不難,實際上非常不易,很佩服這份激情、執着和毅力。

作為 SeaJS 的作者,我盡可能公平公正評價 RequireJS. 如果上面的文字有失偏頗,還希望你熱心指正,歡迎所有真心誠懇的交流讨論。

(完)

感謝玉伯!!!!