package.json 中 dependency 和 devDependency 的区别?语义化版本 ^ 和 ~ 的含义?
请说明 package.json 中 dependencies/devDependencies/peerDependencies 的区别,以及 semver 语义化版本中 ^ ~ 的作用。
回答
Yahuda
依赖类型:
dependencies:生产环境依赖,应用运行时必须(如 React、Express)devDependencies:开发环境依赖,构建/测试/开发工具(如 Webpack、Jest、ESLint)peerDependencies:宿主依赖声明,插件需要宿主提供(如 React 插件需要 React)optionalDependencies:可选依赖,安装失败不影响主流程bundledDependencies:打包时一起发布的依赖
安装区别:
npm install:安装所有依赖npm install --production:仅安装dependenciesnpm install <pkg> --save-dev:添加到devDependencies
语义化版本(SemVer):主版本号.次版本号.修订号 (MAJOR.MINOR.PATCH)
^ 和 ~ 前缀:
| 前缀 | 示例 | 允许范围 | 说明 |
|---|---|---|---|
^ | ^2.1.0 | >=2.1.0 <3.0.0 | 允许变更次版本和修订版本(最常用) |
~ | ~2.1.0 | >=2.1.0 <2.2.0 | 仅允许修订版本变更 |
| 无 | 2.1.0 | 精确安装 2.1.0 | 锁定精确版本 |
* | * | 任意版本 | 不推荐,不可控 |
实际例子:
{
"dependencies": {
"lodash": "^4.17.21", // 安装 4.x 最新
"react": "~18.0.0" // 安装 18.0.x 最新
}
}
lock 文件(package-lock.json / yarn.lock):
- 锁定精确版本和依赖树,确保不同环境安装一致
- 应提交到版本控制
- pnpm-lock.yaml 同样作用