2013-11-26 58 views
1

我使用TypeScript来编写我的JavaScript文件与面向对象编程。 我想使用节点模块https://npmjs.org/package/typescript-require来从其他文件中获取我的.ts文件。TypeScript使用typescript-require共享文件

我想在服务器和客户端共享我的文件。 (浏览器)这非常重要。请注意,文件夹/shared/并不意味着在客户端和服务器之间共享,而是在游戏服务器和Web服务器之间共享。我使用pomelo.js作为框架,这就是为什么。

目前我没有使用(成功)typescript-require库。 我做这样的:

共享/ lib目录/ message.js

var Message = require('./../classes/Message'); 
module.exports = { 

    getNewInstance: function(message, data, status){ 
     console.log(requireTs);// Global typescript-require instance 
     console.log(Message); 
     return new Message(message, data, status); 
    } 
}; 

该文件需要Message.js创建新实例。

shared/classes/Message。 TS

class Message{ 
    // Big stuff 
} 
try{ 
    module.exports = Message; 
}catch(e){} 

在我添加此try/catch语句的类添加到module.exports如果它存在的FIL结束。 (它的工作原理,但它不是一个很好的方法,我想做得更好) 如果我从浏览器加载文件,module.export将不存在。

所以,我上面做了什么工作。现在,如果我尝试使用打字稿,需要模块,我会改变一些事情:

共享/ lib目录/ message.js

var Message = requireTs('./../classes/Message.ts'); 

我用requireTs,而不是需要,这是一个全局变量。我准确地使用了.ts文件。

shared/classes/Message。 TS

export class Message{ 
    // Big stuff 
} 
// remove the compatibility script at the end 

现在,如果我尝试这样,如果我看看到控制台服务器,我得到requireTs的对象和消息在共享/ lib目录/ message.js不确定。 如果我不在消息中使用export关键字,我会得到相同的结果。 ts。即使我最后使用我的小脚本,我总会遇到一个错误。

但还有更多,我有另一个类名称ValidatorMessage。 ts其中延伸消息。 ts,它不工作,如果我使用出口关键字...

我做错了什么?我尝试了几个其他的东西,但没有任何工作,看起来像typescript-require不能要求。ts文件。 谢谢你的帮助。

回答

1

看着typescript-require库,我发现它已经9个月没有更新过了。由于它包含了对TypeScript(以及node.d.ts类型)中心键入的lib.d.ts类型,并且由于它们在过去9个月中取得了很大进展(以及由于语言更新而需要进行的更改),因此它可能不兼容与最新的TypeScript版本(只是我的假设,我可能是错的)。因为它们都使用非常不同的模块系统(节点中的CommonJS,并且通常像浏览器中的RequireJS),所以在节点和浏览器之间共享模块并不容易。 TypeScript根据给定的--module开关发出一个或另一个的代码。 (注意:有些人使用通用模块定义(UMD)模式,但TypeScript不直接支持这种模式)。

你想达到什么目标,我可能会提供一些指导。

+0

我想要做的是在服务器和客户端之间共享文件,这意味着服务器将直接使用使用TypeScript写入的文件,但客户端将获得与许多其他文件合并并压缩的文件需要该文件与客户端(浏览器)和服务器兼容。我将使用Grunt来合并和缩小文件。 – Vadorequest

+1

客户端和服务器不会直接运行TypeScript,并且Grunt不会缩小TypeScript,因此您需要首先编译为JavaScript。 目前最简单的解决方案是编译两次相同的TypeScript源文件,一次用于--module CommonJS,一次用于--module AMD,然后恭敬地将发出的代码包含在服务器和客户端软件包中。 –

+0

我不知道这些模块之间的区别?为什么要这样做?一个是“服务器”,另一个是“浏览器”?为什么会有差异,输出会有什么不同?谢谢! – Vadorequest

0

这里的解决方案: Inheritance TypeScript with exported class and modules

最后,我没有使用需要,打字稿,但typescript.api相反,它工作得很好。 (你必须加载lib.d.ts如果你使用它,否则你会在控制台上得到一些错误。

我还没有解决方案让浏览器上的脚本仍然存在(因为出口关键字,我有一些错误,客户端)我想添加一个出口全局变量,以避免类似的错误。

谢谢你的帮助比尔。

+0

最后,typescript.api具有继承性,如果你想同时使用AMD和CommonJs,不要使用CommonJs,不要管理CommonJs继承,并且在代码的深度上使用Bug来疯狂。 – Vadorequest

1

我做相同的,并保持其无论怎样我的问题尝试做事...对我来说主要问题是:

  • 我写我的打字机作为命名空间和组件,所以没有导出模块与多个文件编译你必须做一个黑客添加一些_exporter.ts在最后添加导出为您的library-output.js作为模块可导入,这需要类似:

module.exports.MyRootNamespace = MyRootNamespace

  • 如果你做到上面它的工作原理,但那么你得到的,当你需要引用其他模块类(如MyRootNamespace1.SomeClass是问题引用MyRootNamespace2.SomeOtherClass)你可以引用它,但它会将它编译成你的library-output2.js文件,所以如果你试图在多个编译目标中重复使用打字稿(比如你将如何在VS中有1个解决方案以及有自己的dll输出的多个项目),那么你最终会得到类的重复。

  • 假设你不喜欢黑客出口和/或复制你的引用,那么你可以将它们导入到全局范围,这是一个黑客,但工程...然而,当你决定要测试你的代码(使用任何nodejs测试框架),你将需要嘲笑某些事情,因为你的组件的依赖关系可能不会通过调用require()来包含(并且你的模块可能取决于node_modules,这对于全局范围的黑客攻击来说并不是真的可用),这使得很难满足依赖性和模拟某些特定的,就像一个all或nothi这种方法。

  • 最后,您可以尝试通过使用打字稿框架(如appex)来缓解所有这些问题,它允许您直接运行打字稿,而不是先编译成js,尽管看起来非常好,但非常困难调试编译错误,这是目前我的首选方式,但我有一个问题,我的打字稿通过tsc编译好,但只是在appex上爆发了一个最大堆栈大小异常,而且我受到项目维护人员的摆布以解决此问题(我无法找到潜在的问题)。这些类型的项目也不多,但是它们使模块级别/文件级别的编译问题成为一个有争议的问题。

最终我只有尝试与Typescript摔跤以使其以可维护和可测试的方式工作的问题。我也试图重新使用客户端上的一些打字稿组件,但是如果您沿着npm黑客路线走下去以获取您的模块,那么您必须确保您的客户端使用require兼容资源/包装载器。尽管我很喜欢在我的客户端和我的服务器项目上使用打字稿,但它似乎并不想以一种很好的方式工作。