Npm 如何防止在节点\u模块中嵌套节点\u模块

Npm 如何防止在节点\u模块中嵌套节点\u模块,npm,npm-install,node-modules,Npm,Npm Install,Node Modules,我已经创建了自己的npm包,我们称之为XYZ,它在package.json文件中有@material ui依赖项 当我在项目A中安装它时,我在XYZ文件夹中有嵌套的node_模块,所以它是\node_模块\XYZ\node_模块\@材质ui,但当我在项目B中安装它时,我没有嵌套的node_模块文件夹。项目A和B的package.json文件中都有@material ui,版本相同 如何强制我的XYZ软件包使用\node\u modules中的@material ui?嵌套文件夹较少有好处,而直接

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

当我在项目A中安装它时,我在XYZ文件夹中有嵌套的node_模块,所以它是\node_模块\XYZ\node_模块\@材质ui,但当我在项目B中安装它时,我没有嵌套的node_模块文件夹。项目A和B的package.json文件中都有@material ui,版本相同


如何强制我的XYZ软件包使用\node\u modules中的@material ui?

嵌套文件夹较少有好处,而直接在node\u modules文件夹中有更多文件夹则有坏处,并且存在版本控制问题

使用正确的npm版本 正确的纱线和npm ie:npm v3不应存在此类结构问题。在可能的情况下,它应该始终扁平化整个结构,并且只有当版本与顶部的版本不兼容时,才具有嵌套的node_模块

检查版本 所以,如果你让它在一个项目上正常工作,而不是在另一个项目上正常工作,这可能是由于版本的原因。检查@material ui在这两个界面上是否是相同的版本。也许两个不同的包在某一点上相互冲突

检查如何安装它们 从你的问题来看,它说的是同一个版本。但是,您没有提到如何在这两个项目上安装软件包。如果使用Thread link或npm link进行安装,则应按照预期正确安装依赖项

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

用手压平它们是危险的 有几个方案可以有力地解决这个问题。它们将遍历嵌套的node_模块文件夹,并将其展平到单个文件夹中

扁平包装 使用npm安装-g扁平化软件包安装。 运行可执行文件展平程序包以重新排列项目目录中node_modules文件夹中的所有程序包。 展平将删除包的旧版本。您应该注意与版本中断更改相关的错误。 您可以使用npm重复数据消除命令来完成此操作

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

有关详细信息,请参阅


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

我对公认的答案还有一个补充:

清除本地节点\u模块文件夹缓存 rm-射频节点单元模块

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

一旦通过package.json dependencies删除了直接依赖项,这些包将从/node_模块中删除。这可能会导致一个错误,新模块仍然嵌套在依赖项下,而不是像预期的那样移动到根目录下


因此,通过清除本地节点模块,您可以重新安装一个干净的节点,并让展平开始工作。

感谢您的解释。我将在周一再次检查,并接受它是否解决了我的问题。请说明哪些有效,哪些无效,以便我们能够找出发生了什么看起来我有相同版本的@material ui/core,但是@material ui/icons不同,这就是为什么我有嵌套的node_模块。非常感谢。为什么不使用npm重复数据消除来展平依赖关系树并不危险?这对于一级嵌套依赖关系很有效。对于以下场景,其不起作用-删除了关于如何在此级别删除的任何建议