2014-10-16 40 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