下列信息参考其他文章 原文地址
package.json文件
它是项目的配置文件,常见的配置有配置项目启动、打包命令,声明依赖包等。package.json文件是一个JSON对象,该对象的每一个成员就是当前项目的一项设置。
主版本号
当新版本无法兼容基于前一版本的代码时,则提高主版本号;
次版本号
当新版本新增了功能和特性,但仍兼容前一版本的代码时,则提高次版本号;
修订号
当新版本仅仅修正了漏洞或者增强了效率,仍然兼容前一版本代码,则提高修订号;
最优版本
默认情况下,npm install xxx --save下载的都是最新版本,并且会在package.json文件里登记一个最优版本号。
^ 兼容某个大版本
^意味着下载的包可能会是更高的次版本号或者修订版本号。(也就是主版本不能变,次版本、修订版本可以随意变)。
~ 兼容某个次版本
而~意味着有可能会有更高的修订版本号。(也就是主版本、次版本不能变,修订版本可以随意变)。
package-lock.json 详解
package.json里面的包版本不是一个具体的版本,而是一个最优版本。而package-lock.json里面定义的是某个包的具体版本,以及包之间的层叠关系。
一个 package-lock.json 里面的每个依赖主要是有以下的几部分组成的:
Version: 依赖包的版本号
Resolved: 依赖包的安装源(其实就是可以理解为下载地址)
Intergrity: 表明完整性的 Hash 值
Dev: 表示该模块是否为顶级模块的开发依赖或者是一个的传递依赖关系
requires: 依赖包所需要的所有依赖项,对应依赖包 package.json 里 dependencices 中的依赖项
dependencices: 依赖包 node_modeles 中依赖的包(特殊情况下才存在)。并不是所有的子依赖都有 dependencies 属性,只有子依赖的依赖和当前已安装在根目录的 node_modules 中的依赖冲突之后, 才会有这个属性。 这可能涉及嵌套情况的依赖管理。
假设我们的项目依赖A、B、C三个包,并且B包又依赖特定版本的C包,所以B包就会有dependencices,那么我们项目的整个node_modules的目录结构如下
node_modules
A.package
B.package
node_modules
C.package
C.package
那什么情况下package.json和package-lock.json里面的版本号一致呢?
当package.json里面不再使用最优版本,而是一个特定有效版本,也就是版本号前不带修饰符,这样package.json和package-lock.json里面的版本号才是一致的。