将"Typescript"文件夹构建为旧版 JavaScript 文件体系结构



我正在做一个最初用纯Javascript编写的项目。我在根级别添加了一个Typescript文件夹,其中包含与原始javascript相同的结构。文件结构如下:

|_ build
|  |_ automatically generated js files from Meta and src using build command
|
|_ meta
|  |_ foo.js, bar.js
|
|_ src
|  |_ baz.js
|
|_ typescript
|  |_ meta
|     |_ foo.ts, bar.ts
|  |_ src
|     |_ baz.ts

当我运行tsc时,我希望Typescript目录中的所有Typescript文件都编译成与根目录中Typescript目录中相同的结构。然而,我看到的大多数使用outDir的示例都将构建到特定的构建文件夹中。

{
"compilerOptions": {
"sourceMap": false,
"noImplicitAny": true,
"module": "es6",
"moduleResolution": "node",
"allowJs": true,
"target": "ES2020",
"lib": ["ES2018"],
"allowSyntheticDefaultImports": true
"outDir" : "" // what can be here to say "use include file structure - typescript dir?
},
"exclude": ["node_modules"],
"include": ["typescript/**/*"]
}

我无法将Javascript目录包装到"dist"文件夹中。我应该如何将tsconfig构建到根级别,匹配typescript目录中的相同目录?

回顾您的需求:

|_ meta // emit js files for typescript/meta here
|_ src  // emit js files for typescript/src here
|_ typescript // root folder for all .ts source files
|  |_ meta
|     |_ foo.ts, bar.ts
|  |_ src
|     |_ baz.ts

为此,我们可以调整tsconfig.json:

{
"compilerOptions": {
// ...
"outDir": ".",
"rootDir": "typescript"
},
"include": ["typescript/**/*"],
"exclude": ["node_modules", "src", "meta", "build"],
}

然后,所有输入的.ts文件将在以下路径中发出(相对于tsconfig.json(:

emit-path: <outDir>/<filePath> minus <rootDir>  (rootDir chopped off from file path)
Example: ./typescript/src/baz.ts  -->  ./src/baz.js

我们可以省略rootDir配置选项:

默认:所有非声明输入文件的最长公共路径。当TypeScript编译文件时,它在输出目录中保持与输入目录中相同的目录结构。

尽管明确它是一种很好的做法,因此如果输入文件的位置出现问题,编译器将触发错误。

摘要

答案是否定的(至少没有一个构建步骤/config(

这是可能的,参见ford04的答案。

为什么这是个坏主意

  1. 您的输出工件现在与其他源/输入工件混合在一起。为什么这么糟糕?考虑一下如果删除typescript/src下的文件夹(例如typescript/src/some-utils(会发生什么情况。因为它已经编译,所以这个文件夹及其下所有编译的源文件都已经存在于src/some-utils目录中。下一次编译时,它们仍将存在。我们该怎么清理?通常,在构建之前会有一个"clean"步骤,它只需删除输出directoy并重新编译即可。但是现在src中有源文件!

    我们没有简单的方法来区分源文件和typescript输出文件。我们可以删除src目录,然后删除git checkout -- src来恢复源文件。但是如果我们正在编辑一些文件呢?我想我们可以把零钱藏起来:git stash; rm -rf src; git checkout -- src; git stash pop;。但是未跟踪的文件仍然丢失!好的…git add src; git stash; rm -rf src; git checkout -- src; git stash pop; git restore --staged src。这主要修复了一些问题,但我们拥有的任何暂存文件仍然没有暂存。你可以看到这变得多么复杂。

    但这种布局还有一个更严重的问题。我们不能.gitignore任何Typescript文件,所以Git会不断显示未跟踪的文件。无法检测是否有人意外提交了已编译的Typescript文件。如果有人试图更改已提交的已编译Typescript文件,则问题可能会变得更加复杂。每次运行时,Typescript编译器都会覆盖这些更改,并且这些更改将丢失。

  2. 您有两个级别的源根,具有文件夹层次结构。从概念上讲,这些文件应该在同一级别,并且所有源文件都应该在一个文件夹中。

更好的方法

当将Javascript迁移到Typescript时,一个好的方法是从向Javascript文件添加Typescript注释开始。通过这种方式,您可以保留Typescript的所有优点,而不会给流程增加任何复杂性。当Javascript文件几乎被完全注释时,将其转换为Typescript.ts文件(这将强制在将来对该文件进行任何更改时使用Typescript(,,但将其与Javascript文件一起保留。然后,在编译时,只需将allowJs设置为true,Typescript编译器就会很高兴地将所有Javascript文件输出到Typescript输出目录中。

您提到不能将Javascript文件包装到dist或任何输出/构建文件夹中,但原因尚不清楚。这似乎是推进这一进程的主要障碍。

最新更新