title: 记录一下 npx 的使用场景 layout: post thread: 266 date: 2021-07-24 author: Joe Jiang categories: Document tags: [2021, npx, npm]
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
由于 npx 可以下载模块,于是我们也可以指定 Node 版本,比如这样:
npx node@0.12.8 -v
上面命令会使用 0.12.8 版本的 Node 执行脚本。原理是从 npm 下载这个版本的 node,使用后再删掉。
使用 -p
参数,我们可以指定要安装的模块,后面继续跟着要执行的命令,如上命令便可以重新写为下面这样:
npx -p node@0.12.8 node -v
这就比较简单了,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 的常见使用场景。