了解了 ID 規則,再來看 RequireJS API 文檔 就輕松多了。
作為子產品加載器,需要明确子產品應該怎樣寫,這就是子產品書寫格式(Module Authoring Format)。
對于檔案加載器來說,約定非常少,比如 LABjs 隻約定檔案裡不能有 document.write 等語句。
RequireJS 遵守的是 AMD 規範,SeaJS 遵守的是 Simple Wrappings 規範。
從表面上看,AMD 規範和 Wrappings 規範最大的不同是 factory 函數的參數不一樣:
factory 的參數差異,直接導緻 AMD 中的子產品是立刻執行的,而 Wrappings 中的子產品可以等到第一次 require 時才執行。這是當初 CommonJS 社群讨論最為激烈的争執點,彼此形成了不同的派系。理念上的差異,加上其他一些因素,最後直接導緻 RequireJS 從 CommonJS 中脫離,自立門戶成為了獨立的社群。
理念上無對錯。對于 SeaJS 來說,選擇的是延遲執行,盡量與 CommonJS 以及 NodeJS 的模型保持一緻。有興趣的可以閱讀我之前的博文:SeaJS 和 RequireJS 的異同
補充:每次想起這個話題,當初 CommonJS 社群的激烈讨論就曆曆在目。也正是因為理念上的差異,讓我有了實作 SeaJS 的想法。當初 RequireJS 作者非常強勢,雖然後來也支援了 Simplified CommonJS Wrapper, 但 CommonJS 原社群的不少人都不太認可 RequireJS 遵循的規範,并開始推出 BravoJS, FlyScript 等 loader, 可惜的是這些 loader 更新非常緩慢,目前 SeaJS 還算活躍的。
對于安裝了作業系統的計算機,最常用的啟動方法是摁一下開機鍵。
對于浏覽器,加載頁面的普适方式是在位址欄上輸入 url 并回車。
對于 NodeJS, 是在指令行中輸入:
所有這些都是“啟動”。在 RequireJS 和 SeaJS 中,最便捷的啟動是:
RequireJS 可以通過全局 require 方法來啟動:
注意:作為啟動用的 require, 參數必須是數組,即便隻加載一個檔案。這是 require 的陷阱之一,是由其設計導緻的(在 RequireJS 裡,require 還承擔了擷取子產品接口的功能),這種不純粹的設計是 SeaJS 不認可的。
SeaJS 裡,普适的啟動方式是:
可以認為 <code>seajs.use('xx')</code> 就是 <code>$ node xx</code>. 啟動是和具體加載器相關的,啟動之後,子產品代碼裡就不必再出現加載器相關的東西了。比如 node 的子產品代碼裡不會再出現 node. seajs 裡,也不推薦在子產品代碼裡出現 seajs (除了初始子產品裡可以用 <code>seajs.config</code> 進行配置)。
RequireJS 的優化工具是 r.js
SeaJS 的是打包部署工具 spm
兩者設計理念差異很大,在此就不比較了。