如何协调 monorepo 与多个 tsconfig.json 每个都有自己的路径?

Mat*_*bst 9 typescript ts-node

我们有一个像这样的代码库设置:

-A
--utils
---index.ts
--index.ts
--tsconfig.json
-B
--utils
---index.ts
--index.ts
--tsconfig.json
-tsconfig.json
Run Code Online (Sandbox Code Playgroud)

我们的根tsconfig.json包含以下内容:

    "paths": {
      "A/*": ["A/*"],
      "B/*": ["B/*"],
    },
Run Code Online (Sandbox Code Playgroud)

每个包tsconfig.json包含以下内容:

    "paths": {
      "utils/*": ["./utils/*"],
    },
Run Code Online (Sandbox Code Playgroud)

这适用于我们当前的目的,因为我们目前只使用 TS 进行类型检查,但我们实际上使用 Babel 生成构建,它alias在各种.babelrc文件的属性中具有类似的设置。

我们希望开始使用ts-node(或等效的)运行代码,但在运行时遇到了问题,TS 不知道如何解析模块。例如:

// A/index.ts
import { someUtil } from 'utils'
export const someFunc() => someUtil();
Run Code Online (Sandbox Code Playgroud)
// B/index.ts
import { someFunc } from 'A';
Run Code Online (Sandbox Code Playgroud)

当我们运行时,npx ts-node ./B/index.ts我们收到一条错误消息,提示“无法找到模块 'utils'。

我们知道我们可以通过将所有内容提升到 root 来实现这一点tsconfig.json,但是import { someUtil } from 'A/utils当您已经在包 A 中时,这样做似乎是多余的。

有没有办法以我们现有的方式使用路径?我们还阅读了一些关于项目引用的内容并尝试过,但似乎并没有让我们取得任何进展。

Wil*_*ena 12

tsconfig.json在每个项目的文件内,您应该extends在根目录上使用tsconfig,如下所示:

// A/tsconfig.json
{
 "extends": "../tsconfig.json",
 ...
}
Run Code Online (Sandbox Code Playgroud)

这样所有的子项目都会继承其他通用包的路径。

我认为您甚至可以utils在根上定义路径,这样您也不必重复。

有关该选项的更多信息请参见extends此处:

https://www.typescriptlang.org/docs/handbook/tsconfig-json.html#tsconfig-bases

更新

您还需要使用这个库:

https://www.npmjs.com/package/tsconfig-paths

并在您使用的属性的脚本package.json中: 。ts-nodescriptsts-node ... -r tsconfig-paths/register ... index.ts

该库将读取 中的包ts-config.json并将它们放入 中node_modules,这样当您使用 node 或 ts-node 运行时,其他包就可以找到它们。