我有一些像这样的模块:
define('hello',[],
function()
{
return {
say: function(word) { console.log("Hello, "+word) },
};
});
我正在使用它(没有任何require.config):
require(["hello"],
function(hello)
{
console.log("main",hello);
hello.say("main");
});
到目前为止,非常好。
但是当我尝试使用绝对路径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!
为什么会这样?
答案 0 :(得分: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(" hello")或绝对路径,因为它首先在没有名称的情况下注册,后来会收到需要它的名称。