NPX的主要作用
调用项目安装的模块
npx主要解决的问题: 调用项目内部安装的模块; 如测试工具 Mocha
1 | $ npm install -D mocha |
npx 的原理很简单,就是运行的时候,会到node_modules/.bin路径和环境变量$PATH里面,检查命令是否存在。
由于 npx 会检查环境变量$PATH,所以系统命令也可以调用。
1 | # 等同于 ls |
注意,Bash 内置的命令不在$PATH
里面,所以不能用。比如,cd
是 Bash 命令,因此就不能用npx cd
避免全局安装模块
1 | # npx 将create-react-app下载到一个临时目录,使用以后再删除。所以,以后再次执行上面的命令,会重新下载create-react-app |
使用不同版本的node
1 | $ npx node@0.12.8 -v |
使用 0.12.8 版本的 Node 执行脚本。原理是从 npm 下载这个版本的 node,使用后再删掉。
某些场景下,这个方法用来切换 Node 版本,要比 nvm 那样的版本管理器方便一些。
-p 参数
-p
参数用于指定 npx 所要安装的模块,所以上面的命令可以写成下面这样。
1 | $ npx -p node@0.12.8 node -v |
上面命令先指定安装node@0.12.8
,然后再执行node -v
命令。
-c 参数
如果 npx 安装多个模块,默认情况下,所执行的命令之中,只有第一个可执行项会使用 npx 安装的模块,后面的可执行项还是会交给 Shell 解释。
1 | $ npx -p lolcatjs -p cowsay 'cowsay hello | lolcatjs' |
上面代码中,cowsay hello | lolcatjs
执行时会报错,原因是第一项cowsay
由 npx 解释,而第二项命令localcatjs
由 Shell 解释,但是lolcatjs
并没有全局安装,所以报错。-c
参数可以将所有命令都用 npx 解释。有了它,下面代码就可以正常执行了。
1 | $ npx -p lolcatjs -p cowsay -c 'cowsay hello | lolcatjs' |
-c参数的另一个作用,是将环境变量带入所要执行的命令。举例来说,npm 提供当前项目的一些环境变量,可以用下面的命令查看。
1 | $ npm run env | grep npm_ |
-c参数可以把这些 npm 的环境变量带入 npx 命令。
1 | $ npx -c 'echo "$npm_package_name"' |