在TypeScript中构建一个大型复杂模块

时间:2012-11-17 11:49:30

标签: typescript

我在TypeScript中创建一个复杂的模块(解析PE文件结构,类似于Mono.Cecil所做的,但是在TS / JS中并且不太复杂)。

问题是如何最好地将该功能放在文件/文件夹/模块维度中。

我开始使用类似于C#的结构,每个类都在自己的文件中,名称空间(模块)对应于大量或多或少独立的功能,并且存在于子文件夹中。

现在在TypeScript中有几个问题。或许这些问题与我的愚蠢有关?

  1. 单独文件中的每个类都适合开发,但对编译输出没有意义。没人想要携带24个文件而不是一个。
  2. 如果我将所有内容编译成一个文件(tsc -out),则每个单独文件的内容几乎是独立发送的,即使它们都属于同一个模块。 TypeScript使用一些看似时髦的hacky语法来构建该模块,而不是我手工编写的(这将把它们全部放在一个模块中 - 定义立即调用的函数)。
  3. 我想让我的东西在Node.js和浏览器中运行。对于Node我需要使用'export module'来加密它,但是对于浏览器来说,典型的用法就是生成whatever.js并让页面进入 - 这意味着我应该关闭'export module'。
  4. 处理这个问题的最佳方法是什么?

3 个答案:

答案 0 :(得分:3)

我目前正在使用require.js和amd模块来构造代码。每个类都在一个文件中,所需的只是require.js引导程序。我不使用节点,所以不能在这里评论,但它可能值得一看。 http://blorkfish.wordpress.com/2012/10/23/typescript-organizing-your-code-with-amd-modules-and-require-js/

答案 1 :(得分:0)

Typescript 1.0+的答案是使用CommonJs语法

来使用模块

传递tsc标志

--module commonjs

生成CommonJS样式模块,在Typescript文件中,使用require语法

导入资源
import A = require('./A')  //no .ts in the name

要在浏览器中使用,请使用browserify,最有可能与grunt-browserify

相关联

答案 2 :(得分:0)

如果您不想浏览浏览器(请参阅BGR的答案),您可以创建2个构建过程,一个用于CommonJS(节点),另一个用于RequireJS(浏览器)。 2个版本可以将其结果输出到其他文件夹(例如projectRoot/dist/server)。 Grunt / Gulp项目的地狱,但并非不可能。

为了获得良好的可用性,我还创建了一个包装文件,其中没有类/接口,它只包含其他文件并选择要导出的内容。我刚刚得到了一些提示: TypeScript export imported interface