1
头图

npm与npx:有何不同?

原文链接:npm vs. npx: What’s the difference?
作者:Fimber Elemuwa ✏️
译者:倔强青铜三

前言

大家好,我是倔强青铜三。是一名热情的软件工程师,我热衷于分享和传播IT技术,致力于通过我的知识和技能推动技术交流与创新,欢迎关注我,微信公众号:倔强青铜三。欢迎点赞、收藏、关注,一键三连!!!

什么是npm?

npm代表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 v5.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生态系统中的关键工具,但它们在不同层面上扮演着不同的角色:

特性npmnpx
目的和功能主要用于从npm注册表安装包和管理Node.js项目中的依赖。它有助于添加、移除和更新包,并维护包版本控制旨在直接执行Node包而无需全局安装。它允许用户在不弄乱全局或项目特定的node_modules的情况下运行包
包安装安装本地或全局包临时执行包而不永久安装
临时使用npm安装持续存在,直到明确移除。包保留在node_modules或全局安装路径中运行包临时并在执行后丢弃,除非另有说明
使用npm installnpx
脚本设置需要修改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进行临时任务或即时运行包。

最后感谢阅读!欢迎关注我,微信公众号:倔强青铜三。欢迎点赞收藏关注,一键三连!!!

倔强青铜三
28 声望0 粉丝