3

我有一个奇怪的(但在我看来是明智的)场景。

我有一个网站、移动应用程序,也许还有一个用 Javascript 编写的网络服务器。我有大量的功能在所有这些系统之间共享。这种共享的东西将是模型、存储库、业务逻辑等。

如果我们排除 Web 服务器位,因为这是一个未来的想法,Web 应用程序的目录结构如下:

app
|- assets
|- models
|- services
|- migrations
|- view-models
|- views
|- descriptors

现在,这些应用程序中的每一个都分为 2 个区域,核心和 ui 部分,核心是可重用的东西,例如,models, services, migrationsui 的东西仅用于包含以下内容的应用程序view-models, descriptors(以防你想知道视图都是html 和资产是 css、图像等)。

在我采用 typescript 之前,我有一个构建脚本,它基本上将所有核心文件组合在一起并缩小它们。然后它将所有 UI 组合在一起并缩小它们。这样在移动应用程序中我就可以使用my-app.core.min.js并且每个人都很高兴,我正在重用主 Web 应用程序中的所有可重用组件。但是我不需要 ui 的东西,因为移动 UI 与主要的 web ui 完全不同,而且 web 服务甚至不会有 UI。

所以!

解释完上下文后,让我们回到手头的 Typescript 问题。目前,打字稿文件是由tsc.exe(0.83 版)通过构建脚本编译的,它只是包装了交互。

因此,在新的 Typescript 世界中,该结构现在有一个引用文件夹,如下所示:

app
|- assets
|- models
|- services
|- migrations
|- view-models
|- views
|- descriptors
|- references <- NEW ONE!

references文件夹由包含所有本地引用的构建脚本自动填充,因此它将遍历整个目录树查找所有打字稿文件并构建一个巨大的参考文件,这是一个充满本地打字稿文件引用声明的文件,以查找更多关于我在看这个问题的信息:

你能创建 Typescript 包吗?像 c# dll

所以现在当我运行构建脚本时,会发生以下步骤:


为核心编译

  1. 查找模型、服务、迁移文件夹和子文件夹中的所有 *.ts 文件
  2. 将所有以前的文件添加到一个数组中,并添加参考文件
  3. 用这样的命令运行 tsc.exetsc.exe --out <something>.core.js <previous_file_list>

为 UI 编译

  1. 在视图模型、描述符文件夹和子文件夹中查找所有 *.ts 文件
  2. 将所有以前的文件添加到一个数组中,并添加参考文件
  3. 用这样的命令运行 tsc.exetsc.exe --out <something>.ui.js <previous_file_list>

现在我期待这会输出 2 个my-app.core.js仅包含核心文件的文件,以及一个my-app.ui.js仅包含 ui 文件的文件。然而,它们都包括一切......

现在考虑到这一点,这一定是由于引用,因为它们都引用了所有文件,但是在我看来这只是一个编译依赖,而不是需要用输出的 javascript 编译的东西。在 c#/java 中,您不会期望将引用的 dll/jar 编译到输出的 dll/jar 中,它只是一个必需的运行时依赖项。

我曾尝试拥有 2 个单独的参考文件,一个用于核心,一个用于 ui,但由于 ui 将取决于核心,因此我遇到了同样的问题,尽管至少这种方式my-app.core.js没有任何与 ui 相关的胡言乱语。

那么有没有办法获得引用但不将它们输出到生成的 javascript 文件中?

4

1 回答 1

6

您可以通过为 TypeScript 文件生成定义文件来完成此操作:

tsc --declaration FileName.ts

在您的构建脚本中为每个 TypeScript 文件执行此操作,并使用生成的 FileName.d.ts 作为参考而不是 FileName.ts

我有以下文件:

-BusinessObjects
--Product.ts
--Customer.ts
--Order.ts
--BusinessObjects.d.ts

BusinessObjects.d.ts如下所示:

/// <reference path="Customer.d.ts" />
/// <reference path="Order.d.ts" />
/// <reference path="Product.d.ts" />

对于 Product、Customer 和 Order,每个都有对 BusinessObjects.d.ts 的引用

当我运行时:

tsc --out combine.js Customer.ts Order.ts

输出仅引用客户和订单,不包括产品。当我直接在我的 BusinessObjects.d.ts 文件中引用 *.ts 文件时,组合输出确实包含不需要的文件。

于 2013-04-09T13:14:21.190 回答