我在ts中有一个服务器项目,我使用ts节点来运行它。
我有另一个名为public的文件夹,其中存放静态文件。
我需要的是一种在to_public文件夹中写入.ts文件的方法,这样它们将与服务器的接口进行类型检查,但输出为.js,而不必传输所有定义文件。
例如

// A.ts
export interface A { key: string }

// file.ts
import {A} from '../A.ts'
function f(a:A){ console.log(a.key) }

所需结构:
SRC
自动变速器
公开
文件.ts
公众的
文件.js
我的tsconfig.json
   "compilerOptions": {
      ...
     "outDir": "../../public/js/",
   }
  "include": [
   "../../src/public_ts"
  ],

当file.ts没有引用任何东西时,这是完美的。
但当我引用src中的任何内容时,会复制整个文件夹结构。这是实际结果:
SRC
自动变速器
公开
文件.ts
公众的
A.JS公开文件.js
尽管编译后的file.js没有引用任何东西,我可以按原样使用它,但我不希望我的整个src项目被复制到public
有什么建议吗?谢谢

最佳答案

捆绑解决方案:
您的场景似乎是捆绑器的一个很好的用例。这是一个分析代码并绘制所有依赖项以生成单个输出文件的工具。流行的选择有webpackbrowserifyparcel
这意味着从导入的依赖项将包含在为公共脚本生成的输出文件中。
包裹有一个“零配置”的理念,这意味着(与WebPACK或BuelSimple非常不同)它将不需要安装。
我重新创建了你的代码:
SRC
自动变速器
公开
文件1.ts
文件2.ts
我已经在全球安装了包裹(npm install -g parcel),所以我可以运行:

parcel build src/to_public/*

这将查看您的to_public文件夹并将所有脚本打包在其中。邮包知道打字稿并自动调用排字编译器。生成的脚本将复制到新的dist/目录中。您的文件夹现在如下所示:
SRC
//…
距离
文件1.js
文件2.js
对于to_公用文件夹之外的文件,您需要typescript的完全支持,但不需要编译它们。为此,可以将noEmit标志添加到编译器选项中。
{
    "compilerOptions": {
        "module": "commonjs",
        "noEmit": true
    },
    "exclude": [
        "node_modules"
    ]
}

包裹有一些很好的特点。例如,它会缓存编译,如果您重复调用它,它会非常快。此外,它还与javascript生态系统中的其他工具有很好的接口。与typescript编译器的互操作是无缝的。包裹将使用来自TSCONFIG的设置,甚至默认情况下生成SyrMeCAMP。
当然,也可以为替代方案提供强有力的案例。我推荐包裹在这里,因为它基本上是零成本。只需安装软件包,不需要任何配置,它就可以正常工作。
不带捆绑器的解决方案:
如果你想避免捆绑,你可以使用多个编译器配置。问题是typescript需要知道您正在使用的接口。它可以通过查看源代码或读取定义文件来实现这一点。因此,您的答案是一个可行的解决方案,但如果定义是自动创建的,那就更好了。我已经设置了三个编译器配置:
一般语法检查
生成定义文件
编译公共JavaScript
默认的配置是这个,它将由编辑器选择。我已将noEmit设置为true,以避免意外编译而弄乱文件夹结构。
tsconfig.json
{
    "compilerOptions": {
        "module": "commonjs",
        "noEmit": true,
        "rootDir": "src"
    }
}

然后我将您的源目录分为src/serversrc/to_public。如果没有这个拆分,很难从编译器中排除文件(必须手动列出它们)。
下面是生成声明文件的配置文件。它只有标志EITSt声明,输出目录是您的公共JavaScript文件夹:
definitions.json
{
    "compilerOptions": {
        "module": "commonjs",
        "declaration": true,
        "emitDeclarationOnly": true,
        "noResolve": true,
        "rootDir": "src",
        "outDir": "src/to_public"
    }
}

如果运行上面的配置,它将从服务器端代码生成声明。这可以用于最后的编译器配置。它读取to_公用文件夹中的文件并将其编译到输出目录。这里重要的编译器标志是noResolve,这将避免将声明文件复制到输出文件夹。
public_scripts.json
{
    "compilerOptions": {
        "module": "commonjs",
        "noResolve": true,
        "rootDir": "src/to_public",
        "outDir":"public/"
    },
    "exclude": ["src/server"]
}

现在可以使用
tsc -p definitions.json
tsc -p public_scripts.json

请注意导入路径。如果要在server/A.ts中使用to_public/file.ts,则导入"./server/A.ts"

关于node.js - 编译另一个没有所有引用的 typescript 输出目录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53174309/

10-11 23:44