pnpm workspace 中如何正确引用本地包?

南宫雨妍 阅读 24

我在用 pnpm 的 workspace 功能,主项目想引用另一个本地 package,但总是报模块找不到。我试过在 package.json 里加 dependencies,也运行了 pnpm install,但还是不行。

比如我的结构是这样的:

import { greet } from 'my-utils';

console.log(greet('world'));

这个 my-utils 是 workspace 里的一个子包,已经配置了 name 和 exports,但运行时提示 Cannot find module ‘my-utils’,到底哪里出错了?

我来解答 赞 8 收藏
二维码
手机扫码查看
1 条解答
爱学习的梓玥
这个问题很典型,基本是这几个地方没配对:

1. 子包的 name 字段

确认你的 my-utils 包的 package.json 里有 name 字段,而且名字要完全一致:

{
"name": "my-utils",
"version": "1.0.0",
"main": "dist/index.js"
}


2. 根目录的 pnpm-workspace.yaml

确保根目录有 workspace 配置:

packages:
- 'packages/*'


或者你的目录结构可能不是 packages/ 开头,那改成你实际的路径。

3. 主项目的 dependencies

在主项目的 package.json 里明确声明依赖:

{
"name": "main-project",
"dependencies": {
"my-utils": "workspace:*"
}
}


重点是 workspace:* 这个协议,pnpm 需要这个来识别是本地 workspace 包。

4. 执行安装

配置改完之后,一定要删掉 node_modules 和 pnpm-lock.yaml,重新跑一遍:

rm -rf node_modules pnpm-lock.yaml && pnpm install


pnpm workspace 对符号链接的处理比较敏感,有时候缓存会导致问题。

5. 常见坑:子包没有正确导出

如果 my-utils 是用 TypeScript 写的,确认它的 package.json 里的 main 或 exports 指向的是编译后的 JS 文件,而不是 .ts 源文件。pnpm 不会自动编译 TypeScript。

你检查一下这几个配置点,基本就能定位问题在哪里了。
点赞
2026-03-17 11:04