RequireJS 和 SeaJS

RequireJS SeaJSjavascript

CMD規範

CommonJS的規範: 根據CommonJS規範,一個單獨的文件就是一個模塊。加載模塊使用require方法,該方法讀取一個文件並執行,最後返回文件內部的exports對象html

SeaJS定義模塊方式

在 SeaJS 裏,模塊只有一種書寫格式前端

define(function(require, exports, module) {
    var A = require('a');
    A.do();
    return function () {};
});

RequireJS定義模塊方式

在 RequireJS 裏,模塊有多種書寫格式,推薦的是java

define(['dep1', 'dep2'], function (dep1, dep2) {
    //Define the module value by returning a value.
    dep1.do();
    return function () {};
});

如今RequireJS 也提供了CMD的寫法
模塊的依賴能夠像 CommonJS 同樣「就近定義」
PS 二者都是以文件作爲模塊 一個文件一個模塊node

AMD執行策略

http://imququ.com/post/amd-simplified-commonjs-wrapping.html
AMD 運行時核心思想是「Early Executing」 也就是提早執行依賴 儘早執行程序員

define(['a', 'b'], function(A, B) {
    //運行至此,a.js 和 b.js 已下載完成(運行於瀏覽器的 Loader 必須如此);
    //A、B 兩個模塊已經執行完,直接可用(這是 AMD 的特性);

    return function () {};
});

CMD的執行策略

按需執行 CMD 推崇 as lazy as possible.
[只是執行時間晚了 可是加載和RequireJS是同樣的]瀏覽器

//main.js
define(function(require, exports, module) {
    //運行至此,mod1.js 和 mod2.js 已經下載完成;

    console.log('require module: main');

    var mod1 = require('./mod1'); //這裏才執行 mod1 
    mod1.hello();
    var mod2 = require('./mod2'); //這裏才執行 mod2
    mod2.hello();

    return {
        hello: function() {
            console.log('hello main');
        }
    };
});

寫法上可能更易讀 「就近」書寫app

SeaJS RequireJS 區別 知乎篇

http://www.zhihu.com/question/20342350異步

  • requirejs:一個模塊的factory函數執行是緊跟隨在define(也就是Evaluate Script腳本模塊文件)以後
  • seajs: 執行一個模塊的factory函數須要等待全部模塊define完畢。
  • RequireJS的異步模塊加載迎合了瀏覽器端JS程序員固有的異步思惟,學習成本低
  • RequireJS和Sea.js在資源加載的時間點都是同樣的,因此論「懶」的程度都是同樣的。差異僅僅在於加載的腳本何時執行。RequireJS的依賴模塊在回調函數執行前執行完畢,而Sea.js的依賴模塊在回調函數執行require時執行。
  • 對於非AMD規範的js插件,require js提供了shim支持,很是方便。RequireJS早有了Shim等支持,不須要修改第三方類庫就能夠徹底支持.如Ember,JQuery等引用,都直接能夠異步加載爲一個模塊.
  • requirejs目前支持了sourcemap,配合grunt,簡直爽爆了。

SeaJS與RequireJS最大的區別 豆瓣篇

http://www.douban.com/note/283566440/
這篇文章的結論彷佛有誤 做者最開頭也已經註明了
做者一開始認爲requeireJS有bug 實際上不是
緣由是即便是RequireJS採用了CMD的寫法
實際上仍是的執行仍是不變 也就是預先加載並執行了依賴模塊化

關於豆瓣的這個例子 在這篇博文中也有說明
http://imququ.com/post/amd-simplified-commonjs-wrapping.html

結論

RequireJS的作法是並行加載全部依賴的模塊, 並完成解析後, 再開始執行其餘代碼, 所以執行結果只會"停頓"1次, 完成整個過程是會比SeaJS要快.

而SeaJS同樣是並行加載全部依賴的模塊, 但不會當即執行模塊, 等到真正須要(require)的時候纔開始解析(也就是執行),

評論

AMD
我我的感受requirejs更科學,全部依賴的模塊要先執行好。被依賴的模塊必須先於當前模塊執行,而沒有依賴關係的模塊,能夠沒有前後。

AMD規範了"依賴提早加載提早執行"的根本

合併

RequireJS 有 r.js SeaJS 有spm 來合併
爲何不直接用grunt的concat呢 由於這二者有個要求就是一個模塊對應一個文件

Browserify

Browserify 是一個基於 Node 模塊化方案的瀏覽器端版本

browserify查找語法樹種global域下的require和module變量,對其調用進行變形替換。這是靜態分析,像module[‘exp‘+’ort’] = {} , require('path'+'to'+‘file')目前還沒法被正確替換。

Browserify的出現,不單單是讓NPM(或者說以前適用於Node.js)上的代碼能夠給瀏覽器端使用。更重要的意義,是Browserify代碼組織更符合CommonJS規範,讓瀏覽器前端代碼也能夠經過預編譯實現CommonJS規範

SeaJS和Browserify

參考
http://www.zhihu.com/question/20941305

browserify不須要 define(function(require, exports, module) {...}) 。代碼更符合CommonJS模塊化規範,能夠和nodejs共同require同一個文件,以及node_modules裏的庫

依賴分析時機不同:SeaJS是在客戶端運行時解析依賴,能夠說是「運行時」解析;而Browserify是在服務端就依賴分析打包成單個文件,能夠說是「預編譯」

相關文章
相關標籤/搜索