Skip to content

包管理器不是运行网站的魔法,它是项目的材料管理员 ​

先认识 Package / 包 ​

包是别人整理好、可以重复使用的一组代码。

AI 留言板可能使用:

text
react       构建页面
express     构建后端 API
zod         检查输入数据
vite        启动开发和构建前端

你不需要自己从零写 React,但项目要声明使用哪个版本。

Dependency / 依赖是什么 ​

如果项目代码必须依靠某个包才能运行,这个包就是项目依赖。

text
项目       一家餐厅
依赖       面粉、调料、烤箱等外部材料和工具
包管理器   根据清单采购并摆放材料的管理员

依赖本身还可能依赖其他包,形成依赖树。

package.json 是清单 ​

json
{
  "scripts": {
    "dev": "vite",
    "build": "tsc && vite build"
  },
  "dependencies": {
    "react": "^19.0.0",
    "express": "^5.0.0"
  },
  "devDependencies": {
    "typescript": "^5.0.0",
    "vite": "^7.0.0"
  }
}

它记录需要什么,但不是已经安装好的包目录。

node_modules 是安装结果 ​

运行安装命令后,包管理器会准备依赖。npm 和 Yarn 常在项目创建 node_modules;pnpm 也提供兼容的 node_modules 结构,但会更强调内容寻址存储和链接复用。

不要手动修改 node_modules。重新安装时会被覆盖。

锁文件为什么存在 ​

package.json 里的版本范围可能允许多个版本。锁文件记录这次实际解析出的精确版本和依赖关系。

text
package-lock.json   npm
pnpm-lock.yaml      pnpm
yarn.lock           Yarn

锁文件应该提交 Git,让本地、同事电脑和部署平台尽量安装同一套依赖。

npm、pnpm、Yarn 是什么关系 ​

它们都是 JavaScript 包管理器,都能:

text
读取 package.json
安装依赖
维护锁文件
运行 scripts

区别主要在安装策略、锁文件格式、工作区能力和命令细节。

初学时最重要的不是争论哪个最好,而是跟随现有项目。

怎样判断项目使用哪一个 ​

按顺序看:

  1. README 有没有指定命令。
  2. package.json 有没有 packageManager 字段。
  3. 根目录是哪一种锁文件。

例如:

json
{
  "packageManager": "pnpm@10.0.0"
}

说明项目明确希望使用 pnpm 的某个版本线。

同一件事的命令对照 ​

任务npmpnpmYarn
安装项目依赖npm installpnpm installyarn install
启动 dev scriptnpm run devpnpm devyarn dev
添加运行依赖npm install zodpnpm add zodyarn add zod
添加开发依赖npm install -D vitestpnpm add -D vitestyarn add -D vitest
删除依赖npm uninstall zodpnpm remove zodyarn remove zod

具体命令以项目和当前官方文档为准。

为什么不要混用 ​

项目已有 pnpm-lock.yaml,你又运行 npm install,可能生成 package-lock.json。

随后出现:

text
你的电脑按 npm 解析
同事电脑按 pnpm 解析
部署平台不知道该听谁
AI 又建议删除其中一个

结果可能是版本差异、幽灵依赖或构建不一致。

看到现有锁文件,先使用对应工具。想迁移包管理器是一项独立工程,不是修一个小错误时顺手做的事。

npm install 到底发生什么 ​

text
读取 package.json
  ↓
读取或生成 package-lock.json
  ↓
从包注册表获取所需包
  ↓
准备 node_modules
  ↓
运行允许的安装生命周期脚本

所以不要在完全不信任的陌生项目里盲目安装。先看 README、package.json 的 scripts 和来源。

npm run dev 又是什么 ​

它不是 npm 内置了每个框架。npm 去 package.json 的 scripts 找 dev:

json
{
  "scripts": {
    "dev": "vite"
  }
}

然后执行这个项目安装的 Vite 命令。

npx 是什么 ​

npx 用来运行包提供的命令。常见:

bash
npx vite
npx create-vite

它可能运行本地已安装包,也可能临时获取远程包。运行陌生命令前确认包名、来源和版本,尤其不要随便执行 AI 提供的拼写相近包名。

pnpm 对应常见 pnpm exec 或 pnpm dlx,Yarn 也有自己的运行方式。

安装失败怎样判断 ​

command not found: pnpm ​

项目要求 pnpm,但电脑没有可用命令。先查看 pnpm 官方安装方式,不要改用 npm 逃避。

Cannot find module ​

可能依赖没安装、包没写入 package.json、导入路径错误或站错目录。

ERESOLVE 或 peer dependency 冲突 ​

两个包对依赖版本要求不兼容。不要第一反应使用强制参数;先确认框架和包版本是否匹配。

本地能运行,部署缺包 ​

可能只在电脑全局安装了某个工具,却没有记录进项目依赖;部署环境没有你的全局包。

官方参考 ​

项目根目录已有 pnpm-lock.yaml,AI 建议直接运行 npm install。第一步应该照做吗?

答案:不应该。先查看 README 和 packageManager 字段;已有 pnpm 锁文件通常应该使用 pnpm,避免生成第二份锁文件和不同依赖树。

写给想驾驭 AI,而不只是依赖 AI 的 Vibe Coder。