【JSON】package.json与package-lock.json
执行npm install下载包的时候,项目根目录会有package.json与package-lock.json俩个文件,具体分别是做什么呢?下面简单记录以下:
为什么会有package-lock.json文件
记录每个依赖包的具体版本号,确保在不同的环境或机器上安装依赖包时,都会安装相同的版本,保证项目的一致性和可重复性。在团队协作和项目维护中,如果没有lock文件,可能在不同的环境中工作,如果没有lock文件版本锁定,可能会导致依赖冲突或不一致的问题,保证了项目的一致性和可重复性,也加快了执行npm install时的安装速度。
版本管理
在package.json文件中每个包都有个版本号,每隔版本号都是有大版本、小版本、修改版本组成;
比如:
"axios": "1.0.0"
=> axios只能安装1.0.0版本,大、小、修改版本都锁定,不能更新到更高版本。"axios": "~1.0.0"
=> axios只能安装1.0.x版本,大、小版本锁定,可以更新到1.0.x版本。"axios": "^1.0.0"
=> axios只能安装1.x.x版本,大版本锁定,不能更新到2.0.0版本。"@vant/area-data": "latest"
=> 默认安装最新版本
npm install时安装规则
- 如果只有package.json,运行npm i会根据它生成一个package-lock.json文件,这个文件相当于本次install的一个快照,不仅记录了package.json指明的直接依赖的版本,也记录了间接依赖的版本 ;
- 如果package-lock.json的版本在package.json的版本指定范围内,即使package.json中有新版本,执行npm install也会根据package-lock.json下载;
- 如果手动修改package.json的版本,且和lock文件中版本不兼容,那么执行npm install时,lock文件会更新到兼容package.json的版本;
package-lock.json什么时候会变
- 首次npm install,package-lock会自动生成;
- 包位置修改,从devDependenices移动到dependencies,部分包的dev字段有可能会变成true;
- 镜像源registry修改;
- npm install 添加或者npm uninstall删除包
- 更新某个包的版本;
尽量不要手动修改版本号,可能会导致一些错误,尽量使用npm install 添加或者npm uninstall删除包,这样会自动更新package.json与package-lock.json文件
package-lock.json文件的主要构成
- "name":指定包的名称,与 package.json 文件中的 "name" 字段相对应。
- "version":指定包的版本号,与 package.json 文件中的 "version" 字段相对应。
- "lockfileVersion":package-lock.json 文件的格式版本号,用于确定文件的结构和兼容性。
- "requires": 是否使用requires来追踪模块的依赖关系
- "dependencies":一个对象,包含项目所依赖的其他包及其版本号。这些依赖项可以是直接依赖项,也可以是间接依赖项(被其他依赖项所依赖)。并不是所有的子依赖都有 dependencies 属性,只有子依赖的依赖和当前已安装在根目录的 node_modules 中的依赖冲突之后, 才会有这个属性。 这可能涉及嵌套情况的依赖管理。
- "devDependencies":一个对象,列出了在开发过程中所需的包及其版本号。这些包通常用于测试、构建和开发工具。
- "dev":表示该模块是否为顶级模块的开发依赖或者是一个的传递依赖关系
- "resolved":依赖包的安装源(可以理解为下载地址)
- "integrity":每个包的完整性校验值,用于确保下载的包的完整性和安全性。它是使用哈希算法计算得出的唯一标识符,用于验证包的内容是否被篡改。
- "subdependencies":一个对象,包含每个包的子依赖项。这包括子依赖项的名称、版本号和其他子依赖项的信息。
- "dependenciesMeta":一个对象,包含每个包的元数据。这些元数据可以包括版本范围、源、分辨率策略和其他信息。
- "engines":一个对象,包含该包需要使用的引擎,以及引擎的版本范围,通常只有node、npm