目录
[① 启动 npm 这个命令本身 ✅依赖 PATH](#① 启动 npm 这个命令本身 ✅依赖 PATH)
[② npm 运行本地项目脚本 npm run xxx](#② npm 运行本地项目脚本 npm run xxx)
[③ npm 全局安装的包(npm install -g xxx)](#③ npm 全局安装的包(npm install -g xxx))
[3、yarn(yarn v1)](#3、yarn(yarn v1))
[① 直接敲 yarn 启动 yarn 本身 ✅依赖 PATH](#① 直接敲 yarn 启动 yarn 本身 ✅依赖 PATH)
[② yarn 运行项目内命令 yarn xxx](#② yarn 运行项目内命令 yarn xxx)
[③ yarn 全局包 yarn global add xxx](#③ yarn 全局包 yarn global add xxx)
[D:\program files\nodejs\node_modules\npm VS C:\Users\ding.dongyang\AppData\Roaming\npm](#D:\program files\nodejs\node_modules\npm VS C:\Users\ding.dongyang\AppData\Roaming\npm)
对比
npm:包管理器,管装包,管脚本;全局命令靠系统PATH。
npx:执行器,本体要PATH,但是找第三方包不走系统PATH;临时跑工具神器。
yarn:包管理器;对标npx,直接敲yarn命令本身需要PATH
|------|------------------------|---------------------------------------|------------------------|
| 工具 | 执行工具本身(敲 npm/npx/yarn) | 运行项目本地包命令 | 直接调用全局安装的第三方包 |
| npm | 依赖 PATH | npm run:进程内临时 PATH,不依赖系统 PATH | 依赖系统 PATH |
| npx | 依赖 PATH(npx 本体) | 内部找 node_modules/.bin,不依赖系统 PATH | 内部找全局目录,不依赖系统 PATH |
| yarn | 依赖 PATH | 内部读取 node_modules/.bin,不依赖系统 PATH | 依赖系统 PATH |
PATH:操作系统环境变量,系统在这些文件夹里找可执行程序。 重点区分两件事:工具本身能不能启动 、工具内部找包命令,二者 PATH 规则不一样。
1、npm
① 启动 npm 这个命令本身 ✅依赖 PATH
终端敲 npm,是操作系统去 PATH 找 npm.cmd。
Node 安装时已经自动把 node/npm 路径写入 PATH,所以一般直接能用。
② npm 运行本地项目脚本 npm run xxx
不依赖系统永久 PATH 。 npm 执行脚本的时候,会临时把项目 node_modules/.bin 加到当前进程的 PATH,脚本执行完就消失。 所以 scripts 里可以直接写 eslint、vite,不用 npx,不用全局安装。
③ npm 全局安装的包(npm install -g xxx)
你直接在终端敲 xxx(比如 yarn),依赖系统 PATH。 系统要在 PATH 里找到 npm 全局 bin 目录,才能识别命令;找不到就报 "无法识别"。
2、npx
npx 是 npm 的子命令,npx 本身能跑,依赖 PATH(因为 npx 实际是 npx.cmd) ⚠️但是:npx 去查找要执行的 npm 包命令,不依赖系统 PATH
举例子:
npx yarn --version
- 首先系统要能找到 npx 命令(依赖 PATH);
- 找到 npx 程序之后,npx 自己内部逻辑:优先项目
node_modules/.bin→ npm 全局目录 → 远程下载。这一步不走操作系统 PATH 搜索。
👉总结:
- 启动 npx 工具本身:✅依赖 PATH
- npx 查找要运行的第三方包命令:❌不依赖系统 PATH
3、yarn(yarn v1)
① 直接敲 yarn 启动 yarn 本身 ✅依赖 PATH
- 如果是
npm install -g yarn安装:需要 npm 全局 bin 目录进 PATH,否则报错无法识别。 - 如果用
corepack enable:corepack 会注册 yarn 的代理脚本到 PATH,所以可以直接执行 yarn。
② yarn 运行项目内命令 yarn xxx
yarn 内部会读取项目node_modules/.bin,不需要系统 PATH 有这个包,和 npm run 逻辑类似。
③ yarn 全局包 yarn global add xxx
直接终端敲这个全局命令,依然需要全局目录加入系统 PATH。
1.npx yarn --version
系统依靠PATH找到npx本体;npx内部自己找yarn,不走系统PATH;全局没有就网上临时下载,所以可以执行成功
2.yarn --version
交给操作系统,去系统PATH里找yarn.cmd,找不到直接报错
3.npm run/yarn xxx
工具启动后,会把node_moudles/.bin加到当前进程临时PATH,只本次命令生效,不会改动电脑系统环境变量
D:\program files\nodejs\node_modules\npm VS C:\Users\ding.dongyang\AppData\Roaming\npm
|---------------------------|-----------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------|
| 目录 | D:\program files\nodejs\node_modules\npm | C:\Users\ding.dongyang\AppData\Roaming\npm |
| 是什么 | Node安装包自带的npm本体源码 | npm全局安装(-g)的输出目录(prefix) |
| 来源 | 安装node.js的时候复制过来的,属于node安装程序自带文件 | 执行npm install -g xxx自动生成,按Windows用户隔离,每个用户独立一份 |
| 存放内容 | npm命令行工具本身的源代码;npm.cmd,npx.cmd在这里 | 1.全局包的可执行脚本:yarn.cmd,vue.cmd等 2.子文件夹node_modules;存放-g安装的第三方源码 |
| 全局安装npm install -g yarn放哪 | 不会放这里 | 放到这里。 脚本:C:\Users\ding.dongyang\AppData\Roaming\npm\yarn.cmd 源码:C:\Users\ding.dongyang\AppData\Roaming\npm\node_modules\yarn |
| 会不会随npm-g升级被修改 | 会;执行npm install -g npm会更新这里的npm本体文件 | 存放第三方全局包,不修改nodejs本体 |
| PATH作用 | 系统PATH配置D:\program files\nodejs,用来找到npm.cmd | 这个目录必须加到PATH,才能敲yarn,vue等全局命令 |
一句话区分:
D:\program files\nodejs\node_modules\npm:npm 自己的本体,跟着 node 安装来的。C:\Users\ding.dongyang\AppData\Roaming\npm:所有‑g全局包的存放地,yarn、vue-cli 等全局工具都装在这里。
确认全局当前全局prefix(真实全局安装目录)
npm config get prefix
Windows默认输出就是
C:\Users\ding.dongyang\AppData\Roaming\npm
npm install -g xxx,全部安装到这个 prefix 目录下,不会装到 D 盘 nodejs 目录npm
yarn报错解决
npm install‑g yarn成功,但敲yarn --version找不到
-
yarn 被安装到:
C:\Users\ding.dongyang\AppData\Roaming\npm,里面生成了yarn.cmd -
系统 PATH 里只有
D:\program files\nodejs,没有上面这个 C 盘路径 -
PowerShell 在 PATH 列表里找不到
yarn.cmd,直接报错 "无法识别" -
但是
npx yarn --version可以跑:npx 自己内部逻辑会读取 prefix 目录去找 yarn,不走系统 PATH。
1.使用npx yarn
2.把 npm 全局目录加到 PATH 环境变量
- Windows 搜索:编辑环境变量 →【环境变量】
- 在用户变量 找到
Path(不要去系统变量,用户变量即可)→编辑 - 新建一条,粘贴上面
npm config get prefix输出的路径,示例:
C:\Users\xxx\AppData\Roaming\npm
- 简写也可以:
%APPDATA%\npm
总结
yran命令依赖PATH,需要将路径加入到PATH里,否则会找不到
npx不依赖PATH,找不到会下载