理解package.json和package-lock.json

265 阅读2分钟

package.json

1.package.json 是 npm 项目的基础配置文件,主要用于定义项目的元数据,如name(项目名)、version(版本号)、description(描述)、author(作者)、license(开源协议)、声明依赖项(dependencies:生产环境依赖、devDependencies:开发环境依赖)、scripts(配置脚本命令)等。它是项目的“入口配置”,几乎所有 npm 操作(安装、发布、共享)都依赖它。
2.package.json里面存储的包版本信息不是一个具体的版本,而是一个最优版本,也就是带^/~符号的。

  • ^ 兼容某个大版本(如:^1.1.5 ,表示>=1.1.5 <2.0.0,例如:1.1.6、1.2.6、1.8.6)
  • ~ 兼容某个小版本(如:~1.1.5,表示>=1.1.5 <1.2.0,例如:1.1.6、1.1.7、1.1.8)
  • 如果没有用^/~符号直接用1.1.5可以锁定当前库的版本,但是不能不能锁定该库底下的依赖,所以还是要引入package-lock.json

package-lock.json

package-lock.json(npm 5+ 自动生成)是 npm 的依赖版本锁定文件,主要用于解决“依赖安装不一致”的问题。它的核心作用是固定依赖树的精确版本,确保不同环境(开发机、测试机、生产机)安装的依赖完全一致。

1.首次安装依赖

执行 npm install 时,npm 会根据 package.json 解析依赖树,生成 package-lock.json 并记录所有精确版本。

2.记录完整的依赖树结构

它不仅记录顶层依赖,还会递归记录所有嵌套依赖(即依赖的依赖)的版本和来源。例如,若 react 依赖 scheduler@0.20.2,package-lock.json 会明确记录这一层级关系,避免因嵌套依赖版本波动导致的问题。

3.保证安装的可重复性

当执行 npm install 时,npm 会优先读取 package-lock.json 中的精确版本和下载地址,直接从指定源下载对应版本的包,而非根据 package.json 的范围重新解析。这确保了无论何时、何地安装,依赖树的结构和版本都完全一致。

4.更新依赖

若手动修改 package.json 中的依赖版本(如将 lodash 从 ^4.17.20 改为 ^4.17.21),或执行 npm update lodash,npm 会重新解析依赖树并更新 package-lock.json 中的版本和哈希值。

需要提交package-lock.json到项目仓库吗?

1. 如果是一个普通项目,是需要将package-lock.json提交到git的,它保证团队成员(开发、测试、运维)部署项目的依赖版本一致,减少因为依赖版本差异带来的细微bug。

2. 如果是开发一个给外部环境用的库,一般不需要提交package-lock.json文件,因为不使用package-lock的情况下,这个库就能够复用主项目已经加载过包,减少依赖重复和项目的体积。

如何查看项目安装的包版本

1.package-lock.json文件查找

2.node_modules文件夹查找,找到它自身的package.json,里面的version就是它的版本号

3. 使用命令,npm list --depth 0查看本地安装的所有包信息