介绍
npx 是 npm 5.2.0+ 自带的命令工具(Node.js 配套)
作用:不用提前全局安装,临时下载,直接调用 npm 包,用完就扔。
提示:npx 执行完不会立刻删除文件,只是不会把包安装到系统全局;下载的包会放进缓存目录,留着下次复用,这个缓存文件才需要手动清理。
低版本安装
低版本 npm 需要手动安装:
npm install -g npx
作用
- 临时执行包,用完就删:不需要
npm install -g xxx全局安装,执行完自动删除,不污染本地全局环境。 - 调用项目本地 node_modules/.bin 下的脚本:优先使用当前项目里安装的包版本,而不是全局版本。
- 指定包版本运行,可以一次性跑不同版本工具。
- 执行远程仓库代码(有安全风险)
区分
npm:管理包(安装、卸载、版本管理)npx:运行包里的命令
语法
npx [选项] <包名>[@版本] [命令参数]
常用例子
1. 临时运行包(最常用)
# 临时使用 create-react-app 创建项目,不用全局安装
npx create-react-app myapp
执行逻辑:
- 检查本机是否已经有
create-react-app - 没有 → 自动下载该包到临时目录
- 运行包提供的命令
- 运行结束自动删除临时包
2. 指定版本运行
# 使用 node 18 版本的 node 临时执行代码
npx node@18 -e "console.log('hello')"
3. 执行当前项目本地的包(不下载)
当前项目已经 npm install eslint,但没全局装 eslint:
# 直接调用项目 node_modules/.bin/eslint
npx eslint src/index.js
等价于 ./node_modules/.bin/eslint src/index.js,Windows 下是 node_modules\.bin\eslint.cmd
4. 不自动安装,只尝试本地查找(—no-install)
npx --no-install eslint src/index.js
如果本地找不到 eslint,直接报错,不会去网上下载。
5. 强制使用缓存里的包,不更新(—cache)
npx --cache ./mycache create-vite
6. 一次性执行 github 仓库代码(慎用)
npx github:xxx/xxx
注意:会直接拉取远程代码执行,不要执行来源不明仓库。
重要参数
| 参数 | 说明 |
|---|---|
--no-install |
禁止自动下载包,只使用本地已存在 |
--cache <path> |
指定 npx 缓存目录 |
--yes |
所有询问自动回答 yes |
-p, --package <pkg> |
预先安装指定包,多个包逗号分隔 |
-c "cmd" |
多命令执行,支持管道 |
示例 -p:一次性安装多个包并执行
npx -p lodash -p moment -c "node -e 'const _=require(\"lodash\");console.log(_.VERSION)'"
npx 的查找优先级
- 当前目录
node_modules/.bin - 本地缓存
- npm 仓库下载临时包执行
好处: 解决全局包版本冲突。比如项目A需要 webpack4,项目B需要 webpack5,不用反复切换全局版本,直接 npx webpack@4。
缓存目录
npx 下载的临时包会缓存,不是每次都重新下载。
- Linux/macOS:
~/.npm/_npx - Windows:
%AppData%\npm\_npx
清理缓存:
npm cache clean --force
常见坑点
Node.js 版本 < 8.2 / npm <5.2:没有内置 npx,需要手动npm i -g npx- 包名和命令名不一致:有些包安装后提供的命令名字≠包名,需要用
-p指定包:
# 包名 @vue/cli,命令是 vue
npx -p @vue/cli vue create demo
- 网络问题:国内访问 npm 慢,可以切换淘宝源
npm config set registry [https://registry.npmmirror.com](https://registry.npmmirror.com)
- npx 是一次性环境:执行完临时包就销毁,不会保留任何依赖。
补充:pnpm 对应替代品
pnpm:pnpm dlx,功能和 npx 几乎一致。