原文:npm vs npx — What’s the Difference,作者:Carol-Theodor Pelu

如果你曾经使用过 Node.js,那么你肯定使用过 npm。

npm(node package manager)是你安装 Node.js 时开箱即用的依赖/包管理器。它为开发者提供了一种在全局和本地安装包的方法。

有时你可能想看一下特定的包,并尝试一些命令,但如果不在本地的 node_modules 文件夹中安装依赖项,你就无法做到这一点。

这就需要使用 npx

在这篇文章中,我们将看看 npmnpx 的区别,并学习如何从两者中获得最佳效果。

首先,让我们了解一下 npm 到底是什么,以及我们能用它做什么。

这个视频作为补充资料。

软件包管理器 npm

npm 有几个功能。首先,它是一个用于发布开源 Node.js 项目的在线资源库。

其次,它是一个 CLI 工具,可以帮助你安装这些包并管理它们的版本和依赖关系。npm 上有几十万个 Node.js 库和应用程序,而且人们每天都会添加更多。

npm 本身并不运行任何软件包。如果你想使用 npm 运行一个包,你必须在 package.json 文件中指定这个包。

当可执行文件通过 npm 包安装时,npm 会创建链接指向它们。

  • 本地安装的链接是在 ./node_modules/.bin/ 目录下创建的
  • 全局安装会在全局 bin/ 目录下创建链接(例如:Linux 上的 /usr/local/bin 或 Windows 上的 %AppData%/npm

要用 npm 执行一个包,你必须输入本地路径,像这样。

$ ./node_modules/.bin/your-package

或者你可以通过在脚本部分的 package.json 文件中添加一个本地安装的软件包来运行它,像这样:

{
  "name": "your-application",
  "version": "1.0.0",
  "scripts": {
    "your-package": "your-package"
  }
}

然后你可以用 npm run 来运行这个脚本:

npm run your-package

你可以看到,用普通的 npm 运行一个包需要相当多的步骤。

幸运的是,这正是 npx 派上用场的地方。

npx 软件包运行器

自从 npm 5.2.0 版本以来,npx 就被预先捆绑在 npm 中,所以它现在几乎是一个标准。

npx 也是一个 CLI 工具,其目的是使安装和管理托管在 npm 注册表中的依赖关系变得容易。

现在,运行任何一种基于 Node.js 的可执行文件都非常容易,你通常会通过 npm 安装。

你可以运行以下命令,看看你当前的 npm 版本是否已经安装:

$ which npx

如果没有,你可以运行以下命令:

$ npm install -g npx

一旦你确定你已经安装了它,让我们看看使 npx 非常有用的一些使用场景。

轻松运行一个本地安装的软件包

如果你想执行一个本地安装的软件包,你只需要输入:

$ npx your-package

npx 将检查 <command><package> 是否存在于 $PATH 或本地项目的二进制文件中,如果存在,npx 将执行它。

执行以前没有安装的软件包

另一个主要优势是能够执行以前没有安装的软件包。

让我们通过运行来测试一下:

$ npx cowsay wow	
npx-cowsay-wow-npm-vs-npx

这很了不起,因为有时你只是想使用一些 CLI 工具,但你不想为了测试它们而在全局安装它们。

这意味着你可以节省一些磁盘空间,只在需要时才运行它们。这也意味着你的全局变量将受到更少的污染。

直接从 GitHub 上运行代码

execute-gist-script-with-npx

这个很厉害。

你可以用 npx 来运行任何 GitHub gist 和仓库。让我们专注于执行 GitHub 的 gist,因为创建一个 gist 更容易。

最基本的脚本由主 JS 文件和 package.json 组成。在你设置好这些文件后,你所要做的就是运行带有该 gist 链接的 npx,如上图所示。

你可以在这里找到我在这个例子中使用的代码。

确保你在执行任何脚本之前仔细阅读,以避免因恶意代码而发生的严重问题。

测试不同版本的包

npx 使测试一个 Node.js 包或模块的不同版本变得非常容易。为了测试这个很棒的功能,我们将在本地安装 create-react-app 包,并测试一个即将到来的版本。

这将在输出的最后列出一些 dist 标签。dist 标签提供了版本号的别名,这使得打字变得非常容易。

$ npm v create-react-app
create-react-app-dist-tags

让我们用 npx 来试试 reate-react-appnext dist标签,它将在一个沙盒目录内创建应用程序。

$ npx create-react-app@next sandbox

npx 会暂时安装下一个版本的 create-react-app,然后它就会执行,安装应用程序的依赖。

一旦安装完毕,我们就可以像这样导航到该应用程序:

$ cd sandbox

然后用这个命令启动它:

$ npm start
create-react-app-npx-next-version

它将在你的默认浏览器窗口中自动打开 React 应用程序。现在我们有了一个在下一个版本的 create-react-app 包上运行的应用程序:

index-page-react-app
你的 React 应用程序的索引页应该是这样的

总结

npx 可以帮助我们避免版本问题、依赖问题和安装我们只是想尝试一下的不必要的软件包。

它还为执行软件包、命令、模块,甚至是 GitHub 的清单和仓库提供了一个清晰而简单的方法。

如果你以前没有使用过 npx,现在正是开始使用它的好时机。

这篇文章最初是在我的博客上发布的。

你可以在 TwitterFacebook 上联系我,并向我提出任何问题。