[eggjs/egg]使用 pnpm 安装 egg 依赖之后,pnpm dev 时报错,插件找不到

2025-10-27 693 views
6

pnpm dev 之后报错: 2021-08-18 00:05:47,902 ERROR 301 nodejs.Error: Can not find plugin egg-onerror in "/mnt/e/workspace/front-project/fadog/fadog-portal/portal/node_modules, /mnt/e/workspace/front-project/fadog/fadog-portal/node_modules/.pnpm/registry.nlark.com+egg@2.30.0/node_modules/egg/node_modules, /mnt/e/workspace/front-project/fadog/fadog-portal/portal/node_modules"

/mnt/e/workspace/front-project/fadog/fadog-portal/node_modules/.pnpm/registry.nlark.com+egg-cluster@1.27.0/node_modules/egg-cluster/lib/agent_worker.js:32 throw err; ^

Error: Can not find plugin egg-onerror in "/mnt/e/workspace/front-project/fadog/fadog-portal/portal/node_modules,

相关环境信息
  • 操作系统
  • windows
  • Node 版本
  • 12.19.0
  • Egg 版本
  • 2.30.0

之前有同学提过类似的问题,我使用 pnpm install --shamefully-hoist 并没有起作用。

回答

0

pnpm 6.0 使用 --shamefully-hoist 是可以的

2

--shamefully-hoist

这等于没用 pnpm

8

Hello @aidening. Please provide a reproducible example following the instruction.

Issues labeled by Need Reproduce will be closed if no activities in 7 days.


@aidening,请根据这个说明提供最小可复现代码。

如果在 7 天内没有进展会被自动关闭。

3

最小可复现

mkdir showcase && cd showcase
$ npm init egg --type=ts
$ pnpm install
$ pnpm dev
8

image

昨天分析了下 pnpm 的那个目录结构,大概知道为啥 egg 会 break 了,它把子依赖提了一级,这样虽然在 require 里面是支持上溯的,但 egg loader 不会有这个行为。

举个例子,yadan-framework 有一个 egg-xx 的插件,在 pnpm 里面的目录是:

yadan-framework@1.0.0
  | - node_modules
       |- yadan-framework
       |- egg-xx

而不是我们希望的标准的:

yadan-framework@1.0.0
  | - node_modules
       |- yadan-framework
            | - node_modules
                   |- egg-xx

我们 loader 里面应该是插件定位的时候,有可能用了 path.resolve 或 fs.exists 啥的,而不是 require.resolve,所以可能找不到。(回头可能要跟着源码跑一下才能确定)

暂时不打算支持(3 里面再看看),先用 pnpm install --shamefully-hoist 的方式规避吧。

1

eggjs@3提上日程了?

4

看了下 egg-core 源码:https://github.com/eggjs/egg-core/blob/master/lib/loader/mixin/plugin.js#L353

image

差不多就是这段逻辑,粗暴的写法就是 lookupDirs 数组每一个都要再判断下自己的同级目录。 优雅一点的话,不应该用 existsSync 来判断,而是用 require.resolve,不过要试下,要传第二个参数才行。

回头找时间优化下,也欢迎有空的同学直接提 PR。

2

重新安装下依赖看看,应该支持了