无论您是 JavaScript 世界的新手还是精通者,您可能已经或将要在命令行中使用那些烦人的三个小字母 — npm —,绝望地尝试下载包,这些包是来自中央包注册表的可重用 JavaScript 模块。但是您知道使用此命令可以执行一些惊人的操作来帮助您加速应用程序的开发吗?
在本文中,我将为您提供最重要的 NPM 命令、快捷方式和技巧,以帮助您提高 JavaScript 开发人员的生产力和效率。
在这篇文章中,我们将讨论以下主题:
- NPM 的定义。
- 使用 npm 包管理系统来管理应用程序依赖项,发布和取消发布包。
- 按版本号安装包。
- package.json 和 package-lock.json 文件之间的区别。
- 使用 NPM 命令审计包安全性。
- 以及更多
在开始之前,让我们回顾一下什么是 NPM 以及如何使用它。
什么是 NPM?
从概念上讲,NPM 代表节点包管理器,类似于 PiP (Python)、RubyGems (Ruby on Rails)、apt-get (Debian)、rpm/yum (Red Hat/Fedora)、CPAN (Perl) 等工具, 或 PEAR (PHP)。NPM 于 2010 年发布,是 Node.js 的包管理和分发系统,Node.js 是用于构建服务器端应用程序的环境。它的目的是使用简单的命令行界面在 Internet 上发布和分发 Node.js 包。近年来,它还广泛用于分发非 Node.js 模块的前端库,如 React 或 TailwindCss。使用 npm,您可以在npm 网站上快速找到用于特定目的的包,下载它们,安装它们,或管理您已经安装的包。
如何使用 NPM
使用 npm 很简单,它只是从命令提示符运行的另一个命令,就像 Node 一样。例如,假设您创建了一个名为tester的目录并使用以下命令初始化您的项目npm init –yes
:在此文件夹中自动生成一个名为package.json的文件。 该文件包含有关您的项目的所有信息。之后,您执行以下命令:
npm install ioredis 复制代码
在这里,npm是命令行界面 (CLI) 程序,它本身就是 NPM,而 install 是您可以向它发出的一个命令。然后,ioredis是该命令的一个参数,这是您与 NPM 的大多数交互将采用的一般形式。
通过执行最后一条命令,将在 tester 文件夹中创建一个名为node_modules的新目录。 这个目录将包含很多...... 嗯,很多事情你通常不需要担心太多!简而言之,它是构成ioredis模块的所有代码。
package.json 和 package-lock.json 的区别
通过使用最后一个命令: ,还会自动生成npm install ioredis
两个名为package-lock.json和package.json的文件。 是的,您认为package.json文件类似于package-lock.json文件。但它们之间存在细微差别。package.json包含项目的所有信息,特别是项目中使用的依赖项或模块及其本地版本。package-lock.json只是 package.json 文件的副本,版本化的依赖树。它还包括您使用的依赖项和 devDependencies。
NPM 全局和本地包
软件包以本地或全局模式安装。到目前为止,我们已经在本地模式下安装了包。
让我们知道如何在这两种模式下安装包。
- 本地包安装在您运行npm install的目录中,它们放在该目录下的node_modules文件夹中。
- 全局包都放在系统中的一个位置(确切位置取决于您的设置),无论您在哪里运行npm install -g。通常,全局安装的包会提供您从 shell (CLI) 运行的可执行命令,并且它会在项目中重复使用。全局模式包可从命令行界面 (CLI) 获得,而本地模式下的包安装在父工作文件的 node_modules 文件夹中。您可能知道的流行全局包的好例子是nodemon、grunt-cli、forever、cross-env ……
按版本号安装包
npm 中的版本号匹配功能强大且灵活。有了它,您可以针对给定包的特定版本或任何版本号范围。默认情况下,npm 会安装指定包的最新版本,就像我们在上一节中所做的那样。无论您采用默认值还是指定版本号,npm 都会确定要安装的内容。包版本在package.json文件中声明,我们看一下相关字段:
{ … “version”: “4.28.2”, “dist-tags”: { “latest”: “4.28.2” }, … } 复制代码
version 字段显然声明了当前的包版本。dist-tags 字段列出了包维护者可以用来帮助用户选择正确版本的符号标签。该字段由npm dist-tag命令维护。npm install 命令支持这些变体:
$ npm install <package-name>@tag $ npm install <package-name>@version $ npm install <package-name>@version-range 复制代码
最后两个是他们听起来的样子。您可以指定*ioredis@4.28.0以精确版本为目标,或ioredis@”>3.1.0 < 4.0"* 以一系列 ioredis V3 版本为目标。
版本匹配说明符包括以下选项:
- 精确版本匹配:4.28.0
- 至少版本 N : >4.28.0
- 直到版本 N:<4.28.0
- 两个版本之间:>=4.24.3 <4.28.3
@tag属性是一个符号名称,例如 @latest、 @stable或 @canary。包所有者将这些符号名称分配给特定的版本号,并可以根据需要重新分配它们。例外是@latest,每当发布新版本的包时都会更新。****
卸载包
如果要卸载已安装的软件包,请使用以下命令:
$ npm uninstall <package-name> 复制代码
更新包
一旦你建立了一个项目,你有时可能想要更新它所依赖的包。这很容易做到:
$ npm update 复制代码
是的,就是这样!NPM 将关闭并将所有包更新到最新版本。如果要将包更新到特定版本,请使用此命令:
$ npm update <package-name>@version 复制代码
审计包安全
可悲的现实是,有时您使用的软件包会被发现具有安全漏洞,就像您使用的任何软件一样。但是,意识到这一点,NPM 团队构建了一个有用的命令来处理这个问题:
$ npm audit 复制代码
运行此命令将扫描您的 package.json 文件并将依赖项列表提交给默认的 NPM 注册表,以请求报告其中的任何已知漏洞。该报告还将包括有关如何补救的信息。但是如果你想要快速的答案,运行这个命令:
$ npm audit fix 复制代码
这将导致 NPM 使用尚未报告漏洞的最新可用版本更新任何易受攻击的软件包。
如果您想查看详细的审计报告,请执行:
$ npm audit –json 复制代码
或者,如果您更喜欢纯文本:
$ npm audit –readable 复制代码
最后,如果你想看看 npm audit fix 会做什么而不用实际操作,你可以使用:
$ npm audit fix –dry-run 复制代码
重复数据删除和修剪
您经常会看到的关于 NPM 和 Node 的抱怨之一是node_modules目录的大小可能会迅速膨胀。幸运的是,您很少需要深入研究它,但这仍然是磁盘空间的问题,虽然现在磁盘空间很便宜,但浪费它仍然不时髦!
NPM 提供了两个命令来处理这种情况,首先是:
$ npm dedupe 复制代码
或者
$ npm ddp 复制代码
此命令搜索node_modules中的包树,并寻找可以将包向上移动并在依赖项之间共享的机会,从而减少冗余并节省空间。包树是在您安装包时构建的,随着 NPM 安装包,它依赖于等等。
有时,包会有共同的依赖关系,但作为一棵树,分支大多是独立的。此命令尝试重新组织这些分支以提高它们的效率。
第二个命令是这样的:
$ npm prune 复制代码
此命令将检查已安装的软件包并查找可能不再需要的任何软件包。这通常发生在您卸载软件包时,尤其是当您在某个时候进行了重复数据删除时。
发布和取消发布包
发布到注册表非常简单!首先,你需要,嗯,写你的包裹!总得有东西,发布,对不对?您不需要做任何特别的事情,但 npm 初始化您的项目并将您的代码拼凑在一起。
之后,转到注册表网站并创建一个新帐户。您将需要从命令行登录到该帐户。
$ npm login 复制代码
这将提示您输入用户名、密码和电子邮件地址。登录后,发布非常简单:
$ npm publish 复制代码
通过使用此命令,您的包将以其默认名称发布。好吧,等等,有一件事可能会出错:您的包裹名称可能已经被占用了。首先对名称进行 npm 搜索总是一个好主意,但假设该名称未被使用(或者您在发现冲突后更改了它),那么它将立即发布并在注册表中可用。
提示
如果您想要的名称不可用,NPM 还允许您发布到一个范围。这意味着,例如,您可以将名称更改为 @/ (或执行npm init — scope=)。然后,您还需要将 –access public 添加到发布命令。这样,只要您的包名称在范围内是唯一的,那么您就可以开始了;该名称可以毫无问题地用于其他范围(并且没有范围实际上是默认范围!)。所以,如果像域名一样,您想要的那个被占用了,那么在 NPM 土地上有一种解决方法。如果您出于某种原因决定需要从注册表中删除您的包,这很简单:
npm unpublish [<@scope>/]<package-name>[@<version>] 复制代码
现在,我们已经探索了对您有用的最相关的 NPM 命令。但也有一些我们没有接触的有用的 npm 命令。您可以使用命令_npm help_ 获取帮助或移至 npm 文档网站以发现更多命令。
现在我们已经深入了解了 NPM,让我们列举一些有助于您高效使用 NPM 的提示、技巧和快捷方式。
提示和快捷方式
- 删除包通常被认为是错误的形式,因为其他开发人员可能依赖于它。更好的做法是使用另一个命令:
npm deprecate <pkg>[@<version range>] <message> 复制代码
这会将您的包标记为已弃用,可选择应用一条消息,您可以指定发生的情况。
- 添加private: true到package.json以防止意外发布任何私有存储库。
- 要快速生成 package.json 文件,使用命令:npm init --y
- 不要删除package.json,但您可以在提交之前删除package-lock.json 。
- 从 Git 存储库克隆项目后,您需要运行npm install 。
- 不建议将node_modules推送到您的源代码控制仓库,例如 Git。如果您使用 Git 作为版本控制,请在推送项目之前将 node_modules 添加到 .gitingore文件。
结论
现在您已经了解了基本的 NPM 命令和快捷方式,是时候将它们付诸实践了!继续在您的下一个项目中试用它们。而且,如果您遇到任何其他有用的 NPM 命令,请不要犹豫,在下面的评论中分享它们。您的贡献可以帮助使 JavaScript 开发世界更加高效和简化。那么,让我们开始并充分利用 NPM!