如何防止在 node_modules 中嵌套 node_modules

Posted

技术标签:

【中文标题】如何防止在 node_modules 中嵌套 node_modules【英文标题】:How to prevent nested node_modules inside node_modules 【发布时间】:2019-01-18 01:59:37 【问题描述】:

我已经创建了自己的 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

【问题讨论】:

【参考方案1】:

在 node_modules 文件夹中有较少的嵌套文件夹和在 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 安装。 运行可执行文件flatten-packages 重新排列项目目录中node_modules 文件夹中的所有包。 Flatten 将删除旧版本的包。您应该注意与版本中断更改相关的错误。

【讨论】:

感谢您的解释。我会在星期一仔细检查并接受它是否解决了我的问题 回复哪些有效,哪些无效,以便我们弄清楚发生了什么。 :) 看起来我有相同版本的@material-ui/core,但@material-ui/icons 不同,这就是我嵌套node_modules 的原因。谢谢! 为什么不使用npm dedupe(不危险)来展平依赖树?【参考方案2】:

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

你可以将命令放在package.json 中的postinstall 脚本中,每次NPM 安装包时,npm dedupe 命令都会为你平展所有相同版本的重复包。

欲了解更多信息,请参阅https://docs.npmjs.com/cli/dedupe

npm postinstall script

【讨论】:

这适用于一级嵌套依赖项。对于以下情况,它不起作用-node_modules/dependency1/node_moduels/dependency2/node_modules/dependency_not_being_removed有关如何在此级别中删除的任何建议【参考方案3】:

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

【讨论】:

【参考方案4】:

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

清除本地 node_modules 文件夹缓存

rm -rf node_modules

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

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

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

【讨论】:

以上是关于如何防止在 node_modules 中嵌套 node_modules的主要内容,如果未能解决你的问题,请参考以下文章

Electron Builder 不包括嵌套的 node_modules

Angular node_modules:正确包含 JQuery 并防止“未定义窗口”错误

“npm install” 将所有依赖项安装在 node_modules 目录中,而不是嵌套它们

如何防止 Swift 3 中的嵌套完成块?

Vue JS 2. 如何防止在两个父级之间导航时重新加载相同的嵌套组件?

如何在javascript中将嵌套集转换为嵌套数组?