TypeScript使用typescript-require共享文件

时间:2013-11-26 14:13:08

标签: javascript node.js typescript

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

我想在服务器端和客户端共享我的文件。 (浏览器)这非常重要。请注意,文件夹 / 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来创建新实例。

共享/类/消息。的 TS

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

在文件结尾处,我添加了这个try / catch,将类添加到module.exports(如果存在)。 (它有效,但它不是一个很好的方法,我想做得更好) 如果我从浏览器加载文件,则module.export将不存在。

所以,我上面所做的就是工作。现在如果我尝试使用typescript-require模块,我会改变一些事情:

共享/ LIB / message.js

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

我使用requireTs而不是require,它是一个全局var。我确切地说我正在使用 .ts 文件。

共享/类/消息。的 TS

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

现在,如果我尝试这样做,如果我看一下控制台服务器,我得到requireTs是对象,而 shared / lib / message.js 中的消息未定义。 如果我不在Message。 ts 中使用 export 关键字,我会得到相同的结果。即使我最后使用我的小脚本,我也总是出错。

但是还有更多,我有另一个类名ValidatorMessage。 ts 扩展消息。 ts ,如果我使用的话它不起作用 export keyword ...

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

3 个答案:

答案 0 :(得分:1)

查看typescript-require库,我发现它已经有9个月没有更新了。因为它包含lib.d.ts键入TypeScript的中心(以及node.d.ts类型),并且由于这些在过去9个月中取得了很大进展(以及由于语言更新而需要的更改),它可能不兼容使用最新的TypeScript版本(只是我的假设,我可能错了)。

使用TypeScript在Node和浏览器之间共享模块并不容易,因为它们都使用非常不同的模块系统(Node中的CommonJS,以及浏览器中的RequireJS)。 TypeScript为一个或另一个发出代码,具体取决于给定的--module开关。 (注意:某些人使用的是通用模块定义(UMD)模式,但TypeScript不直接支持此模式。)

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

答案 1 :(得分:1)

我正在做同样的事情并且在我尝试做任何事情时都会遇到问题......对我来说主要的问题是:

  • 我将我的打字稿作为命名空间和组件编写,因此没有带有多个文件编译的导出模块,您必须在最后添加一些_exporter.ts以添加library-output.js的导出为作为模块可导入,这需要像:

module.exports.MyRootNamespace = MyRootNamespace

  • 如果您执行上述操作,则可以使用,但是当您需要引用其他模块中的类(例如MyRootNamespace1.SomeOtherClass引用的MyRootNamespace1.SomeClass)时,您可以引用它然后它将它编译到你的library-output2.js文件中,这样如果你试图在多个编译目标中重复使用打字稿,你最终会得到重复的类(比如你在VS中有一个解决方案,有多个项目都有自己的dll输出)

  • 假设您对导入和/或复制引用不满意,那么您可以将它们导入全局范围,这是一个黑客但有效...但是当您决定要测试时您的代码(使用任何nodejs测试框架)您将需要模拟某些事情,并且因为您的组件的依赖关系可能不会通过require()调用包含(并且您的模块可能依赖于node_modules,它们不是真正可用的因为全局范围的黑客攻击)这使得很难满足依赖关系并模拟某些依赖关系,它就像一种全有或全无的方法。

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

最终,除了试图与Typescript搏斗以使其以可维护和可测试的方式工作之外,我什么都没有。我也试图重新使用客户端上的一些打字稿组件,但是如果你沿着npm hack路线去包含你的模块,那么你必须确保你的客户端使用require兼容的资源/包装载机。尽管我喜欢在我的客户端和我的服务器项目上使用typescript,但它似乎并不想以一种很好的方式工作。

答案 2 :(得分:0)

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

最后我不使用require-typescript而是使用typescript.api,但效果很好。 (如果你使用它,你必须加载 lib.d.ts ,否则你将在控制台上出现一些错误。

我还没有在浏览器上安装脚本的解决方案。 (因为export关键字我在客户端有一些错误)我想添加一个exports global var来避免这样的错误。

感谢您的帮助Bill。