2011-05-19 57 views
2

我理解一些proper name-spacingleaking into the global-scope相關的Module Pattern幫助的問題是如何。CommonJS規範中概述的define()協議對我有什麼幫助?

我也完全看到在CommonJS Specification中概述的require()協議中規定的資源依賴性管理的價值。

但是,我對AMD define()函數的用途和用途的好處感到迷惑。

爲定義的CommonJS的簽名是:

define(id?, dependencies?, factory); 

此外...

起初,它「看起來」還像另一個插件包裝...直到我開始看到人們在模塊模式旁邊使用它。

所以我的問題是:

  • 什麼是define()協議 在CommonJS的規範 概述給我買?
  • 難道它更能說服人嗎?
  • 是否意味着取代模塊化模式?
  • 它以某種方式更快?
  • 如果是這樣,爲什麼?

回答

2
// main.js 
require("foo.js", function(foo) { 
    console.log(foo === 42); // true 
}); 

//foo.js 

/* 
define(42); 

define({ 
    "foo": "bar" 
}); 

define(["bar.js"], function(bar) { 
    return bar.foo; 
}); 
*/ 

define(function() { 
    return 42; 
}); 

定義是通過模塊化對象回來,而不依賴於全球範圍的好方法。

雖然定義的特定API因庫而異。

這裏的基本思想是,你可以在文件中調用define來定義該模塊是什麼。然後當你需要這個文件時你會得到這個模塊。這削減了全球範圍的中間人。

雖然速度不是很快(注入全球範圍內速度較慢)。

使用requiredefine您只有兩個全局值。上述

具體define例如匹配requireJS API

+0

所以......每一個對象被追加到全球定義對象嗎? – 2011-05-19 18:45:44

+0

@PrisonerZERO未附加。你只需調用'define'。定義將通過你的'require'回調傳遞回來。這些對象不存儲在任何地方,它只是消息傳遞。儘管它們被緩存在某個地方。但不公開提供。 – Raynos 2011-05-19 18:47:05

+0

因爲它不存儲在任何地方......我猜你應該只使用這種模式,當它不是一個持久對象,你想運行一次。 – 2011-05-23 12:36:52