npx 是 npm v5.2.0 引入的一条命令( npx ),是一个 npm 包执行器
。我们可以使用 npx 来执行各种命令。
主要有以下特点:
-
临时安装可执行依赖包,不用全局安装,不用担心长期的污染。
-
自动加载 node_modules 中依赖包,不用指定 $PATH 。
npx 执行流程如下:
-
到 node_modules/.bin 路径检查对应的命令是否存在,找到之后执行;
-
没有找到,就去环境变量 $PATH 里面,检查对应命令是否存在,找到之后执行;
-
还是没有找到,自动下载一个临时的依赖包最新版本在一个临时目录,然后再运行命令,运行完之后删除,不污染全局环境。
npx 使用场景
- 执行局部环境命令
比如项目下安装了 mocha ,可以直接用 npx 执行
npx mocha --version
- 一次性执行命令
比如以下命令,npx 将 create-react-app 下载到一个临时目录,使用以后再删除
不用全局安装 create-react-app ,运行后不会污染全局环境
npx create-react-app myApp
- 切换 node 版本
要运行的命令不兼容当前的 node 版本时,可使用 npx 切换版
npx 的 -p 选项指定要安装的包,并将其添加到正在运行的 $PATH 中
npx node@12 -v
我们知道,如果一个包配置了 bin后,当它被安装的时候,在项目的 node_modules/.bin下就会有相应的指令,方便执行。
如常见的执行单元测试,我们可以看到 mocha 有配置了一个 bin 。
如果我们 npm install mocha --save-dev 后,可以:
# 手动党执行
$ node node_modules/.bin/mocha **/*.test.js
# 改装党,配置 zsh 别名:alias n='PATH=$(npm bin):$PATH'
$ n mocha **/*/test.js
# 一劳永逸党,把 mocha 指令写入到 npm scripts 后,会自动寻址 node_modules/.bin
# { scripts: { "test": "mocha **/*.test.js" }}
$ npm test
# 顺手牵羊党,适用于临时需要执行某个 bin
$ npx mocha **/*.test.js
总结:
- 如果当前目录有node_modules,npx 会去寻找node_modules/.bin里的可执行命令,执行局部的可执行文件,而不是全局的。例如webpack既可以全局安装,也可以局部安装。
- 如果没有安装某个包,则在临时文件夹安装这个包,并执行输入的命令,用完后自动删除,不会污染全局。