npx是什么

npx是什么

你是否遇到过这种情况:当你想尝试一些命令行工具,但却苦恼于不得不全局安装它们来运行仅仅一次?特别是generators类工具如webpack、 @vue/cli 这样的工具很久才用到一次。但当你需要重新运行他们的时候,它们往往已经过期了,所以你不得不在每次想要使用它们时重新安装。

在过去的几年中,npm生态越来越倾向于将devDependencies安装包作为项目本地依赖安装,而不是让用户在全局安装。这意味着像 webpack、 @vue/cli 这种我们过去主要是全局安装的命令行工具,现在可以基于项目维度来管理他们的版本。这也意味着如果你要运行一个基于npm的项目,你只需要确保你的系统安装了node+npm,然后将项目从git上clone下来,执行npm install安装依赖包,通过npm run-script就可以运行起来。

但这种方式的缺点是,你不能以一种方便快捷的方式执行本地的二进制文件。有好几种办法来干这活,但每种方案都有缺点:

  1. 你可以将这些工具的路径添加到scripts中,但这样就需要你记住传递的参数。
  2. 你也可以使用像alias npmx=PATH=$(npm bin):$PATH这样的shell脚本。
  3. 或者你还可以使用手动输入路径./node_modules/.bin/<cli>来执行。这些方法都管用,但不够理想。


npx能很好地解决这些麻烦。

那些将npm升级到npm@5.2.0或以上的用户,会发现与通常的npm平级的文件夹中还多了另一个二进制文件:npx

npx是一个旨在提升npm包的使用体验——就像npm极大地提升了我们安装和管理包依赖的体验,npx让npm包中的命令行工具和其他可执行文件在使用上变得更加简单。它极大地简化了我们之前使用纯粹的npm时所需要的大量步骤。


当你执行npx <command><command>并不在你的系统变量路径$PATH中,npx会自动为你从npm上下载安装叫这个名字的包,并且执行它。当做完这些事情后,已安装的包不会出现在你的全局安装中,所以不用担心长期使用所带来的全局污染。  

举例:使用create-nuxt-app创建一个nuxt项目。

老方法:

npm install -g create-nuxt-app

create-nuxt-app <project-name>

npx方式:

npx create-nuxt-app <project-name>

这条命令会临时安装 create-nuxt-app 包,命令完成后create-nuxt-app 会删掉,不会出现在 global 中。下次再执行,还是会重新临时安装。

npx 会帮你执行依赖包里的二进制文件。

举例来说,之前我们可能会写这样的命令:

npm i -D webpack
./node_modules/.bin/webpack -v

如果你对 bash 比较熟,可能会写成这样:

npm i -D webpack
`npm bin`/webpack -v

有了 npx,你只需要这样:

npm i -D webpack
npx webpack -v

也就是说 npx 会自动查找当前依赖包中的可执行文件,如果找不到,就会去 PATH 里找。如果依然找不到,就会帮你安装!

npx 甚至支持运行远程仓库的可执行文件:

npx github:piuccio/cowsay hello

再比如 npx http-server 可以一句话帮你开启一个静态服务器!(第一次运行会稍微慢一些)

npx http-server

指定node版本来运行npm scripts

npx -p node@8 npm run build

主要特点:

1、执行一次性命令,临时安装可执行依赖包,不用全局安装,不用担心长期的污染。
2、可以执行依赖包中的命令,安装完成自动运行。
3、自动加载node_modules中依赖包,不用指定$PATH。
4、可以指定node版本、命令的版本,解决了不同项目使用不同版本的命令的问题。

最后编辑于 2018-09-29 10:03