我正在做一个最初用纯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的答案。
为什么这是个坏主意
-
您的输出工件现在与其他源/输入工件混合在一起。为什么这么糟糕?考虑一下如果删除
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编译器都会覆盖这些更改,并且这些更改将丢失。 -
您有两个级别的源根,具有文件夹层次结构。从概念上讲,这些文件应该在同一级别,并且所有源文件都应该在一个文件夹中。
更好的方法
当将Javascript迁移到Typescript时,一个好的方法是从向Javascript文件添加Typescript注释开始。通过这种方式,您可以保留Typescript的所有优点,而不会给流程增加任何复杂性。当Javascript文件几乎被完全注释时,将其转换为Typescript.ts
文件(这将强制在将来对该文件进行任何更改时使用Typescript(,,但将其与Javascript文件一起保留。然后,在编译时,只需将allowJs
设置为true
,Typescript编译器就会很高兴地将所有Javascript文件输出到Typescript输出目录中。
您提到不能将Javascript文件包装到dist
或任何输出/构建文件夹中,但原因尚不清楚。这似乎是推进这一进程的主要障碍。