给定一个 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
您可以通过指定基本 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 安装)
| 归档时间: |
|
| 查看次数: |
5908 次 |
| 最近记录: |