NPM 全局包与NPX命令
前几篇教程我们安装的依赖都是项目本地的 —— 每个项目有自己独立的 node_modules。
但有时候你需要的不是“某个库”,而是一个命令行工具,比如:
nodemon—— 文件变更时自动重启 Node 服务create-react-app—— 一键创建 React 项目eslint—— 检查代码规范
这些工具你希望在任何目录下都能直接敲命令运行,而不是每个项目里都装一份。
这时候就需要 全局安装。
全局安装(-g)
什么是全局安装
全局安装就是把包安装到系统目录,安装后它的命令行工具可以在任何位置直接调用。
# 全局安装 nodemon
npm install -g nodemon
安装完成后,你就可以在终端任意目录下直接敲:
nodemon server.js
系统会找到全局安装的 nodemon 并执行。
查看全局安装的包
# 列出所有全局包
npm list -g --depth=0
卸载全局包
npm uninstall -g nodemon
什么时候应该全局安装
| 应该全局安装 | 应该本地安装 |
|---|---|
| 命令行工具,需要在任意目录使用 | 项目代码中 import/require 的库 |
| 每个项目版本需求一致 | 不同项目可能用不同版本 |
例如:nodemon、pm2、yarn |
例如:react、express、lodash |
核心判断标准:这个包是“工具”还是“代码依赖”?
- 工具 → 全局安装(命令行里用)
- 代码依赖 → 本地安装(代码里 import)
NPX命令
NPX 是什么
NPX(Node Package Execute) 是 NPM 5.2.0 及以上版本自动附带的工具,可以理解为 “包执行器”。
# 检查是否已安装
npx --version
它的核心能力是:不安装包,直接执行它。
没有 NPX 的时候
在 NPX 出现之前,如果你想运行一个命令行工具(比如 create-react-app),通常有两种方式:
| 方式 | 命令 | 缺点 |
|---|---|---|
| 全局安装 | 1 npm i -g create-react-app2 create-react-app my-app |
占用磁盘空间;版本管理混乱;不同项目可能依赖不同版本 |
| 本地安装 + 路径调用 | 1 npm i create-react-app2 ./node_modules/.bin/create-react-app my-app |
路径繁琐;每次都要输入长路径 |
NPX 的解决方案是:直接运行,无需安装。
npx create-react-app my-app
执行流程
执行 npx create-react-app my-app 时,NPX 做的事情是:
- 查找本地:在当前项目的
./node_modules/.bin/中查找是否存在create-react-app - 查找全局:如果本地没有,查找全局安装目录
- 临时下载:如果都没有,从 npm 仓库临时下载到缓存目录并执行
提示:npx 会自动向上查找包含 node_modules 的最近项目根目录。即使你在子文件夹中执行命令,它也能正确找到项目根目录下的依赖。
临时下载的缓存位置
当 npx 需要从远程下载包时,会将其存放在 Node.js 的全局缓存目录中:
| 操作系统 | 缓存路径 |
|---|---|
| Windows | C:\Users\你的用户名\AppData\Local\npm-cache\_npx |
| macOS / Linux | ~/.npm/_npx |
注意:在较新版本中(npm 7.0+),npx 会保留缓存,第二次执行相同命令时直接读取,速度更快。如需清空缓存,可执行 npm cache clean --force。
NPX 使用场景
执行项目本地的命令(最常用)
在项目中,当你想查看 webpack 版本时,传统方式需要敲完整路径:
# 传统方式(繁琐)
./node_modules/.bin/webpack -v
# NPX 方式(简洁)
npx webpack -v
npx 会自动在 node_modules/.bin 中查找命令并执行,省去了写完整路径的麻烦。
创建新项目(避免全局安装)
# 创建一个 React 项目
npx create-react-app my-app
# 创建一个 Vite 项目
npx create-vite my-vue-app
# 创建 Next.js 项目
npx create-next-app my-next-app
# 指定版本
npx create-react-app@5.0.0 my-app
用 npx 的好处是:你总是用最新的脚手架,不会因为全局装了旧版本而建出老项目。
临时切换包的版本
测试某个工具的特定版本是否兼容:
# 使用 ESLint 的特定版本
npx eslint@7.32.0 app.js
# 测试不同版本的 webpack 打包结果
npx webpack@4 build
npx webpack@5 build
# 测试不同版本的 TypeScript 编译结果
npx typescript@4.9.5 tsc --version
npx typescript@5.3.0 tsc --version
不用切换全局版本,也不用每个版本都装一遍。
执行一次性脚本
直接运行 GitHub Gist 上的脚本:
npx https://gist.github.com/username/script.js
或运行项目初始化工具:
# 生成开源协议文件
npx license MIT
# 生成 README 文件
npx readme-generator
npm create:创建项目的快捷方式
npm create 是 npx 的别名,专门用于执行项目脚手架:
# 创建 Vue 项目
npm create vue@latest
# 创建 Vite 项目
npm create vite@latest
NPX 常用参数
| 参数 | 说明 | 示例 |
|---|---|---|
-v, --version |
显示 NPX 版本号 | npx -v |
-h, --help |
显示帮助信息 | npx -h |
--no-install |
强制只使用本地包,不存在则报错 | npx --no-install webpack -v |
--ignore-existing |
强制忽略本地包,直接从远程下载 | npx --ignore-existing eslint |
-p, --package <pkg> |
指定包名(包名与命令名不同时使用) | npx -p @vue/cli vue create my-app |
-c, --call <cmd> |
将后面内容作为完整命令传递(支持管道符) | npx -c "eslint . --fix" |
--yes |
跳过下载确认提示(自动化脚本) | npx --yes create-react-app my-app |
--shell <shell> |
指定执行命令时使用的 Shell 环境 | npx --shell bash -c "echo hello" |
NPX 新手常见问题
Q:npx 需要单独安装吗?
不需要。NPM 5.2+ 自带 npx。
Q:npx 下载的包会永远留在电脑里吗?
不会长期占用。npx 会缓存一段时间,但最终会被清理。如果想彻底清掉:npm cache clean --force。
Q:npx 和 npm run 有什么区别?
npm run |
npx |
|
|---|---|---|
| 执行位置 | 必须在项目根目录 | 任意目录 |
| 依赖来源 | node_modules/.bin/ |
node_modules/.bin/ 或临时下载 |
| 需要写入 scripts | 需要 | 不需要 |
| 适用场景 | 项目内的固定任务 | 临时执行任意命令 |
Q:那是不是可以完全不用全局安装,全用 npx?
理论上可以,但不实际。像 nodemon 这种你每天可能要执行几十次的工具,每次都等 npx 下载或读缓存,太慢了。高频用全局,低频用 npx。
NPX vs 全局安装
| 对比 | 全局安装 | npx |
|---|---|---|
| 安装方式 | npm i -g xxx |
无需安装,临时下载 |
| 占用磁盘 | 永久占用 | 用完即走(有缓存) |
| 版本管理 | 只有一个版本,多个项目可能冲突 | 每次可指定不同版本 |
| 全局环境 | 会污染全局环境 | 不污染全局环境 |
| 适用场景 | 高频使用的工具(每天用) | 偶尔用一次的工具 |
简单说:天天用的工具全局装,偶尔用一次的工具用 npx。
NPX vs NPM
两者是“管理”和“执行”的分工关系:
| 对比维度 | NPM(包管理器) | NPX(包执行器) |
|---|---|---|
| 职责 | 安装、管理、卸载包 | 执行包中的命令 |
| 是否保存包 | 保存到 node_modules/ 和 package.json |
不保存(除非加 --save),临时使用 |
| 执行本地命令 | 需写完整路径 ./node_modules/.bin/xxx |
直接 npx xxx,自动识别 |
| 执行未安装包 | ❌ 不支持 | ✅ 自动下载到临时缓存并执行 |
| 典型场景 | 安装项目依赖(如 npm install vue) |
执行一次性脚手架或工具 |
本篇小结
- 全局安装(
-g):装到系统目录,所有项目共用。适合高频命令行工具。 - npx:临时下载执行,用完不保留。适合偶尔用一次的工具或需要特定版本的场景。
- 判断标准:工具 vs 依赖;高频 vs 低频。