如何防止 node_modules 内嵌套 node_modules

How to prevent nested node_modules inside node_modules

我创建了自己的 npm 包,我们称它为 XYZ,它在 package.json 文件中具有 @material-ui 依赖项。

当我在项目 A 中安装它时,我在 XYZ 文件夹中嵌套了 node_modules(所以它是 A\node_modules\XYZ\node_modules\@material-ui),但是当我在项目 B 中安装它时,我没有嵌套 node_modules ] 文件夹。项目 A 和 B 的 package.json 文件中都有 @material-ui 且版本相同。

如何强制我的 XYZ 包使用 A\node_modules 中的 @material-ui

有较少嵌套文件夹的好处和有更多文件夹直接在 node_modules 文件夹中的缺点和版本控制问题。

使用正确的 npm 版本

正确的yarnnpm(即:npm v3)不应该有这样的结构问题。它应该尽可能地展平整个结构,并且 只有在版本与顶部版本不兼容时才嵌套 node_modules。

检查版本

因此,如果您让它在一个项目上正常运行而在另一个项目上运行不正常,则可能是版本问题。检查 @material-ui 两者的版本是否相同。也许两个不​​同的包在某些时候相互冲突。

检查你是如何安装它们的

从你的问题来看,它说是同一个版本。但是,您没有提到如何在两个项目上安装您的包。如果您使用 yarn linknpm link 安装,它应该按预期正确安装依赖项。

检查您是否使用了不同的软件包

如果您查看软件包,最近 material-ui 已被弃用,通知上说要升级到 @material-ui/core。可能是该文件夹中的某些包不相同。无论哪种方式,每当存在依赖冲突时都是这样。检查 @material-ui 文件夹。

手动将它们压平(危险)

有几个包可以有效解决这个问题。他们将通过嵌套的 node_modules 文件夹并将它们展平到单个文件夹中。

flatten-packages

  • 安装,npm install -g flatten-packages
  • 运行 executable flatten-packages 重新排列项目目录中 node_modules 文件夹中的所有包。
  • Flatten 将删除旧版本的包。您应该注意版本中断更改相关的错误。

您可以使用 npm dedupe 命令来完成此操作。

你可以把命令放在package.jsonpostinstall脚本中,每次NPM安装包时,npm dedupe命令会为你把所有重复的包压平在同一个版本中。

有关详细信息,请参阅 https://docs.npmjs.com/cli/dedupe

npm postinstall script

我在使用 NPM 包的 React Native 应用程序中遇到了同样的问题。 问题是在项目 A 中使用的 React Native 版本 (0.59.5) 低于我的包中使用的版本 (0.59.8)。 在一个全新的项目(B)中安装包,当然当时使用的是最新版本的 React Native,与我的包(0.59.8)相同。

我对已接受的答案还有一个补充:

清除本地 node_modules 文件夹缓存

rm -rf node_modules

小心处理: 有时将项目迁移到新的 npm 模块会导致 node_modules 文件夹内出现奇怪的缓存问题,尤其是那些已经存在了一段时间的文件夹,或者碰巧在子依赖项中安装了 较新版本的软件包 与根目录中安装的版本不同。

一旦您通过 package.json 依赖项删除了直接依赖项,这些包将从 <root>/node_modules 中删除。这可能会导致新模块仍嵌套在您的依赖项下而不是按预期移动到根目录下的错误。

因此,通过 清除您的本地 node_modules,您可以进行干净的重新安装并让扁平化发挥作用。