2011-05-19 24 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