seajs和requirejs技術(shù)指導文檔

昨天到今天,老衲翻閱數(shù)十篇技術(shù)文檔,為了搞明白seajs(CMD)和 requireJS(AMD)到底是個什么鬼,
當然也包括官網(wǎng)了,只是都不太盡如人意,理解起來感覺好費解,然后跟我的小伙伴交流了一晚上之后發(fā)現(xiàn)
了一個很形象的比喻,對于AMD和CMD的模式,其實理解的時候我借助了MVC這個結(jié)構(gòu)來理解,感覺理解起來
相對容易一點兒,對于MVC這個結(jié)構(gòu)我不做過多介紹,有興趣的可以去看看
http://www.cnblogs.com/aaronjs/p/3581904.html
下面進入我們正題,說的不好的地方歡迎指正,一塊學習進步.

咱們說道說道這兩個模塊兒開發(fā)的有趣的地方吧,我會用咱們常說的一句“我負責貌美如花,你負責掙錢養(yǎng)家”來
說道說道,其實說白了就是分工明確:
第一步、前端頁面的引入接口,他的作用就是進去接口;(PS:前端頁面直接展示給用戶,相當于你的女朋友只負責貌美如
花,但是你需要提供,提供一切的物質(zhì)支持就是money[對于requirejs和seajs來說就是給前端頁面提供一個接口]);
第二步、這個接口負責所有的依賴文件,還有需要的配置各種參數(shù),支持文件等等。
換句話說就是頁面上最直觀的顯示內(nèi)容的調(diào)用方法,還有各種事件等等
(就相當于你,準備怎樣讓你的女朋友貌美如花。你要給提供化妝品、衣服之類的,沒事肯定少不了);
第三步、到了這一層,其實就是具體的邏輯的處理了,這一層的邏輯處理也是給第二層提供依賴的文件(
就相當于,你要給你的女朋友買這買那,你具體的工作是什么,做多少份兼職可以滿足你的女朋友的物質(zhì)需求)

上邊兒說了這么多,其實就是為了想讓大家理解一下requirejs和seajs這兩種模塊化開發(fā)的形式是什么,怎樣分工的,
是不是多少有點兒進入狀態(tài)了

first.咱們先來說一下requirejs

requirejs.png

頁面的引入接口

<script data-main="js/app/r-index.js" src="js/lib/require.js"></script>

其中 r-index.js 就是相當于分工的第二步所在的位置,在這里邊兒,我們進行依賴文件的配置,
和對第一步前端頁面的顯示的支持
我們來看一下r-index.js是怎樣寫的

requirejs.config({
    baseUrl: 'js/',
    paths: {
        hammer: 'lib/hammer.min',
        jquery:'lib/jquery.min',
        cookie:'lib/jquery.cookie',
        template:'lib/template'
    }
});

requirejs(['hammer', 'jquery', 'cookie','template','app/data'], function(a,b,c,template,service) {
    service.getAll();    
    service.getOne();
} 

對這個就是進行基礎的業(yè)務的處理,

'app/data'就是具體的邏輯的處理,這些給第二步提供了所有的邏輯支持

下面我們來看一下 data.js data.js 所有第二步用到的邏輯都放在這里邊進行處理

define(['jquery','cookie'],function () {
 return {
        /*所有數(shù)據(jù)*/
        getAll:function (){
          return alldata;
        },
        /*指定id的數(shù)據(jù)*/
        getOne:function (id){
            
        }
    }
})

有了上邊兒requirejs 的案例基礎我們來理解seajs的時候就方便的多了。
second.下面我們來看一下seajs的書寫規(guī)范

seajs.png

首先說一下第一步,接口

<script>
    seajs.use('js/app/s-index.js');
</script>

然后看一下第二步的書寫方式

define(function (requie, exports, module) {
    
    //依賴可以就近書寫
    var hammer = require('js/lib/hammer.min');
    ...
    var app = requie('app/data');       
    app.getAll();
    app.getOne();
    ...
    //軟依賴
    if (status) {
    
        var b = requie('./b');
        b.test();
    }
});

然后看一下第三步的書寫方式

module.export =  {
        /*所有數(shù)據(jù)*/
        getAll:function (){
          return alldata;
        },
        /*指定id的數(shù)據(jù)*/
        getOne:function (id){
            
        }
    }
//需要注意的以下的寫法是錯誤的
export =  {
        /*所有數(shù)據(jù)*/
        getAll:function (){
          return alldata;
        },
        /*指定id的數(shù)據(jù)*/
        getOne:function (id){
            
        }
    }

最后我們說一下requirejs和seajs的相同點和不同點
相同之處

RequireJS 和 SeaJS 都是模塊加載器,倡導的是一種模塊化開發(fā)理念,
核心價值是讓 JavaScript 的模塊化開發(fā)變得更簡單自然。

不同之處,兩者的區(qū)別如下:

定位有差異。RequireJS 想成為瀏覽器端的模塊加載器,同時也想成為 Rhino / Node 等環(huán)境的模塊加載器。
SeaJS 則專注于 Web 瀏覽器端,同時通過 Node 擴展的方式可以很方便跑在 Node 服務器端。

遵循的規(guī)范不同。RequireJS 遵循的是 AMD(異步模塊定義)規(guī)范,SeaJS 遵循的是 CMD (通用模塊定義)規(guī)范。
規(guī)范的不同,導致了兩者 API 的不同。SeaJS 更簡潔優(yōu)雅,更貼近 CommonJS Modules/1.1 和 Node Modules 規(guī)范。

社區(qū)理念有差異。RequireJS 在嘗試讓第三方類庫修改自身來支持 RequireJS,目前只有少數(shù)社區(qū)采納。
SeaJS 不強推,采用自主封裝的方式來“海納百川”,目前已有較成熟的封裝策略。

代碼質(zhì)量有差異。RequireJS 是沒有明顯的 bug,SeaJS 是明顯沒有 bug。

對調(diào)試等的支持有差異。SeaJS 通過插件,可以實現(xiàn) Fiddler 中自動映射的功能,
還可以實現(xiàn)自動 combo 等功能,非常方便。RequireJS 無這方面的支持。

插件機制不同。RequireJS 采取的是在源碼中預留接口的形式,源碼中留有為插件而寫的代碼。SeaJS 采取的插件機制則與 JavaScript 語言
以及Node 的方式一致:開放自身,讓插件開發(fā)者可直接訪問或修改,從而非常靈活,可以實現(xiàn)各種類型的插件。

還有不少細節(jié)差異就不多說了。

總之,SeaJS 從 API 到實現(xiàn),都比 RequireJS 更簡潔優(yōu)雅。如果說 RequireJS 是 Prototype 類庫的話,則 SeaJS 是 jQuery 類庫。

謝謝一下文檔的參考
https://my.oschina.net/felumanman/blog/263330?p=1
https://github.com/seajs/seajs/issues/277
http://yslove.net/seajs/
https://github.com/seajs/seajs/issues/242
http://blog.csdn.net/wl110231/article/details/8283512

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容