RequireJS SeaJSjavascript
CommonJS的規範: 根據CommonJS規範,一個單獨的文件就是一個模塊。加載模塊使用require方法,該方法讀取一個文件並執行,最後返回文件內部的exports對象html
在 SeaJS 裏,模塊只有一種書寫格式前端
define(function(require, exports, module) { var A = require('a'); A.do(); return function () {}; });
在 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
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 推崇 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
http://www.zhihu.com/question/20342350異步
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 是一個基於 Node 模塊化方案的瀏覽器端版本
browserify查找語法樹種global域下的require和module變量,對其調用進行變形替換。這是靜態分析,像module[‘exp‘+’ort’] = {} , require('path'+'to'+‘file')目前還沒法被正確替換。
Browserify的出現,不單單是讓NPM(或者說以前適用於Node.js)上的代碼能夠給瀏覽器端使用。更重要的意義,是Browserify代碼組織更符合CommonJS規範,讓瀏覽器前端代碼也能夠經過預編譯實現CommonJS規範
browserify不須要 define(function(require, exports, module) {...}) 。代碼更符合CommonJS模塊化規範,能夠和nodejs共同require同一個文件,以及node_modules裏的庫
依賴分析時機不同:SeaJS是在客戶端運行時解析依賴,能夠說是「運行時」解析;而Browserify是在服務端就依賴分析打包成單個文件,能夠說是「預編譯」