编译多个 Typescript 文件

问题描述 投票:0回答:2

我的 Nodejs Typescript 服务器变得越来越复杂,现在依赖于另一个 .ts 文件中定义的一些类。这造成了一个奇怪的编译问题:

  • tsc server.ts
    编译一切都很好。但是
    node server.js
    崩溃了 从其他 .ts 文件实例化类的第一行

  • tsc --out server.js server.ts
    导致错误消息:“模块 发出与发出的脚本发生冲突“

  • tsc --out serv.js server.ts
    似乎可以工作,但实际上可以编译 除了 server.ts 之外的所有内容。其他文件中的代码就在那里,
    node serv.js
    只是返回,没有任何输出

我不是唯一一个遇到此错误的人,https://typescript.codeplex.com/workitem/294不幸的是,codeplex 上的解决方案对我不起作用。

如何正确使用

tsc

javascript node.js typescript tsc
2个回答
16
投票

您的

server.ts
依赖项必须是使用顶级
export
指令导出其表面积的模块,并且
server.ts
应使用
import
指令加载它们。这里的根本原因是 TypeScript 有两种不同类型的编译宇宙。

第一个是您用于常规网页的默认文件,其中一些简单的加载程序以某种固定顺序获取 1 个或多个源文件并按该顺序执行它们,并且您可以自行进行依赖项排序。这称为“程序”编译。在程序编译中,您可以进行并行编译(a.ts => a.js, b.ts => b.js),也可以使用

--out
进行串联编译((a.ts + b .ts) => out.js).

program编译中,您可以使用

///<reference>
标签引用您的参考文献。如果这些引用是对源文件 (
.ts
) 的引用,则如果使用
--out
,它们将连接到输出中,否则作为并排
.js
文件发出。如果这些引用是对声明文件 (
.d.ts
) 的引用,那么您基本上是说您将获得通过外部加载器加载的那些文件的定义(即浏览器中的
<script>
标签)。

第二种是用于 Node.js 或其他环境的编译类型,这些环境通过运行时依赖解析来执行异步或幂等模块加载。这称为“module”编译。在这里,传递给

--module
tsc
标志很重要,唯一有效的做法是并行编译,因为将单个文件作为模块加载(通常)是 Node.js 中模块加载器的方式等工作。

module 编译中,您可以在顶级对象(函数、类、模块、接口或 var)上使用

export
关键字来控制引用您使用
import
的代码可用的内容。您应该只拥有指向
/// <reference>
声明文件的
.d.ts
标签,因为基于模块的运行时加载器没有加载裸 JS 文件的概念。您将无法使用
--out
进行编译。

永远不想混合搭配这些编译模式,因为它根本行不通。事实上,在 0.8.2.0 中,如果您尝试这样做,

tsc
只会发出错误。


0
投票

我有一个包含大量 TypeScript 文件的 Web 应用程序。这是我解决这个问题的方法:

  1. 在 ~/Scripts 目录中创建了一个全局 _references.ts 文件。该文件对于 Web 项目中的每个 ts 文件都有一个 reference path=...
  2. 接下来我使用 T4 模板生成了这个文件,因为手动管理它变得很痛苦。
  3. 此外,使用 T4 模板,我根据我的 TypeScript 依赖关系订购了 _references.ts 中的引用。例如所有 ..Base.ts 文件都位于顶部。
  4. 此外,我创建了一个 tsc 参数文件,该文件以 -out app.js 开头,后跟项目中每个 ts 文件的列表。 这也是使用 T4 生成的,我称之为 app.tsproj
  5. 最后,我调用 tsc @app.tsproj 来生成所有依赖项都正确排序的 JavaScript。

_references.ts T4 模板:https://gist.github.com/danabenson/5224712

app.tsproj T4 模板:https://gist.github.com/danabenson/5224718

© www.soinside.com 2019 - 2024. All rights reserved.