【问题标题】:TypeScript use typescript-require shared filesTypeScript 使用 typescript-require 共享文件
【发布时间】:2013-12-11 17:40:03
【问题描述】:

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

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

目前我没有(成功地)使用 typescript-require 库。 我喜欢这样:

shared/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 模块,我将更改一些内容:

shared/lib/message.js

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

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

共享/类/消息。ts

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

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

但还有更多,我还有另一个类名 ValidatorMessage.ts,它扩展 Message.ts,如果我使用导出关键字...

我做错了吗?我尝试了其他几件事,但没有任何效果,看起来 typescript-require 无法要求 .ts 文件。 感谢您的帮助。

【问题讨论】:

    标签: javascript node.js typescript


    【解决方案1】:

    我也在做同样的事情,并且无论我尝试做什么事情都会遇到问题......对我来说主要问题是:

    • 我将我的 typescript 编写为命名空间和组件,因此没有具有多个文件编译的导出模块,您必须在末尾添加一些 _exporter.ts 以添加您的 library-output.js 的导出以导入为一个模块,这需要类似:

    module.exports.MyRootNamespace = MyRootNamespace

      1234563会将其编译到您的library-output2.js 文件中,因此如果您尝试跨多个编译目标重用打字稿(例如您将如何在 VS 中拥有 1 个解决方案和具有自己的 dll 输出的多个项目),您最终会拥有重复的类
    • 假设您对破解导出和/或复制您的引用不满意,那么您可以将它们导入全局范围,这是一种破解但有效...但是当您决定要测试时您的代码(使用任何 nodejs 测试框架)您将需要模拟某些内容,并且由于您的组件的依赖项可能不会通过 require() 调用包含在内(并且您的模块可能依赖于 node_modules 并不能真正用于全局范围黑客攻击),这使得满足依赖关系和模拟某些依赖关系变得困难,这就像一种全有或全无的方法。

    • 1234563调试编译错误非常困难,这是目前我的首选方式,但我有一个问题,我的打字稿通过 tsc 编译得很好,但只是在 appex 上出现最大堆栈大小异常,我受项目维护者的摆布解决这个问题(我无法找到根本问题)。这类项目也并不多,但是它们使在模块级别/文件级别等编译的问题成为一个有争议的问题。

    最终,我在尝试与 Typescript 搏斗以使其以可维护和可测试的方式工作时遇到了问题。我也在尝试在客户端重用一些 typescript 组件,但是如果你沿着 npm hack 路线获取你的模块,那么你必须确保你的客户端使用require 兼容的资源/包加载器。尽管我很想在我的客户端和服务器项目上使用 typescript,但它似乎并不想以一种好的方式工作。

    【讨论】:

      【解决方案2】:

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

      最后我不使用 require-typescript 而是使用typescript.api,它运行良好。 (如果你使用它,你必须加载 lib.d.ts,否则你会在控制台上得到一些错误。

      我还没有将脚本放在浏览器上的解决方案。 (因为 export 关键字我在客户端有一些错误)我认为添加一个导出全局变量以避免这样的错误。

      感谢比尔的帮助。

      【讨论】:

      • 最后,typescript.api 在继承方面很糟糕,如果你想同时使用 AMD 和 CommonJs,不应该使用 CommonJs 继承,并且对代码深处的错误感到疯狂。 ..
      【解决方案3】:

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

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

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

      【讨论】:

      • 我想做的是在服务器和客户端之间共享文件,这意味着服务器将直接使用使用 TypeScript 编写的文件,但客户端会将文件与许多其他文件合并文件并压缩,我需要这些文件与客户端(浏览器)和服务器兼容。我将使用 Grunt 来合并和缩小文件。
      • 客户端和服务器不会直接运行 TypeScript,Grunt 也不会缩小 TypeScript,所以你需要先编译成 JavaScript。目前最简单的解决方案是编译相同的 TypeScript 源代码两次,一次用于 --module CommonJS,一次用于 --module AMD,然后将发出的代码分别包含在服务器和客户端包中。
      • 不知道这几个模块的区别?为什么要那样做?一个用于“服务器”,另一个用于“浏览器”?为什么会有差异,输出会有什么差异?谢谢!
      • 我建议你先阅读nodejs.org/api/modules.html(用于节点模块)和requirejs.org/docs/api.html(用于浏览器模块)。不幸的是,一开始有相当长的学习曲线,但是如果你想使用模块(并且 Node 中的一切都是模块),那么你需要对它们有一个合理的理解。
      • 我正在寻找 node.d.ts 0.10.10 但版本 0.8.8 实际上工作正常。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-30
      • 1970-01-01
      • 1970-01-01
      • 2017-10-07
      • 1970-01-01
      • 2020-04-20
      • 2017-03-23
      相关资源
      最近更新 更多