大家好,今天我们来聊聊npm和npx这对"包"治百病的黄金搭档。用了多年Node.js,却还在npm和npx之间反复横跳,今天我们就来彻底拆散这对CP...啊不是,彻底搞清楚它们的关系!
一、先看脸:这对CP的基本人设
npm - Node.js 的默认包管理器(你的贴心管家):
【全局或本地安装依赖包】
- 大名:Node Package Manager
- 特长:安装、卸载、管理、发布种Node.js包
- 口头禅:"让我先把这个包装好"
npx - npm 5.2.0+ 版本自带的工具(你的随叫随到工具人):
【主要用于临时执行 Node.js 包】
- 大名:Node Package eXecute
- 特长:临时执行各种Node.js包
- 口头禅:"用完我就跑"
举个栗子🌰:
# npm要先"娶回家"(安装)
npm install -g create-react-app
create-react-app my-app
# npx直接"闪婚"(临时使用)
npx create-react-app my-app
看到没?npx就是那个不愿意负责任的"渣男"工具!(大误)
二、深入CP日常:使用场景大PK
1. 安装依赖
npm像个囤积症患者:
npm install lodash # 把lodash请回家供着
npx像个极简主义者:
npx lodash --version # 用完就扔
2. 执行命令
npm需要媒人(package.json)介绍:
"scripts": {
"start": "react-scripts start"
}
然后才能:
npm run start
npx直接自由恋爱:
npx react-scripts start
3. 版本控制
npm是专一的好男人:
npm install webpack@4.44.1 # 锁定版本
npx是个海王:
npx webpack@4.44.1 build # 今天用4.44.1
npx webpack@5.0.0 build # 明天用5.0.0
三、CP相处之道:什么时候该用谁?
适合npm的场景:
- 项目长期使用正经依赖(就像结婚)
- 项目构建依赖
- 团队协作需要统一版本(锁定版本)
适合npx的场景:
- 一次性命令/工具(就像约会)
- 不想全局安装的CLI工具
- 快速测试不同版本的包
- 执行远程脚本(网恋奔现)
四、CP冷知识
-
npx的24小时法则:默认会缓存包24小时,像不像某些人的"分手冷静期"?
-
远程执行:
npx https://gist.github.com/username/123456
这相当于"网恋工具人"啊!
-
npx的查找顺序:
- 先找本地(node_modules/.bin)
- 再找全局安装的包
- 最后没找到,则临时下载
五、CP常见问题
Q: 我npm和npx都用混了怎么办? A: 记住口诀:
- 要持久用npm
- 要临时用npx
- 要海王用npx加版本号
Q: 为什么npx有时候很慢? A: 因为它正在偷偷下载包,就像你网恋对象正在P图一样需要时间!
Q: 为什么需要 npx?
-
避免全局污染:
# 不需要全局安装就可以使用 npx create-react-app my-app
-
简化一次性命令:
# 不需要先安装http-server npx http-server
-
测试不同版本:
npx nodemon@1.19.4 npx nodemon@2.0.7
-
减少项目依赖:
# 不需要将工具包加入项目依赖 npx prettier --write .
六、 主要区别
特性 | npm | npx |
---|---|---|
主要用途 | 包管理(安装/卸载/更新) | 执行包 |
是否需要安装 | 需要先安装包 | 可直接运行未安装的包 |
执行环境 | npm run 会新建一个shell环境 | npx 直接在当前上下文执行 |
执行方式 | 通过 package.json 的 scripts | 直接执行 |
包存储位置 | 全局或本地 node_modules | 临时安装(可选) |
缓存机制 | 长期存储 | 默认会缓存包24小时,可配置是否缓存,(可通过 --no-install 禁用) |
七、版本关系
- npm 5.2.0+ 自带 npx
- 旧版 npm 可以单独安装:
npm install -g npx
八、总结
npm
是包管理器,npx
是包执行器,二者互补使用能提高Node.js开发效率。
npm和npx这对CP,一个负责"过日子",一个负责"玩浪漫"。理解它们的区别后,你的Node.js开发效率会像坐火箭一样飙升!
最后送大家一句话:
用npm是婚姻,用npx是恋爱;
婚姻要慎重,恋爱要大胆;
但千万别用npx来管理项目依赖,
否则你的node_modules会比你的前男友还难缠!
(完)
彩蛋:试着在你的终端输入:
npx cowsay "祝大家包运亨通!"
保证有惊喜!