npm 与 npx:有什么区别?
作者:Fimber Elemuwa✏️
在使用 JavaScript 或 Node.js 时,您很可能会遇到 npm(Node 包管理器)。它是管理软件包、安装依赖项以及确保项目始终包含所需库的首选工具。但是,npm 是另一个与 npm 捆绑在一起的工具,这常常引发一个问题:两者之间有什么区别?
乍一看,npm 和 npx 似乎都能帮助你与 Node.js 包交互,但它们的用途却截然不同。在本文中,我们将分析 npm 和 npx 之间的主要区别,展示它们的工作原理,并探讨何时分别使用它们。
无论您是要设置新项目、运行脚本,还是只是好奇何时使用 npm 和 npx,本指南都将帮助您了解这两种工具以及它们如何融入您的开发工作流程。
什么是 npm?
npm 是 Node 包管理器 (Node Package Manager) 的缩写,顾名思义,它是一个用于管理 Node.js 包的工具。每当你的项目需要一个新的“包”时,你都会使用 npm 来安装它。这些包的范围很广,从小型的实用函数到功能齐全的框架和库,应有尽有。
但 npm 不仅仅是用来安装库。它还非常适合管理项目依赖项和脚本。如果您需要锁定库的特定版本以防止重大更改,npm 可以满足您的需求。它还允许您在 package.json 文件中定义脚本,以自动执行测试或构建项目等常见任务。
npm 的工作原理
可以将 npm 视为软件组件的数字商店。当您启动一个新的 Node.js 项目时,您需要各种工具和库来构建它。您可以使用 npm 获取并安装这些预构建的软件包,而无需重新设计轮子。它的工作原理是维护一个庞大的在线软件包注册表,每个软件包都有其唯一的名称和版本。
使用 npm install 命令时,npm 会下载指定的软件包及其依赖项,并将它们放置在名为 node_modules 的本地目录中。该目录是跟踪所有项目依赖项和版本的中心位置。本地安装意味着该软件包仅在安装它的项目中可用。命令如下所示:
npm install <package-name>
例如,如果您想将 cowsay 库添加到您的项目中,您可以输入:
npm install cowsay
然后,您的项目就可以访问此目录,从而允许您在代码中使用该包的功能。全局安装使包可供整个系统使用,因此您可以将它用于任何项目。这对于您想要从任何地方运行的命令行工具非常有用。
除了简单的软件包安装之外,npm 还为每个软件包提供版本控制,让您可以指定所需的确切版本。这对于避免新版本中的重大更改导致的潜在问题至关重要。
此外,npm 还提供了在 package.json 中定义脚本的方法——这些命令可以自动执行诸如启动服务器、运行测试或构建项目之类的任务。在 package.json 中,你可以定义如下脚本:
{
"scripts": {
"start": "node index.js",
"test": "jest"
}
}
什么是 npx?
npx 是在 npm v 5.2.0 中引入的。npm 主要用来安装和管理软件包,而 npx 则主要用来运行软件包。
将 npx 视为一个快速命令运行器,它允许您执行 Node.js 包而无需安装它们。当您只想使用一次包或测试它而不将其永久添加到系统中时,npx 特别有用。
在 npx 之前,如果您想使用包中的命令行工具,则必须先全局安装它。npx 允许您直接从 npm 注册表运行该工具,而无需全局安装,从而简化了此过程。
npx 的工作原理
使用 npx 运行命令时,它会首先检查本地node_modules
目录。如果找到该包,则执行该包。如果没有找到,npx 会临时安装该包,运行后再将其移除。这意味着您可以使用各种工具,而不会使系统变得混乱。
假设你想用它create-react-app
启动一个新的 React 项目。通常情况下,你需要先全局安装它:
npm install -g create-react-app
然后,你可以运行:
create-react-app my-app
但是使用 npx,您可以跳过全局安装并直接运行它:
npx create-react-app my-app
此命令会下载create-react-app
、运行,并在完成后将其丢弃。它快速便捷,并且能避免你的系统被那些你可能只会用一次的全局包弄得乱七八糟。
如果您已经在项目本地安装了包,npx 可以帮助您运行它,而无需指定其完整路径node_modules
。例如,如果您已经在本地安装了 Jest 进行测试,则可以像这样使用 npx 运行它:
npx jest
npx 会自动在您的本地 node_modules 文件夹中找到该包并运行它,从而节省您的时间和麻烦。
我认为 npx 最酷的功能是它能够识别您要运行的包或命令。它遵循以下三个步骤来决定如何执行任何命令:
- 本地检查:npx 首先检查该包是否已安装在项目的 node_modules 文件夹中。如果找到,则从该文件夹中运行。
- 全局检查:如果本地找不到该包,npx 会检查它是否已全局安装在你的系统上。如果全局找到该包,则会运行它。
- 从 npm 注册表中获取:最后,如果 npx 在本地或全局都找不到该包,它会从 npm 注册表中获取该包,运行它,然后在执行后将其删除
注意,默认情况下,npx 将运行包的最新版本,但如果您需要特定版本,您也可以告诉它运行哪个版本。
npm 和 npx 之间的主要区别
npm 和 npx 都是 Node.js 生态系统中的重要工具,但它们在不同层面上发挥着不同的作用:
特征 | npm | NPX |
目的和功能 | 主要用于从 npm 仓库安装软件包,并管理 Node.js 项目中的依赖项。它有助于添加、删除和更新软件包,并维护软件包版本控制。 | 旨在直接执行 Node 包,无需全局安装。它允许用户运行包,而不会扰乱全局或项目特定的 `node_modules`。 |
包安装 | 在本地或全局安装包 | 临时执行包,但不永久安装它们 |
临时使用 | 使用 npm 安装后会一直保留,直到明确移除。软件包会保留在 `node_modules` 或全局安装路径中 | 临时运行包并在执行后丢弃它们,除非另有说明 |
用法 | `npm install` | `npx` |
脚本设置 | 需要修改 `package.json` 来创建自定义脚本 | 运行命令时无需修改 `package.json` |
CLI 工具的执行 | 使用 CLI 工具前必须全局或本地安装 | 可以直接从 npm 注册表运行 CLI 工具,无需事先安装 |
项目设置 | 通常用于涉及多个依赖项和版本的项目设置。 | 非常适合快速项目脚手架或一次性命令执行,例如“create-react-app” |
Node.js 兼容性 | 与 Node.js 捆绑在一起,用于常规项目和包管理 | 从 v 8.2.0 开始包含在 Node.js 中,简化了包的执行 |
结论:何时应该使用 npm 而不是 npx?
决定何时使用 npm 或 npx 取决于任务和项目的需求。
当您需要安装和管理对开发或生产至关重要的项目依赖项时,应该使用 npm。由于 npm 确保软件包已在 中列出package.json
,因此您可以完全控制项目内的版本控制和一致性。它也是运行 中定义的脚本的首选工具package.json
,非常适合构建、测试或运行服务器等任务。
另一方面,npx 最适合快速执行一次性命令或测试工具,无需进行全局安装。如果您只想使用某个工具一次(例如create-react-app
用于引导 React 项目),npx 可以让您直接运行它,而不会使系统变得混乱。它还方便地运行本地安装的软件包,而无需输入完整路径,从而简化您的工作流程。简而言之,使用 npm 进行长期依赖项管理,使用 npx 进行临时任务或动态运行软件包。
仅 200 个✔️ 监控生产环境中失败和缓慢的网络请求
部署基于 Node 的 Web 应用或网站很容易,但确保 Node 实例持续为应用提供资源才是关键。如果您需要确保对后端或第三方服务的请求成功,不妨尝试一下 LogRocket。
LogRocket就像 Web 应用的 DVR,可以记录您网站上发生的所有事件。您无需猜测问题发生的原因,而是可以汇总并报告有问题的网络请求,从而快速了解根本原因。
LogRocket 会为您的应用提供工具,记录基准性能时间,例如页面加载时间、首字节时间、慢速网络请求,以及 Redux、NgRx 和 Vuex 的操作/状态。立即免费开始监控。
文章来源:https://dev.to/logrocket/npm-vs-npx-whats-the-difference-8ag