2012-12-13 65 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