为什么相同的包以不同的方式安装?

Why the same package are installed in a different way?

我为我的两个项目安装了相同的包。那个包(不会 link,它是私有的)有 react-popper 作为依赖(按顺序有 create-react-context 作为依赖),所以,当我 运行 项目一 -一切正常,但项目二出现错误:

ERROR in ./node_modules/react-popper/lib/esm/Manager.js Module not found: Error: Can't resolve 'create-react-context' in '/../node_modules/react-popper/lib/esm'

经过一些调查,我发现 node_modules 结构不同:

重装node模块、清除缓存等常用的方法都试过了,但结构是一样的。实际上我对 webpack 和 babel 版本有想法,但我认为它不会影响 node_modules 结构本身。

那么问题来了,哪些因素会影响呢?我应该检查什么?

注意:如果我手动将create-react-context添加到项目二,它工作正常,但这不是解决方案。

注意:我发现了类似的问题,但那里没有建议 - Why does npm install packages in different directories?,我的情况 re-creating 或 yarn.lock 也有帮助,但它看起来也不是解决问题的正确方法。希望我的描述更完整,并有助于弄清楚。

这很可能是因为 yarn(以及 npm)尝试 deduplicate 依赖的方式。假设存在两个版本(1.0.0 和 2.0.0)的模块 A 和 B。 B 依赖于模块 A 的版本 1.0.0。

如果您只安装模块 B,您将得到一个 node_modules 文件夹,如下所示:

node_modules
- A@1.0.0
- B@2.0.0

但是,如果您安装最新版本 (2.0.0) 的模块 A 会怎样?如果 npm 刚刚更新了模块 A 的版本,您现有的模块 B 将(可能)不再工作,因为它依赖于模块 A。因此您的 node_modules 文件夹将看起来像这样(A@1.0.0 已移入内部B 的 node_modules 文件夹)

node_modules
- A@2.0.0
- B@2.0.0
-- A@1.0.0

您的 2 个项目可能有更多的依赖项,它们以某种方式与 react-popper 或其依赖项重叠。由于 nodeJs 模块解析机制,这通常应该不是问题。

TLDR:node_modules 文件夹的确切结构取决于您的所有依赖项(和 devDependencies)。 yarn/npm 将查看项目依赖项(及其依赖项)的每个包。json/package-lock。json 文件并使用此信息计算重复最少的依赖项树。