2013-10-30 125 views
8

使用requireJS,我想指定一個路徑爲我的data-main不同於baseUrl。似乎requireJS忽略了我在文件名之前輸入的任何內容,並且始終在baseUrl文件夾中查找該文件。RequireJS不遵循相對路徑數據主要baseUrl設置

我有以下文件夾結構:

index.html 
scripts/ 
    lib/ 
    require.js 
    test/ 
    main2.js 
    config.js 

index.html的內容:

<!DOCTYPE html> 
<html> 
    <head> 
     <meta charset="utf-8" /> 
     <title>Test</title> 
     <script data-main="test/main2" src="scripts/lib/require.js"></script> 
     <script src="scripts/config.js"></script> 
    </head> 

    <body></body> 
</html> 

內容config.js的:

requirejs.config({ 
    baseUrl: "scripts" 
}); 

而且我得到一個404錯誤:GET [...]/scripts/main2.js,儘管它應該查找[...]/scripts/test/main2.js。如果我刪除config.js文件並使用data-main =「scripts/test/main2」,它可以工作,但我希望能夠爲我的項目指定baseUrl。

任何想法?

編輯:以下答案由蠟制:

  • ,即使我在數據主要使用 「腳本/測試/ MAIN2」, 「/腳本/測試/ MAIN2」,或 「whateverIWant/MAIN2」 ,它總是奇怪尋找「腳本/ main2.js」

請注意,我用的requirejs 2.1.8

+0

我已回滾您的最後編輯 - 在您的問題中看到接受答案中的代碼是誤導性的,您已接受答案的事實足以告訴其他用戶您的問題的解決方案是什麼! – Luca

回答

11

這不是工作,你怎麼想,因爲你正在調用一個需要data-main,然後再設置baseURL。我不知道它爲什麼試圖去scripts/main2.js;我期望它會嘗試加載test/main2.js而不是scripts/main2.js。但是,這不在重點。

你需要做的是確保你的baseURL在它試圖加載你的數據主體之前是可用的。這可以通過首先包含您的配置並使用第二個示例中的語法來完成:http://requirejs.org/docs/api.html#config


index.html的內容:config.js的

<!DOCTYPE html> 
<html> 
    <head> 
     <meta charset="utf-8" /> 
     <title>Test</title> 
     <script src="scripts/config.js"></script> 
     <script data-main="test/main2" src="scripts/lib/require.js"></script> 
    </head> 

    <body></body> 
</html> 

內容:

var require = { 
    baseUrl: "scripts" 
}; 
+0

非常感謝您的支持答案:我測試了不依賴於data-main屬性的方法,但它確實有效。但是,如果我在data-main中提供完整路徑(「scripts/test/main2」或「/ scripts/test/main2 「)我仍然得到一個404錯誤,說它無法找到腳本/ main2.js,它與我給的路徑不匹配,我使用的是requirejs 2.1.8。我更喜歡data-main方法,所以我可以使用相同的配置文件f或主應用程序和單元測試。 – personne3000

+0

你是對的,那第一個沒有工作。我在本地運行了一對測試,並更新了我的答案以刪除第一個選項,並更新了剩餘的解決方案以使用data-main。 – Waxen

+0

如文檔中所述,在require.js文件之前包含配置確實非常有用,非常感謝 – personne3000

7

我讀到這個線程,爲什麼使用數據主要屬性可能不是很明白指向一個配置js文件不會像加載Require之前指定配置一樣,因爲這個線程的答案建議。

在我的實驗中,我瞭解到使用數據主配置js文件設置值可能工作(然後,它可能不會)。對於那些新的需求和AMD以及一般的異步性,「可能工作」的概念與異步操作在何時可以運行 - 而不是以任何可預測的順序運行有關。

已經確定的是,有在RequireJS文檔是躲避我到現在爲止的當前版本中提出了一個非常重要的一點:

您也可以撥打您的數據,主入口點require.config,但是 應該意識到數據主腳本是異步加載的。避免 其他入口點腳本錯誤地假定data-main及其 require.config將始終在其腳本加載之前執行。

欲瞭解更多信息,請參見:http://requirejs.org/docs/api.html#data-main

作爲新RequireJS,我是輕度震驚學習這一點 - 我浪費了很多時間試圖調試路徑的訪問的問題。在這個階段,我不清楚爲什麼有人會使用data-main(尤其是定義一個baseUrl),因爲這個引用只會隨機工作。相反,此線程建議的解決方案(在其中將baseUrl設置爲不是異步的腳本標記)將按預期工作,並在啓動RequireJS之前可靠地設置RequireJS配置。

+4

它的有趣的你說的「輕微驚駭」,它實際上讓我氣惱......然後requirejs的要點是什麼,如果requirejs本身甚至不能保證其配置已被加載?伊莫,這是一個嚴重的缺陷。然後,答案並不是「在所有代碼之前只需要['scripts/config']」,而是添加一個新的函數,「required」或「requiredWithConfig」,它將等到配置實際加載,並且可能不運行如果配置無法加載,這比隨機的javascript錯誤無法加載配置將正確加載的東西要好。 – enorl76