很多人第一次用 npm 都会懵:
bash
npm install # 不带参数
npm install tegaki # 带包名
**看起来只差一个单词,但背后逻辑完全不同。**用错了,轻则项目跑不起来,重则依赖混乱、环境对不上。
这两个命令其实不冲突,而是"接力关系"。这一篇帮你彻底搞懂。
一、引言
我们可以先来看一下三个文件/目录的关系:

其中,左边的 package.json 是你写的清单,告诉 npm 要装什么。中间 npm install 是动作。右边是结果,node_modules/ 是真正下载下来的代码,package-lock.json 记录每个包的精确版本号,保证你和同事装出来的依赖一模一样。三者中只有 package.json 和 package-lock.json 可以放到git ,node_modules/ 永远不要放进去。
这条规则也解释了为什么每次拷贝项目都要重跑一次 npm install 。不管是 git clone 别人的仓库、从同事那拷一份压缩包、还是换台电脑同步代码,你拿到的都只有清单(package.json + package-lock.json),没有 node_modules/ 这几百 MB 的实物。所以到手第一件事就是 npm install ,照着清单把货补齐。这也是为什么 node_modules/ 不放进git 反而是好事:每个人本地装一次比让仓库背着这个大包袱合理得多。
二、 npm install(不带参数)
2.1 它读什么
项目根目录的 package.json,里面有一段类似:
json
{
"dependencies": {
"react": "^18.x.x",
"react-dom": "^18.x.x"
},
"devDependencies": {
"vite": "^5.x.x",
"typescript": "^5.x.x",
"@vitejs/plugin-react": "^4.x.x"
}
}
这是项目的"购物清单",声明这个项目需要哪些第三方库。
2.2 它干什么
它会把清单上的所有依赖全部下载下来。读 package.json 里所有 dependencies + devDependencies,全部下载到 node_modules/ 里。
因此,不带参数会照着清单一次性把货全拉下来。
其实,它是一个"环境还原命令"(restore environment)。比如我们 git clone 一个项目,本地没有依赖,跑一次npm install环境就恢复了。
2.3 跑完之后
目录里会多一个node_modules目录:
bash
项目根/
├── node_modules/ ← 新出现,几百个第三方包
├── package-lock.json ← 新出现,记录每个包的精确版本
├── package.json ← 内容不变
└── ...
node_modules/ 通常几百 MB、几万个文件,这是正常的,不要手动改、不要提交到 git(不是不能存在,是不进仓库)。
三、npm install <包名>(带参数)
例如 npm install tegaki、npm install lodash react axios。

装完之后会把新包名写回
package.json"。这是带参数版本独有的副作用。也正因为有这一步,你才不需要手动编辑package.json加依赖,命令自动会替你写。
3.1 Step1:下载包
下载 这些包到 node_modules/<包名>/。
3.2 Step2:修改清单
自动改写 package.json,把它们加到 dependencies 里:
json
"dependencies": {
"react": "^18.x.x",
"react-dom": "^18.x.x",
"tegaki": "^x.x.x" ← 自动加上的
}
同时也会同步更新 package-lock.json。
3.3 顺带会"补漏"
它会检查你清单里的其它依赖在不在,缺的话会补上。
如果你跳过npm install,直接先跑npm install tegaki,虽然大多数时候能跑通 ,但在团队协作中,可能导致 lock 文件不一致 → 出现诡异 bug。所以建议先进行npm install,再加新包。
四、为什么两条命令不冲突
因为它们操作的是同一个 node_modules/ 文件夹 ,读写同一份 package.json。npm 自己保证不会装重、不会冲突。
4.1 类比
打个比方:
| 命令 | 比喻 |
|---|---|
npm install(不带参数) |
"把购物清单上所有东西买回来" |
npm install tegaki |
"再额外多买一件 tegaki,并把它写进清单" |
4.2 对照速查表
| 命令 | 读 package.json |
写 package.json |
装哪些包 |
|---|---|---|---|
npm install |
✅ | ❌ | 清单上所有包 |
npm install tegaki |
✅ | ✅ 加一行 tegaki | 清单上所有包 + tegaki |
npm install tegaki react lodash |
✅ | ✅ 加多项 | 清单上所有包 + 多个新增包 |
npm install tegaki --save-dev |
✅ | ✅ 加到 devDependencies |
同上,但归类为开发依赖 |
npm uninstall tegaki |
✅ | ✅ 删一行 tegaki | 从 node_modules/ 删掉 tegaki |
dependenciesvsdevDependencies的区别:前者是线上运行 也需要的(如 react、tegaki),后者是只有开发 才用的工具(如 vite、typescript、测试框架)。打包发布到生产环境时只装dependencies,体积更小。
4.3 npm install VS npm cli
-
npm install:可能会更新依赖 -
npm cli:严格按 lock 文件安装(更快、更稳定)CI/CD(自动部署)里通常用:
npm cli。
4.4 什么时候需要跑 npm install
| 场景 | 该跑哪个 |
|---|---|
用 npm create vite ... 新建项目后 |
npm install(一次性) |
git clone 别人的项目 |
npm install(node_modules/ 通常不进 git) |
git pull 拉到新代码、package.json 改过 |
npm install(同步新依赖) |
| 想加一个新库 | npm install xxx |
| 想加多个 | npm install a b c 或分多次 |
| 想加开发工具(比如 prettier) | npm install prettier --save-dev |
| 想升级某个包到最新 | npm install tegaki@latest |
| 想装指定版本 | npm install tegaki@1.2.3 |
| 想删一个包 | npm uninstall tegaki |
node_modules/ 莫名出错 |
rm -rf node_modules package-lock.json && npm install |
4.5 出问题终极解法
删除所有环境,然后重装:
bash
rm -rf node_modules package-lock.json
npm install
五、常见疑问
5.1跑了 npm install 之后还能再跑 npm install tegaki 吗?
能,正常操作。第一条把清单上的装好,第二条往清单里加一项再装。
5.2 忘了第一步直接跑 npm install tegaki 行不行?
能跑通,但不规范。脚手架文档让你先跑 npm install 是最佳实践。
5.3 可以不传参数反复跑 npm install 吗
可以,无副作用。已经装好的不会重装,相当于"对一遍清单"。
5.4 node_modules/ 这么大,提交到 git 吗?
绝对不要 。Vite 脚手架自动生成的 .gitignore 里已经包含了 node_modules,照常 git add . 不会带上。
5.5package-lock.json 要提交吗?
一定要提交(保证版本一致)。它锁定每个包的精确版本,保证你和同事装出来的依赖完全一致。
5.6 能不能用 pnpm / yarn / bun 代替 npm?
可以,命令几乎一样:pnpm install / yarn / bun install。但一个项目里别混用,否则会出现多个 lock 文件互相打架。
5.7npm install 巨慢怎么办?
- 换镜像源:
bash
npm config set registry https://registry.npmmirror.com
- 切回官方源:
bash
npm config set registry https://registry.npmjs.org
六、总结
npm install = 把购物清单上的全装上。npm install xxx = 再加一件并装上。
先后顺序无所谓,不冲突。新建项目按 npm install → npm install <你要的包> 这个顺序最不容易出错。