天天看點

requirejs和seajs那些蛋疼事兒

昨天到今天,老衲翻閱數十篇技術文檔,為了搞明白seajs(CMD)和 requireJS(AMD)到底是個什麼鬼,

當然也包括官網了,隻是都不太盡如人意,了解起來感覺好費解,然後跟我的小夥伴交流了一晚上之後發現

了一個很形象的比喻,對于AMD和CMD的模式,其實了解的時候我借助了MVC這個結構來了解,感覺了解起來

相對容易一點兒,對于MVC這個結構我不做過多介紹,有興趣的可以去看看

http://www.cnblogs.com/aaronjs/p/3581904.html

下面進入我們正題,說的不好的地方歡迎指正,一塊學習進步.

咱們說道說道這兩個子產品兒開發的有趣的地方吧,我會用咱們常說的一句“我負責貌美如花,你負責掙錢養家”來

說道說道,其實說白了就是分工明确:

第一步、前端頁面的引入接口,他的作用就是進去接口;(PS:前端頁面直接展示給使用者,相當于你的女朋友隻負責貌美如

花,但是你需要提供,提供一切的物質支援就是money[對于requirejs和seajs來說就是給前端頁面提供一個接口]);

第二步、這個接口負責所有的依賴檔案,還有需要的配置各種參數,支援檔案等等。

換句話說就是頁面上最直覺的顯示内容的調用方法,還有各種事件等等

(就相當于你,準備怎樣讓你的女朋友貌美如花。你要給提供化妝品、衣服之類的,沒事肯定少不了);

第三步、到了這一層,其實就是具體的邏輯的處理了,這一層的邏輯處理也是給第二層提供依賴的檔案(

就相當于,你要給你的女朋友買這買那,你具體的工作是什麼,做多少份兼職可以滿足你的女朋友的物質需求)

上邊兒說了這麼多,其實就是為了想讓大家了解一下requirejs和seajs這兩種子產品化開發的形式是什麼,怎樣分工的,

是不是多少有點兒進入狀态了

first.咱們先來說一下requirejs

requirejs和seajs那些蛋疼事兒

頁面的引入接口

其中 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();
} 
           

對這個就是進行基礎的業務的處理,

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

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

define(['jquery','cookie'],function () {
 return {
        /*所有資料*/
        getAll:function (){
          return alldata;
        },
        /*指定id的資料*/
        getOne:function (id){

        }
    }
})
           

有了上邊兒requirejs 的案例基礎我們來了解seajs的時候就友善的多了。

second.下面我們來看一下seajs的書寫規範

requirejs和seajs那些蛋疼事兒

首先說一下第一步,接口

<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 =  {
        /*所有資料*/
        getAll:function (){
          return alldata;
        },
        /*指定id的資料*/
        getOne:function (id){

        }
    }
//需要注意的以下的寫法是錯誤的
export =  {
        /*所有資料*/
        getAll:function (){
          return alldata;
        },
        /*指定id的資料*/
        getOne:function (id){

        }
    }
           

最後我們說一下requirejs和seajs的相同點和不同點

相同之處

RequireJS 和 SeaJS 都是子產品加載器,倡導的是一種子產品化開發理念,
核心價值是讓 JavaScript 的子產品化開發變得更簡單自然。
           

不同之處,兩者的差別如下:

定位有差異。RequireJS 想成為浏覽器端的子產品加載器,同時也想成為 Rhino / Node 等環境的子產品加載器。
SeaJS 則專注于 Web 浏覽器端,同時通過 Node 擴充的方式可以很友善跑在 Node 伺服器端。

遵循的規範不同。RequireJS 遵循的是 AMD(異步子產品定義)規範,SeaJS 遵循的是 CMD (通用子產品定義)規範。
規範的不同,導緻了兩者 API 的不同。SeaJS 更簡潔優雅,更貼近 CommonJS Modules/1.1 和 Node Modules 規範。

社群理念有差異。RequireJS 在嘗試讓第三方類庫修改自身來支援 RequireJS,目前隻有少數社群采納。
SeaJS 不強推,采用自主封裝的方式來“海納百川”,目前已有較成熟的封裝政策。

代碼品質有差異。RequireJS 是沒有明顯的 bug,SeaJS 是明顯沒有 bug。

對調試等的支援有差異。SeaJS 通過插件,可以實作 Fiddler 中自動映射的功能,
還可以實作自動 combo 等功能,非常友善。RequireJS 無這方面的支援。

插件機制不同。RequireJS 采取的是在源碼中預留接口的形式,源碼中留有為插件而寫的代碼。SeaJS 采取的插件機制則與 JavaScript 語言
以及Node 的方式一緻:開放自身,讓插件開發者可直接通路或修改,進而非常靈活,可以實作各種類型的插件。
           

還有不少細節差異就不多說了。

總之,SeaJS 從 API 到實作,都比 RequireJS 更簡潔優雅。如果說 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