首页 > 解决方案 > 为什么一个 npm 模块会删除其他 npm 模块?

问题描述

整个“nvm”-“npm”惨败令人作呕。一方面,他们应该在 npm 网站的顶部有一个闪烁的红色大横幅,上面写着:“如果你打算用 Node.js 做任何事情,你最好现在就决定从你的文件夹中删除空间名字。” 我从来没有看到任何清理我的路径名的警告。我试图稍后返回并从路径中删除那些空格并没有帮助。就 npm 而言,我对这些空白犯了死罪,我为这个错误付出了沉重的代价。

据我所知,也许我还在付钱。为什么当您将“nodemon”安装为开发依赖项npm install --save-dev nodemon(而不是仅将其全局安装在一个完全独立的文件夹npm install -g nodemon中)时,它为什么会删除“npm”?哦,npm 文件仍然位于它们一直存在的相同位置,但是当您进入命令提示符并键入 npm -v 终端时,就像他从未听说过 npm 一样……就像您必须说俄语一样。

好的,所以让我们使用 Node.js 安装可执行文件来“重新安装”已经休假的 npm(实际上,*.msi 文件将其称为“修复”安装。)现在,您可以恢复您的 npm。伟大的。但是现在你有了一个新的“npm”文件夹,其中有数百个“node_modules”位于 npm 的子目录中。这就是他们所说的修复?

但你的麻烦还没有结束。让我们安装非常流行的 npm 模块:“dotenv”作为开发依赖项。这一次,“nodemon”文件夹(你刚刚安装 1 分钟)已被删除,是的,(再次,)npm 已经钓鱼了。也就是说 npm -v ,即使 npm 文件没有消失,也不再起作用。

我愿意知道。在我完成编写我的第一个幼稚简单的 Node.js 模块之前,我需要重新安装多少次 npm?

npm 垃圾是免费的,这是一件好事。他们不能把我们的钱还给我们。

标签: node.jsnpm

解决方案


我可能会因为回答我自己的问题而被钉死在十字架上,但它对我有用。

底线是:每个人都应该能够合理地预期,当他们安装一个软件包时,它不会蚕食他们已经安装的其他软件,也不会破坏他们的操作系统。但这就是这个 npm 垃圾发生在我身上的事情。

如果你想知道你是否有同样的问题,只需运行这个测试:

  1. 安装 npm 和 Node.js 然后,再安装大约 5 个您选择的 npm 模块。

  2. 安装完成后,您应该立即卸载所有 5 个 npm 包,以及 Node 和 npm。

  3. 安装和卸载完成后,您应该留下一个空文件夹。如果文件夹还剩下任何东西,那么您的 npm 模块一直在互相咀嚼,并吐出碎片供您清理。

这就是发生在我身上的事情。而且我怀疑,每当您在 YouTube 上听到有人建议您应该“全局”安装 Nodemon 时,我的猜测是他们遇到了与我相同的问题,但他们不知道如何解决它,所以他们只是推 Nodemon进入另一个文件夹,它不能破坏他们已经安装的其他模块。

但他们的“解决方案”实际上并不是一个坏主意。为什么不把每个 npm 模块放到它自己单独的文件夹中呢?您可以对每个包进行沙箱处理,以保护它免受您以后安装的其他包的影响。

为了使我的解决方案清晰,我将绘制我建议的文件夹结构图。我们首先安装 npm 和 Node:

Node
  |
  |__node_modules

现在,npm 希望您继续将所有其他 npm 包安装到该node_modules文件夹​​中。但是您可以强制 npm 将每个 npm 包放入您可以选择的文件夹中,以便新结构如下所示:

Node-14
  |
  |
  |_____myExpress
  |       |
  |       |__node_modules
  |
  |_____Joi-13
  |      |
  |      |__node_modules
  |
  |
  |__node_modules ( should be NODE ONLY ...
                                nothing else. )

这是可以让您实现上述结果的命令。在命令提示符中,您必须首先导航到Node-14上面显示的文件夹。进入该文件夹后,键入以下命令:

npm install --prefix ./myFolder npm-package

npm 将愉快地创建名为“myFolder”的文件夹,然后将安装您请求的最新版本的“npm-package”。

这里有几个例子:

npm install --prefix ./myExpress express
npm install --prefix ./NodeMon-dev nodemon
npm install --prefix ./Joi-13 joi@13.1.0

在上面的示例中,我在 NodeMon 文件夹名称中添加了 -dev 后缀,以表示此包用于开发目的。

此外,“joi”示例向您展示了如何故意安装旧版本的 npm 包,无论出于何种原因。

我给出的指示有一个警告。我说过你可以选择你想要的任何文件夹名称。这不是 100% 正确的。如果您选择与包名称完全相同的文件夹名称,则会遇到问题。例如,

npm install --prefix ./passport passport

如果你输入上面的命令,npm 会告诉你'passport' 已经安装,并且是最新的。

这当然是谎言。

只是另一个 npm 说垃圾的例子。

但是为了清楚地说明这个问题,在下面的命令中:

npm install --prefix ./Passport passport

文件夹名称“Passport”与 npm 包“passport”不完全相同(因为大写字母),因此该命令可以正常工作。

为了全面披露,我必须承认使用上面的安装策略是要付出代价的:当你在你正在编写的 Node.js 软件中“要求”一个 npm 包时,它就不再短了甜美:

const express = require('express'); 

相反,您将不得不单独“搜索”每个模块,因为每个模块都隐藏在您放置它的沙箱中:

const express = require ( '../Node-14/myExpress/node_modules/express' ); 

根据您的文件夹结构的深度,它可能很容易比我所展示的更糟糕。在某些情况下,您甚至可能需要从您所在的位置上升 2 或 3 层:

const express = require ( '../../../Node-14/myExpress/node_modules/express' ); 

但就我而言,在安装和卸载数百个 npm 模块之后,这是一个非常小的代价,因为你知道你不会被另一堆写得很糟糕的垃圾破坏,就像一个游乐场欺负。

我想我也应该承认删除模块可能比你习惯的要复杂一点。

如果您进入命令提示符并导航到 Node-14 文件夹(就像您在安装各种 npm 模块时所做的那样),然后如果您输入习惯npm uninstall <npm-package>,您可以看到 npm 疯狂地用大量路径填满您的屏幕和命令,看起来它实际上在做某事。

当然,这是 npm 的另一个谎言。事实上,没有采取任何行动。

要卸载包,您必须导航到您选择的沙盒文件夹,然后键入相同的命令。几个例子:

导航到“myExpress”文件夹,然后键入npm uninstall express

或导航到“Joi-13”文件夹,然后键入npm uninstall joi

您会很高兴地发现,当 npm 完成卸载过程时,该文件夹将是空的,除了偶尔的 JSON 文件。这与我过去看到的情况相比发生了巨大的变化。

现在,您可能认为我在这篇文章中一直在谈论 npm,您可能是对的。但事实是,我在这个答案中留下了很多没有讨论的余地。

例如,我的计算机出现了另一个神秘问题,我在此处发布了一个问题:

运行贡献的命令:'code-runner.stop' 失败

我严重怀疑是否有人会尝试回答这个问题,所以有一天我可能不得不自己回答这个问题。而且我预测,当我最终找出导致我在问题中描述的那个奇怪问题的原因时,它将与 npm 有关。这是我的预测,因为我对 npm 没什么好说的。


推荐阅读