seajs筆記

Amd和Cmd的區別有哪些?

1. 對於依賴的模塊,AMD 是提早執行,CMD 是延遲執行。不過 RequireJS 從 2.0 開始,也改爲能夠延遲執行(根據寫法不一樣,處理方式不一樣)。CMD 推崇 as lazy as possible.jquery

2. CMD 推崇依賴就近,AMD 推崇依賴前置。看代碼:git

// CMD
define(function(require, exports, module) {
var a = require('./a')
a.doSomething()
// 此處略去 100 行
var b = require('./b') // 依賴能夠就近書寫
b.doSomething()
// ...
})github

// AMD 默認推薦的是
define(['./a', './b'], function(a, b) { // 依賴必須一開始就寫好
a.doSomething()
// 此處略去 100 行
b.doSomething()
...
}) api

雖然 AMD 也支持 CMD 的寫法,同時還支持將 require 做爲依賴項傳遞,但 RequireJS 的做者默認是最喜歡上面的寫法,也是官方文檔裏默認的模塊定義寫法。數組


3. AMD 的 API 默認是一個當多個用,CMD 的 API 嚴格區分,推崇職責單一。好比 AMD 裏,require 分全局 require 和局部 require,都叫 require。CMD 裏,沒有全局 require,而是根據模塊系統的完備性,提供 seajs.use 來實現模塊系統的加載啓動。CMD 裏,每一個 API 都簡單純粹dom


4. 還有一些細節差別,具體看這個規範的定義就好,就很少說了。異步

 seajs使用

1.seajs.config--用來對 Sea.js 進行配置。async

seajs.config({
      // 設置路徑,方便跨目錄調用
      paths: {
        'domes': 'http://127.0.0.1:8020/seajs-master'
      },
    
      // 設置別名,方便調用
      alias: {
        'dom': 'domes/dome/dom'
      },
       // 變量配置
      vars: {
           'locale': 'zh-cn'
      }
});
seajs.use('dom',function(d){
    //=> 加載的是 http://127.0.0.1:8020/seajs-master/dome/dom.js
    d.d();
});

別名起到了變量的做用,'dom'表明'domes/dome/dom','domes'表明'http://127.0.0.1:8020/seajs-master' 則'domes/dome/dom'解析爲http://127.0.0.1:8020/seajs-master/dome/dom.js。函數

變量配置工具

define(function(require, exports, module){
    // 獲取模塊 dom_1 的接口    
    var som=require('./dom/{locale}.js');
    //加載的地址http://127.0.0.1:8020/seajs-master/dome/dom/zh-cn.js
    som.s();
    exports.dom_2=function(){
        console.log("dom_2");
    };
});

{locale}就表明'zh-cn'

2.seajs.use

// 加載一個模塊
seajs.use('./a');

// 加載一個模塊,在加載完成時,執行回調
seajs.use('./a', function(a) {
  a.doSomething();
});

// 加載多個模塊,在加載完成時,執行回調
seajs.use(['./a', './b'], function(a, b) {
  a.doSomething();
  b.doSomething();
});

3.define--用來定義模塊

define(id?, deps?, factory)
也能夠接受兩個以上參數。字符串 id 表示模塊標識,數組 deps 是模塊依賴。好比:
define('hello', ['jquery'], function(require, exports, module) {

});
id 和 deps 參數能夠省略。省略時,能夠經過構建工具自動生成。
注意:帶 id 和 deps 參數的 define 用法不屬於 CMD 規範,而屬於 Modules/Transport 規範。

define(function(require, exports, module) {
  
  //exports 用來在模塊內部對外提供接口。
   
  // 對外提供 foo 屬性
  exports.foo = 'bar';

  // 對外提供 doSomething 方法
  exports.doSomething = function() {};
  //注意:require, exports, module這三個回掉函數參數切勿改變。
});

4.require--用來獲取指定模塊的接口

//注意,require 只接受字符串直接量做爲參數,詳細約定請閱讀
//require.async 用來在模塊內部異步加載一個或多個模塊。
define(function(require) {

  // 獲取模塊 a 的接口
  var a = require('./a');

  // 調用模塊 a 的方法
  a.doSomething();
  
  // 異步加載多個模塊,在加載完成時,執行回調
  require.async(['./c', './d'], function(c, d) {
    c.doSomething();
    d.doSomething();
  });
  
  
});

5.exports--用來在模塊內部對外提供接口

define(function(require, exports, module) {
  
  //exports 用來在模塊內部對外提供接口。
   
  // 對外提供 foo 屬性
  exports.foo = 'bar';

  // 對外提供 doSomething 方法
  exports.doSomething = function() {};
  //注意:require, exports, module這三個回掉函數參數切勿改變。
});

6.module.exports--用來在模塊內部對外提供接口

define(function(require, exports, module) {

  // 對外提供接口
  module.exports = {
    name: 'a',
    doSomething: function() {};
  };

});

與 exports 相似,用來在模塊內部對外提供接口。

7.require.resolve(id)--用來獲取指定模塊的絕對路徑

define(function(require, exports, module){
    // 獲取模塊 dom_1 的接口  
    var som=require('./dom_2');
    console.log(require.resolve('./dom_2'),'用來獲取指定模塊的絕對路徑');
   
});

這個能夠用來檢測你加載模塊時候,路徑是否正確。

參考連接

做者:玉伯
連接:https://www.zhihu.com/question/20351507/answer/14859415
來源:知乎
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。

參考:https://github.com/seajs/seajs/issues/242

參考:https://github.com/amdjs/amdjs-api/wiki/AMD

參考:https://github.com/seajs/seajs/issues/266

參考:http://yslove.net/seajs/

總結

amd與cmd是一種規範,而目前兩大加載器(seajs,requirejs)應用的規範是不一樣的。cmd推薦的是依賴就近原則,用到就加載。而amd則是依賴前置。只有加載纔可使用。相對於來講cmd比較符合使用習慣。

相關文章
相關標籤/搜索