2012-12-13 105 views
3

我有這個game.js的game.ts文件編譯代碼的問題:打字稿requirejs問題與加載外部模塊

var GameObjects = require("./GameObjects") 

我已經建立了我的index.html頁面JS進口像這樣:

<script language="javascript" src="javascripts/require.js" type="text/javascript"> </script> 
<script language="javascript" src="javascripts/jquery-1.8.2.min.js" type="text/javascript"> </script> 
<script language="javascript" src="ts/GameObjects.js" type="text/javascript"> </script> 
<script language="javascript" src="ts/game.js" type="text/javascript"> </script> 

,這是Chrome的錯誤:

Uncaught ReferenceError: exports is not defined GameObjects.js:82 
Uncaught Error: Module name "GameObjects" has not been loaded yet for context: _. Use require([]) http://requirejs.org/docs/errors.html#notloaded 

任何想法的朋友?

回答

5

我不確定手動編輯JavaScript文件的想法來自何處。如果使用--module amd標誌編譯TypeScript,則不需要編輯JavaScript文件,因爲import語句將被轉換爲require語句。

如果您需要在頁面上

唯一的腳本標籤是這樣的:

<script src="javascripts/require.js" data-main="ts/game.js"></script> 

一旦require.js已加載,它將然後加載game.js,每當遇到一個require聲明(這是您的TypeScript文件中的import聲明),它會加載該腳本,然後執行代碼。

只需在TypeScript文件中添加import語句,即可加載jQuery和GameObjects以及任何其他模塊。

+0

thx +1,如果我的解決方案只有一個項目,最好的方法是重新安裝它,我沒有看到項目菜單中的選項:( – Nikos

+0

所以像這樣: '"%(fullpath)"','')」IgnoreExitCode =「true」 /> Nikos

+0

是 - 雖然'--target ES5'前的''"屬於(如果你真的想要的目標ES5) – Fenton

3

您沒有data-main屬性在您的require.js script標記中。請仔細閱讀the RequireJS documentation

在一個nuthshell中:您應該從頂級require調用中加載ts/GameObjects.js調用,該調用將放入data-main屬性中指定的文件中。例如(從文檔):

<!DOCTYPE html> 
<html> 
    <head> 
     <title>My Sample Project</title> 
     <!-- data-main attribute tells require.js to load 
      javascripts/main.js after require.js loads. --> 
     <script data-main="javascripts/main" src="javascripts/require.js"></script> 
    </head> 
    <body> 
     <h1>My Sample Project</h1> 
    </body> 
</html> 

然後在javascripts/main.js(實際上你可以叫它任何你想要的,只要它符合你把什麼data-main),你叫require和加載模塊,並做你想做的與他們同在

require(["ts/GameObjects.js", "ts/game.js"], function(GameObjects, Game) { 
    ... use 'GameObjects' and 'Game' here ... 
}); 

請記住,在ts/GameObjects.jsts/game.js你需要用你的代碼中調用define(),所以他們被解釋爲模塊。

希望有所幫助。

+0

感謝隊友,但是有沒有什麼辦法可以通過打字稿編譯器生成js文件而無需手動編輯? – Nikos

+0

你的意思是「ts/GameObjects.js」和「ts/game.js」?如果是這樣,那麼不,你絕對需要在那裏定義調用。 –

+0

所以每次我編譯我的ts文件,我必須手動編輯js文件?如果是這樣我就不會打擾外部模塊:(我將如何修改下面輸出的.js文件? – Nikos