這是該系列的最後一篇。
作為子產品加載器,最核心的是:子產品書寫格式。從表層看,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. 如果上面的文字有失偏頗,還希望你熱心指正,歡迎所有真心誠懇的交流讨論。
(完)
感謝玉伯!!!!