如何在打字稿 monorepo 中导入本地包

Jai*_*cap 10 npm typescript

给定一个 monorepo 项目。 --project_root/ |--packageA/ |--index.ts |--package.json |--foo/ |--index.ts |--packageB/ |--index.ts |--package.json |--bar/ |--spam.ts 通常,当您进入packageA/index.ts并想要导入时,packageB/index.ts您会这​​样做import index from '../packageB'

当你packageA/foo/index.ts想要导入时,packageB/index.ts你需要向上移动两个目录import index from '../../packageB'

问题是,有没有办法像import index from 'packageB嵌套文件夹一样导入import spam from 'packageB/bar/spam'

编辑

我已经上传了一个 github repo 来演示这个问题 https://github.com/jaimesangcap/lerna-ts-monorepo

Joh*_*ter 8

您可以通过指定基本 url和(在更复杂的情况下)使用path mapping 来完成此操作

如果您有一个tsconfig.jsonin project_root,则可以通过定义来实现所需的导入策略

"compilerOptions": {
  "baseUrl": "."
}
Run Code Online (Sandbox Code Playgroud)

如果包名称始终与子项目的文件夹名称相对应,则此方法有效。

如果不是这种情况,您可以使用paths

"compilerOptions": {
  "baseUrl": ".", // This must be specified if "paths" is.
  "paths": {
    "A": ["packageA"],
    "B": ["packageB"],
    "A/*": ["packageA/*"],
    "B/*": ["packageB/*"]
  }
}
Run Code Online (Sandbox Code Playgroud)

这将导致 typescript 在编译期间正确解析导入的类型。然而,在编译的 javascript 中没有解析导入路径,这意味着有必要告诉管道中的下一步(通常是像 webpack 这样的打包器)如何解析这些导入。对于 webpack,这可以通过在 webpack 配置中指定别名来完成:

resolve: {
  alias: {
      A: path.resolve(__dirname, 'packageA/'),
      B: path.resolve(__dirname, 'packageB/')
  }
}
Run Code Online (Sandbox Code Playgroud)

如果你想直接执行打字稿文件,ts-node是最简单的方法,因为如果你使用tsconfig-paths,它已经知道打字稿配置的修改路径- 在这种情况下你只需要执行文件使用ts-node -r tsconfig-paths/register packageA/index.ts(ts-node并且tsconfig-paths必须通过 npm 安装)