我为两个项目都安装了相同的软件包。那个包(不会链接,是私有的)具有react-popper作为依赖关系(依序将create-react-context作为依赖关系),因此,当我运行项目一时,一切正常,但对于项目二却出现了错误:
./ node_modules / react-popper / lib / esm / Manager.js中的错误 找不到模块:错误:无法解析“ /../node_modules/react-popper/lib/esm”中的“ create-react-context”
经过一番调查,我发现node_modules结构是不同的:
对于项目两个保存在../react-popper/node_modules本地文件夹中的所有react-popper依赖项:
我尝试了一些常见的方法,例如重新安装节点模块,清除缓存等,但是结构是相同的。其实我对webpack和babel版本有个想法,但是我认为它不会影响node_modules结构本身。
问题是,哪些因素会影响它?我应该检查什么?
注意:如果我将create-react-context手动添加到项目2中,效果很好,但这不是解决方案。
注意:我发现了类似的问题,但那里没有建议-Why does npm install packages in different directories?,在我重新创建yarn.lock的情况下也有帮助,但看起来也不像解决问题的正确方法。希望我的描述更加完整,并能帮助您解决。
答案 0 :(得分:1)
这很可能是由于yarn(以及npm)尝试依赖deduplicate的方式。假设有模块A和B存在2个版本(1.0.0和2.0.0)。 B取决于模块A的版本1.0.0。
如果仅安装模块B,则将获得如下的node_modules文件夹:
node_modules
- A@1.0.0
- B@2.0.0
但是如果您安装模块A的最新版本(2.0.0)怎么办?如果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将调查项目依赖项(及其依赖项)的每个package.json / package-lock.json文件,并使用此信息来计算重复项最少的依赖项树。