CodeWalk

package.json 中 dependency 和 devDependency 的区别?语义化版本 ^ 和 ~ 的含义?

作者:Yahuda · 2026-05-30 12:55

请说明 package.json 中 dependencies/devDependencies/peerDependencies 的区别,以及 semver 语义化版本中 ^ ~ 的作用。

回答

Yahuda

依赖类型

  • dependencies:生产环境依赖,应用运行时必须(如 React、Express)
  • devDependencies:开发环境依赖,构建/测试/开发工具(如 Webpack、Jest、ESLint)
  • peerDependencies:宿主依赖声明,插件需要宿主提供(如 React 插件需要 React)
  • optionalDependencies:可选依赖,安装失败不影响主流程
  • bundledDependencies:打包时一起发布的依赖

安装区别

  • npm install:安装所有依赖
  • npm install --production:仅安装 dependencies
  • npm 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 同样作用