【前端基础】npm install 是干嘛的(带参数 vs 不带参数)

​ 很多人第一次用 npm 都会懵:

bash 复制代码
npm install              # 不带参数
npm install tegaki       # 带包名

​ **看起来只差一个单词,但背后逻辑完全不同。**用错了,轻则项目跑不起来,重则依赖混乱、环境对不上。

​ 这两个命令其实不冲突,而是"接力关系"。这一篇帮你彻底搞懂。

一、引言

​ 我们可以先来看一下三个文件/目录的关系:

​ 其中,左边的 package.json 是你写的清单,告诉 npm 要装什么。中间 npm install 是动作。右边是结果,node_modules/ 是真正下载下来的代码,package-lock.json 记录每个包的精确版本号,保证你和同事装出来的依赖一模一样。三者中只有 package.jsonpackage-lock.json 可以放到gitnode_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 tegakinpm 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

dependencies vs devDependencies 的区别:前者是线上运行 也需要的(如 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 installnode_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 installnpm install <你要的包> 这个顺序最不容易出错。

相关推荐
这是程序猿2 小时前
MySQL 索引一篇讲透:原理、分类、优化与面试总结
java·前端·mysql
IT_陈寒2 小时前
被JavaScript的隐式类型转换坑到怀疑人生
前端·人工智能·后端
阿赛工作室2 小时前
node.js使用AES加密/解密的详细教程
node.js
Highcharts.js2 小时前
实战指南:如何构建一套全平台适配的响应式图表系统?
前端·javascript·highcharts·实战代码·响应式图表
lihaozecq2 小时前
我用 1 个月写了一个 Web AI Coding Agent,今天开源 —— code-artisan
前端·agent·ai编程
77美式2 小时前
手机端键盘弹出导致页面抖动
前端·javascript·uniapp
鹏程十八少2 小时前
8. 2026金三银四 Android别再说你会用 RecyclerView了!20道面试题测测你的真实水平
前端·后端·面试
森叶2 小时前
Electron 实战:utilityProcess 服务脚本热更新、用户目录优先启动与 asar 依赖解析
前端·javascript·electron
深念Y2 小时前
若依框架2026年现状:没被淘汰,反而更强了
前端·javascript·vue.js·框架·系统·模板·若依