【问题标题】:Excluding references from Typescript compilation?从 Typescript 编译中排除引用?
【发布时间】:2013-04-09 10:37:47
【问题描述】:

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

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

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

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

现在这些应用程序中的每一个都分为 2 个区域,核心和 ui 部分,核心是可重复使用的东西,例如 models, services, migrations,而 ui 东西仅用于包含 @987654326 的应用程序@(如果您想知道视图都是 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 文件夹会被包含所有本地引用的构建脚本自动填充,因此它将在整个目录树中查找所有打字稿文件并构建一个巨大的引用文件,该文件是一个充满引用声明的文件本地打字稿文件,以了解有关查看此问题的更多信息:

Can you create Typescript packages? like c# dlls

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


为核心编译

  1. 在模型、服务、迁移文件夹和子文件夹中查找所有 *.ts 文件
  2. 将所有以前的文件添加到一个数组中并添加参考文件
  3. 使用类似tsc.exe --out &lt;something&gt;.core.js &lt;previous_file_list&gt; 的命令运行 tsc.exe

为 UI 编译

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

现在我希望这会输出 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 文件中?

【问题讨论】:

  • How can typescript generate single one javascript file without reference typescript file code 的可能副本 - 尽管我认为您最好使用模块加载器,而不是摆弄所有这些文件并将其中一些文件组合起来。
  • 我根据客户端/平台使用 LabJS(或 YepNope),稍后加载组合的东西,构建脚本和应用程序非常复杂,但是我已将其简化为一个简单的问题,如前所述多于。你是对的,它基本上是你链接到的问题的一个更详细的版本。此处生成的代码也用作其他人为系统制作插件的合同,因此我生成这些文件不仅用于运行时,还用于 3rd 方合同。
  • 我认为上面的链接问题很相似,stackoverflow.com/questions/13461758/… 也很相似。然而,所有这些感觉就像编译器在 --out 参数上进行批量包含的工作,而不仅仅是包含传递的文件。有谁知道这是否正在编译器中解决,因为我记得读过,如果您有一个引用另一个文件并且您构建该单个文件的文件很好,则不包含任何引用,但是如果您对 --out 执行相同操作标记它将包括两者。

标签: javascript reference typescript build-script


【解决方案1】:

您可以通过为您的 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 文件时,组合输出确实包含不需要的文件。

【讨论】:

  • 会调查一下,你能不能只生成一个大的声明文件,因为它看起来很乱,不得不加载临时的打字稿描述符,然后将它们作为参考来编译真正的打字稿文件到 javascript。只是在这里回答我自己的问题,您可以在使用 out 和多个 args 时生成单个大描述符。
  • @Grofit 您是如何从多个输入生成合并参考文件的?当我尝试tsc --output refs.d.ts --declaration file1.ts file2.ts 时,它创建了一个包含多个文件的输出目录。
  • 我做了tsc.exe --declaration --out my-combined-file-js ... 我只是在最初的调用上捎带,所以它也会输出描述符(所以输出将是my-combined-file.js, my-combined-file.d.ts,因为这对于在组件之间提供代码合同很有用无论如何。但是我意识到存在同样的问题,因为描述符包含引用中的所有内容,然后它变成了 catch 22,没有引用我无法构建我的代码,如果我想引用 d.ts 文件,我会需要为它们构建代码才能存在:(。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多