一、概述
npm从5.2.0版开始,增加了 npx 命令。npx想要解决的主要问题,就是调用项目内部安装的模块。在过去一段时间,npm 生态倾向将工具库安装在本地devDependencies
上,而不建议全局安装安装。但如果想要调用这些模块,我们必须要在项目脚本或 package.json 的 scripts 字段中对其调用进行定义。否则,我们必须要定位到 node_modules 中用繁琐的命令才能实现在命令行中对其进行调用。npx
的出现即在不使用 npm run script
情况下使用本地安装过的模块。比如,项目内部安装了打包工具webpack(npm install webpack -D)
,如果我们使用webpack
,只能在项目脚本的 package.json 中的scripts字段里面使用, 如果想在命令行下调用,必须用node-modules/.bin/webpack -v
,但使用npx
可以让项目内部安装的模块用起来更方便,直接可以使用npx webpack -v
,另外,使用npx可以避免全局安装模块。
二、安装
NodeJS安装后自带npm模块,可以直接使用npx命令。如果不能使用用,就要手动安装一下。
npm install -g npx
三、使用
使用npx可以避免全局安装模块
3.1 调用系统命令
npx 的原理很简单,就是运行的时候,会到node_modules/.bin路径和环境变量$PATH里面,检查命令是否存在,所以它也可以调用系统命。
npx ls // 等同于ls命令
3.2 避免全局安装,执行一次性命令
- 我们想执行一些 CLI 工具,但是为了运行一次而不得不在全局安装它,我们可以使用npx可以避免全局安装模块,使用npx执行时,如果命令不在你的 $PATH 中,npx 会自动从 npm 注册源中拉取具有该名字的模块并安装调用它。在调用完成后,安装的模块并不会被放入你的环境变量,不会对你的环境造成污染。比如,
create-react-app
这个模块是全局安装,npx 可以运行它,而且不进行全局安装。npx 将 create-react-app 下载到一个临时目录,使用以后再删除。所以,以后再次执行上面的命令,会重新下载 create-react-app。通过 @ 我们还可以指定模块版本:
npx create-react-app@1.0.0 my-react-app
- 下载全局模块时,npx 允许指定版本。指定使用 4.44.1 版本的webpack进行打包操作
npx webpack@4.44.1 ./src/index.js -o ./dist/main.js
注意:只要 npx 后面的模块无法在本地发现,就会下载同名模块。比如,本地没有安装
webpack-dev-server
模块,下面的命令会自动下载该模块npx webpack-dev-server
,在当前目录启动一个 Webpack dev 服务。
- npx 强制使用本地模块,不下载远程模块,可以使用
--no-install
参数。如果本地不存在该模块,就会报错。
npx --no-install webpack-dev-server
- 忽略本地的同名模块,强制安装使用远程模块,可以使用
--ignore-existing
参数。
npx --ignore-existing create-react-app my-react-app
3.3 指定 Node 执行版本
- 利用 npx 指定某个版本的 Node 运行脚本。
npx node@16.15.1 -v
上面命令会使用 16.15.1 版本的 NodeJS 执行脚本。原理是从 npm 下载这个版本的 node,使用后再删掉。
3.4 执行 gist 片段代码
npx 甚至支持运行远程仓库的可执行文件,npx 支持通过 url 执行 GitHub 上的源码模块。只要按照模块的定义写好,然后提供 gist 地址,npx 便可以按照约定执行脚本。
- 一个标准模块定义至少应该包含一个 package.json 文件,并指定 bin 脚本入口,
{
"name": "micro-cli",
"version": "1.0.0",
"bin": "./index.js"
}
- 然后便可以这样执行:
npx https://gist.github.com/mcro-design/xxx
四 命令
在传统的命令执行中,我们需要将工具添加到 package.json
的 scripts
配置中,这种方式还需要我们以 -- 方式传递参数;我们也可以使用 alias npmx=PATH=$(npm bin):$PATH
, 或者./node_modules/.bin/webpack
方式来执行命令,虽然都能达到目标,但不免繁杂了许多。而npx
允许我们以 npx webpack
这样的方式直接运行本地安装的 webpack
命令。完整的 npx 命令提示如下:
从 npm 的可执行包执行命令
npx [选项] <命令>[@版本] [命令的参数]...
npx [选项] [-p|--package <包>]... <命令> [命令的参数]...
npx [选项] -c '<命令的字符串>'
npx --shell-auto-fallback [命令行解释器]
选项:
--package, -p 包安装的路径 [字符串]
--cache npm 缓存路径 [字符串]
--install 如果有包缺失,跳过安装 [布尔] [默认值: true]
--userconfig 当前用户的 npmrc 路径 [字符串]
--call, -c 像执行 `npm run-script` 一样执行一个字符串 [字符串]
--shell, -s 执行命令用到的解释器,可选 [字符串] [默认值: false]
--shell-auto-fallback 产生“找不到命令”的错误码
[字符串] [可选值: "", "bash", "fish", "zsh"]
--ignore-existing 忽略 $PATH 或工程里已有的可执行文件,这会强制使 npx
临时安装一次,并且使用其最新的版本 [布尔]
--quiet, -q 隐藏 npx 的输出,子命令不会受到影响 [布尔]
--npm 为了执行内部操作的 npm 可执行文件 [字符串] [默认值:
"/Users/apple/.nvm/versions/node/v8.1.3/lib/node_modules/npm/bin/npm-cli.js"]
--version, -v 显示版本号 [布尔]
--help, -h 显示帮助信息 [布尔]