仓库源文站点原文


title: 记录一下 npx 的使用场景 layout: post thread: 266 date: 2021-07-24 author: Joe Jiang categories: Document tags: [2021, npx, npm]

excerpt: 什么是 npx,npx 都有哪些使用场景,本文记录一下相关的内容。

npm 从5.2.0版本开始,开始增加了 npx 命令。简单来说,npx 是一个旨在帮助开发者更方便的使用 npm 模块的工具,它简化了很多流程,比如允许我们在不预先安装模块到开发者电脑上时便可执行一些 npm 模块与可执行文件等。

以下列举 npx 的常见使用场景。

在不使用 npm run-script 情况下使用本地安装过的模块

在过去一段时间,npm 生态越来越倾向将工具库设置为 devDependencies 安装在本地,而不要求用户在全局进行安装注册。但如果想要调用这些模块,我们必须要在项目脚本或 package.json 的 scripts 字段中对其调用进行定义。否则,我们必须要要定位到 node_modules 中用繁琐的命令才能实现在命令行中对其进行调用。

假设我们安装了一个模块 mocha,正常来说我们要像 node-modules/.bin/mocha --version 一样调用,而通过 npx 则可以简化成:

npx mocha --version

npx 不仅会到 node_nmodules/.bin 中检查命令是否存在,同时还会检查环境变量 $PATH,这意味着我们可以通过 npx 调用系统命令,比如:

npx ls

避免全局安装,执行一次性命令

假设这样一种场景,我们想执行一些 CLI 工具,但是为了运行一次而不得不在全局安装他,这有点烦人了。这个时候,npx 就很合适登场了。

通过 npx 执行时,如果命令不在你的 $PATH 中,npx 会自动从 npm 注册源中拉取具有该名字的模块并安装调用他。在调用完成后,安装的模块并不会被放入你的环境变量,因此你不用担心如此调用对你的环境造成污染。

这种方式下最常见的用法莫过于新建一个 react 项目了:

npx create-react-app my-react-app

上面代码运行时,npx 将 create-react-app 下载到一个临时目录,使用以后再删除。所以,以后再次执行上面的命令,会重新下载 create-react-app。通过 @ 我们还可以指定模块版本:

npx create-react-app@1.0.0 my-react-app

指定 Node 执行版本

由于 npx 可以下载模块,于是我们也可以指定 Node 版本,比如这样:

npx node@0.12.8 -v

上面命令会使用 0.12.8 版本的 Node 执行脚本。原理是从 npm 下载这个版本的 node,使用后再删掉。

使用 -p 参数,我们可以指定要安装的模块,后面继续跟着要执行的命令,如上命令便可以重新写为下面这样:

npx -p node@0.12.8 node -v

执行 gist 片段代码

这就比较简单了,npx 支持通过 url 执行 GitHub 上的源码模块。只要按照模块的定义写好,然后提供 gist 地址,npx 便可以按照约定执行脚本。

一个标准模块定义至少应该包含一个 package.json 文件,并指定 bin 脚本入口,例如下面这样:

{
    "name": "npx-is-cool",
    "version": "0.0.0",
    "bin": "./index.js"
}

然后便可以这样执行:

npx https://gist.github.com/hijiangtao/xxx

当我们需要执行一些流程化处理的事情时,最直接的办法当然是写 shell 脚本,但如果其中有一些可以快速用 JavaScript 实现的执行逻辑时,便可以简单将其封装为一个 npm 模块,然后通过 npx 的形式插入到脚本中。

最近给组内封装了一个 Code Review 通知提醒的模块,便是通过这种方式执行的。而要引入这个通知流程,我只需要在原有的 gitpush.sh 的最后加上 | npx @xxx 即可,感觉方便了不少。

以上便是 npx 的常见使用场景。