package.json VS package-lock.json

164 阅读2分钟

什么是package.json

package.json文件记录当前项目中所需要的包信息(包名、版本号等)。

image.png

什么是package-lock.json

package-lock.json记录当前状态下安装的各个npm package的具体来源和版本号、模块下载地址、及这个模块用到的依赖。首次安装依赖包时会创建package-lock.json。

为什么需要package-lock.json

  1. 锁定版本号,防止自动升级新版本
  2. 删除node_module目录时,想通过npm install 恢复所有包时,提升下载速度。

如何生成packge.json与package-lock.json

  1. 生成package.json => npm init -y
  2. 生成package-lock.json => npm install --package-lock-only

npm安装包的方式

  1. npm 安装包分为本地安装和全局安装。安装使用npm install
  2. 本地安装的包分devDependencies开发依赖和dependencies生产依赖
  3. 如果想要安装的包放在开发依赖,npm install --save-dev或npm install -D
  4. 如果想要安装的包放在生产依赖,npm install --save或npm install -S

npm install 发生了什么

npm install.png

npm ci 又发生了什么

npm ci 类似于 npm install ,旨在自动化环境。

  • 该项目必须有package-lock.json文件;
  • 如果package-lock.json与package.json依赖项不匹配,npm ci 则将报错,而不是更新 package-lock;
  • npm ci 只能一次安装整个项目,如果node_modules已经存在,将在npm ci 开始安装之前自动删除;
  • npm ci 不会写入package.json

npm 版本号

npm 默认所有的Node包都使用语义化版本号。每个版本号形如1.2.1,由三部分组成:

  • 主版本号:当新版本无法兼容基于前一版本的代码时,则主版本号加1
  • 次版本号:当新版本新增了功能与特性,但兼容前一版本时,次版本加1
  • 修订号:当新版本仅仅修正了漏洞或者提高效率,仍兼容前一版,则修订号加1

版本符号定义

  1. 波浪号:安装时不改变主版本号与次要版本号
  2. 插入号:安装时不改变主版本号
  3. latest: 安装最新版本

例如:

{
    "react""^18.2.0",              //  插入符号 ^18.2.0 :匹配 18.X.X 的最新版本。
    "react-dom""~18.2.0"      //  波浪符号 ~18.2.0 :匹配 18.2.X 的最新版本。
    "react-refresh": "0.11.0"     //  固定版本 0.11.0 : 匹配 0.11.0, 不会更新版本。
}