node.js - 为什么一个 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 垃圾是免费的,这是一件好事。他们不能把我们的钱还给我们。
解决方案
我可能会因为回答我自己的问题而被钉死在十字架上,但它对我有用。
底线是:每个人都应该能够合理地预期,当他们安装一个软件包时,它不会蚕食他们已经安装的其他软件,也不会破坏他们的操作系统。但这就是这个 npm 垃圾发生在我身上的事情。
如果你想知道你是否有同样的问题,只需运行这个测试:
安装 npm 和 Node.js 然后,再安装大约 5 个您选择的 npm 模块。
安装完成后,您应该立即卸载所有 5 个 npm 包,以及 Node 和 npm。
安装和卸载完成后,您应该留下一个空文件夹。如果文件夹还剩下任何东西,那么您的 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,您可能是对的。但事实是,我在这个答案中留下了很多没有讨论的余地。
例如,我的计算机出现了另一个神秘问题,我在此处发布了一个问题:
我严重怀疑是否有人会尝试回答这个问题,所以有一天我可能不得不自己回答这个问题。而且我预测,当我最终找出导致我在问题中描述的那个奇怪问题的原因时,它将与 npm 有关。这是我的预测,因为我对 npm 没什么好说的。
推荐阅读
- python - UnicodeDecodeError:“ascii”编解码器无法解码位置 5 中的字节 0xc3:序数不在范围内(128)
- python - 如何跟踪进程的资源使用情况?
- angular - Angular Guard 和 JWT
- c - C--程序没有正确读取文件结尾
- elasticsearch - 在 ELK 中,如何搜索与另一个不匹配的日志?
- android - 在 XML Android 字符串中需要 2 个新行吗?
- node.js - 通过 Express 向 Google Places API 发出远程请求每次都会获取重复的结果
- python - 将类实例设置为自身的嵌套属性——这在 Python 中真的合法吗
- javascript - JavaScript 的内置 Number() 方法似乎返回了不正确的值
- javascript - 数据未在 Node JS 中呈现到 EJS 页面中