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



我正在TypeScript中创建一个复杂的模块(解析PE文件结构,类似于Mono.Cecil,但在TS/JS中,不那么复杂)。

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

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

现在在TypeScript中有几个问题。或者问题出在我的愚蠢上?

  1. 单独文件中的每个类都有利于开发,但对编译后的输出没有意义。没有人愿意随身携带24个文件而不是一个
  2. 如果我将所有内容编译到一个文件(tsc-out)中,那么每个单独文件的内容几乎是独立发出的,即使它们都属于同一个模块。TypeScript使用一些看起来很时髦的语法构建了这个模块,而不是我手工编写的(这将把它们全部粘贴在一个模块中,定义立即调用的函数)
  3. 我希望我的东西能在Node.js和浏览器中工作。对于Node,我需要用"export module"来填充所有内容,但对于浏览器,典型的用法只是生成whatever.js并让页面包含它——这意味着我应该去掉"export module">

处理这个问题的最佳方法是什么?

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

Typescript 1.0+对此的回答是使用CommonJs语法的模块

传递tsc标志

--module commonjs

要生成CommonJS样式的模块并在Typescript文件中,请使用require语法导入资源

import A = require('./A')  //no .ts in the name

要在浏览器中使用,请使用browserfy,很可能与grunt browserfy 关联

如果你不想浏览(请参阅BGR的答案),你可以创建两个构建过程,一个用于CommonJS(Node),另一个用于RequireJS(浏览器)。这两个构建可以将它们的结果输出到其他文件夹(例如projectRoot/dist/server)中。地狱般的咕噜咕噜项目,但并非不可能。

为了获得良好的可用性,我还创建了一个包装文件,其中没有类/接口,它只包括其他文件并选择导出内容。我刚刚得到了一些如何做到这一点的提示:TypeScript导出导入接口