在 JavaScript 中,无论是新手还是专家都可能在命令行中使用过 NPM。在本篇文章中,我将会整理超实用的 NPM 命令、快捷方式及技巧,帮助 JavaScript 开发人员提高生产力和效率。
在这篇文章中,我们将涵盖以下主题:
- npm 的定义。
- 使用 npm 包管理系统管理应用程序依赖项,来发布或取消发布包。
- 按版本号安装包。
package.json
和package-lock.json
文件之间的区别。- 使用 npm 命令审核包安全性。
在开始之前,让我们回顾一下什么是 NPM 以及如何使用它。
什么是 NPM?
从概念上讲,NPM(Node Package Manager)类似于PiP(Python),RubyGems(Ruby on Rails),apt-get(Debian),rpm / yum(Red Hat/Fedora),CPAN(Perl)或PEAR(PHP)等工具。NPM 于 2010 年发布,是 Node.js 的包管理和分发系统,Node 是一个用于构建服务器端应用程序的环境。其目的是使用简单的命令行界面在互联网上发布和分发 Node.js 包。近年来,它也被广泛用于分发前端库,如 React 或 TailwindCss。使用 npm,用户可以在 npm 的网站上快速找到用于特定目的的软件包、下载、安装或管理用户已安装的软件包。
如何使用 NPM
使用 NPM 很简单,可以理解为像 Node 一样从命令提示符运行的另一个命令。举个例子,现在创建一个名为 tester 的目录,并使用以下命令初始化项目:npm init-yes
。此文件夹中自动生成一个名为 package.json
的文件,此文件包含有关项目的所有信息。之后,执行以下命令:
npm install ioredis
在这里,NPM 是命令行界面 (CLI) 程序,可以向其发出安装命令。 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
文件的副本、版本化的依赖树,它还包括用户使用的依赖项和开发依赖项。
NPM 全局与本地包
包可以在本地或全局模式下安装。在本文我们是以本地模式安装软件包。
- 本地软件包安装在运行
npm install
的目录中,并放在此目录下的node_modules
文件夹中。 - 全局软件包都放在系统中的一个位置(确切的位置取决于用户的设置),无论用户在哪里运行
npm install -g
。通常,全局安装的包提供从 shell (CLI) 运行的可执行命令,并且跨项目重复使用该命令。全局模式包可从命令行界面 (CLI) 获得,而本地模式下的包安装在npm install
目录下的node_modules
文件夹中。全局软件包的例子有 nodemon,grunt-cli,forever,cross-env 等等。
按版本号安装软件包
npm 中的版本号匹配功能强大且灵活。有了它,用户可以定位给定包的特定版本或任何版本号范围。默认情况下,NPM 会安装命名包的最新版本,就像我们在上一节中所做的那样。无论是采用默认值还是指定版本号,NPM 都将确定要安装的内容。包版本在 package.json
文件中声明,因此让我们看一下相关字段:
{ …
“version”: “4.28.2”,
“dist-tags”: {
“latest”: “4.28.2”
},
… }
版本字段显然声明了当前包版本。dist-tags
包字段列出了软件包维护者可以用来帮助用户选择正确版本的符号标记。此字段由 npm dist
标记命令维护。npm install
命令支持以下变体:
$ npm install @tag
$ npm install @version
$ npm install @version-range
用户可以指定 [email protected] 以定位精确版本,或指定 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
重复数据删除和修改
用户们常常抱怨的是 node_modules
目录的大小会突然增加。虽然现在磁盘空间很便宜,但是能够节省空间有什么不好呢?NPM 提供了两个命令来处理这种情况,第一个是:
$ npm dedupe
或:
$ npm ddp
此命令在 node_modules
中搜索 tree of packages,并查找可以在 tree 中向上移动并在依赖项之间共享的包,来减少冗余并节省空间。当安装 NPM 软件包时,packge tree 会随之被构建。尽管包之间会有共同的依赖项,但 package tree 有很多独立的分支,而通过该命令可以重新组织这些分支。
第二个命令:
$ npm prune
此命令将检查已安装的软件包并查找可能不再需要的任何软件包。这通常发生在卸载软件包时,特别是用户在某个时候重复进行数据删除。
发布和取消发布包
将包发布到镜像仓库很简单!当用户写好包之后,npm 会出初始化项目并将代码集中在一起,然后转到镜像仓库网站并创建一个新帐户。用户需要从命令行登录到该帐户。
$ npm login
输入用户名、密码和电子邮件地址。登录后,进行发布:
$ npm publish
使用此命令,将使用默认名称发布包。不过可能会出现包名称被占用的情况。因此建议在发布之前先对包名称进行搜索,如果名称没有被占用的话,包就会立即被发布并在镜像仓库中可用。
提示
如果所需的名称不可用,NPM 还允许用户发布到 scope。例如,用户可以将名称更改为 @/
(或执行 npm init-scope=
)。然后,还需要将 -access public
添加到发布命令中。这样,只要包名称在 scope 内是唯一的就可用了,该名称同样还可以在其他 scope 中使用。如果用户需要从镜像仓库中删除这个软件包,只需:
npm unpublish [<@scope>/]<package-name>[@<version>]
到现在为止,我们已经探索了一些非常高频实用的 NPM 命令。当然,NPM 还有许多其他实用命令我们还没有涉及到,你可以使用 command_npm help_
获取帮助,或去 NPM 官方文档网站来探索更多命令。
接下来我将列举一些技巧和快捷方式,帮助你更有效地使用 NPM。
快捷方式和小tips
在删除包时我们总会有所顾虑,因为其他开发人员可能也依赖于这个包。在这个情况下可以使用以下命令:
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
添加到.gitignore
文件。