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

Posted

技术标签:

【中文标题】如何在打字稿monorepo中导入本地包【英文标题】:How to import local package in typescript monorepo 【发布时间】:2019-04-23 06:42:05 【问题描述】:

给定一个 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

【问题讨论】:

您应该使用项目参考。见the second half of this answer, under "this is great for monorepos" 【参考方案1】:

您可以通过指定base url 和(在更复杂的情况下)使用path mapping 来做到这一点。

如果project_root中有tsconfig.json,可以通过定义实现想要的导入策略

"compilerOptions": 
  "baseUrl": "."

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

如果不是这样,你可以使用paths:

"compilerOptions": 
  "baseUrl": ".", // This must be specified if "paths" is.
  "paths": 
    "A": ["packageA"],
    "B": ["packageB"],
    "A/*": ["packageA/*"],
    "B/*": ["packageB/*"]
  

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

resolve: 
  alias: 
      A: path.resolve(__dirname, 'packageA/'),
      B: path.resolve(__dirname, 'packageB/')
  

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

【讨论】:

谢谢你提供的例子,但它似乎不能开箱即用(没有捆绑器)。包路径不会转换为包的相对路径。见文章medium.com/@caludio/… 我仍在尝试按照文章中的示例进行操作。 你能指定你如何尝试运行你的javascript文件吗?如果你使用webpack,你可以specify the same resolutions there,如果你直接通过node运行js文件,你可以使用npm link。如果你更新你的问题,我会更新我的答案 根据您的情况,也可以使用local paths。也许链接各个项目就足够了四个你的用例,你甚至不需要打字稿级别的配置 嘿,您已经使用 ts-node 和 tsconfig-paths 自己解决了,非常好 :) 我相应地更新了答案

以上是关于如何在打字稿monorepo中导入本地包的主要内容,如果未能解决你的问题,请参考以下文章

如何在打字稿中导入js文件作为模块

如何在打字稿项目中导入节点模块。 ERR_REQUIRE_ESM

如何使用打字稿在可重用组件中导入html样式属性?

为啥 vscode 从打字稿缓存中导入包

如何从 typescript 项目中导入 npm 包?

如何让 VS Code 识别单回购包之间的打字稿声明?