2014-10-16 57 views
0

我有一些模块,像这样的加载定义无依赖到现在为止还挺好。当它们通过绝对路径

但是,当我试图require同一模块的绝对路径,我有我的依赖模块未定义:

require(["http://example.com/js/hello.js"], 
function(hello) 
{ 
    console.log("main",hello); 
    hello.say("main"); 
}); 

控制台:

main undefined 
Uncaught TypeError: Cannot read property 'say' of undefined // Oops! 

为什么会这样呢?

回答

1

命名模块(define("NAME", [ ... ], function() { ... }))意味着在确切名称下需要。当需要使用URL时,它会正确加载,但会将其自身注册为其“所需”名称,之后requirejs会失去对其名称http://example.com/js/hello.js名称的模块的跟踪。

define()指定的名称未被模块所需的名称覆盖的原因是允许多个模块定义共存于文件中,例如优化后。优化器会将所有定义调用转换为具有显式名称的表单。

绝对名称未被转换为模块ID的原因是此转换是不可能的。 requirejs的所有配置选项决定如何将模块ID转换为脚本位置,而不是其他方式。

Documentation discourages use of the named modules

这些通常是由优化工具产生。您可以自己命名模块,但它会使模块的可移植性降低......通常最好避免使用模块名称进行编码,并让优化工具在模块名称中刻录...

匿名模块,即:

define([], 
function() 
{ 
    return { 
    say: function(word) { console.log("Hello, "+word) }, 
    }; 
}); 

作品与任一模块ID(“你好”)或绝对路径,因为它是第一个注册的没有名字,稍后又收到下它被需要的名字。

+0

谢谢您的全面回答 – 2014-10-20 16:34:21