pnpm monorepo ts 项目互相引用 scope 包,找不到模块?

是这样的,我在一个仓库中创建了 pnpm monorepo:

packages:
  - 'packages/*'
  - 'pages'

我在 packages/hagao/ 目录创建了一个 ts 工程,是一个很简单的库:

packages/hagao:
  - src/index.ts
  package.json

这个工程只导出了一个 aaa 变量用于测试:

// packages/hagao/src/index.ts
export const aaa = 1

这个 hagao 包的名称是:

{
  "name": "@jamcaalaa/hagao"
}

然后我在 pages 下创建了一个 Vue3 Vite Ts 工程,包名称叫 page,用于做个 SPA 页面,并把 @jamcaalaa/hagao 安装至此:

# repo 根目录
pnpm add @jamcaalaa/hagao --filter page

但是在 page 项目中导入 aaa 变量会报错,找不到模块:

image.png

我发现一个兄弟也这么干过:github.com/kongweigen/pg-kit,但是他的组件包并不是 scope 包,即名称不是 @ 起头的,我也尝试过,的确没问题,我的是有 scope 的就一直报错。

我在 Google 上找答案,找到一个折衷的办法,就是在 page 包的 tsconfig.json 中声明 path,于是就能正常提示了:

image.png

但是我观察到 vuejs 的 packages 并不需要这样声明 path 也可以用,我不知道是哪里出了差错,是不是两个 package 的 typescript 不通用的原因?

阅读 5.1k
3 个回答

已通过添加 scope 包的 package.json exports 字段解决

需要在 package.json 文件中的 dependenciesdevDependencies 里添加 @jamcaalaa/hagao 的依赖(由于您使用的是 monorepo,安装时需要加上 --no-link 参数)。如果您在创建 page 项目时没有使用 pnpm,也需要确保使用了 pnpm 来安装依赖。

{
  "name": "page",
  "dependencies": {
    "@jamcaalaa/hagao": "^1.0.0"
  }
}

然后在需要使用 aaa 变量的文件里,导入该模块即可:

import { aaa } from '@jamcaalaa/hagao'

console.log(aaa)

如果仍然出现找不到模块的错误,可以尝试在 page 项目的根目录下运行 pnpm install,以确保依赖已经正确安装。

新手上路,请多包涵

其实 package.json 设置一下 main 属性就可以了= =

推荐问题
logo
Microsoft
子站问答
访问
宣传栏