描述
package-lock 主要的作用是为了锁安装模块的版本号
当你npm install 的时候安装的依赖是最新的不一定是package内设置的版本,这样就有可能导致产生一些问题 (因为某些包只有特定的版本才能正常运行)(npm install ‘插件’@1.1.1;安装特定版本插件)
解决的问题
在npm 5.x 之前 可以运行 npm shrinkwrap
此时会生成一个 npm-shrinkwrap.json 文件, 此文件会锁定所有的依赖来源, 后期再执行 cnpm install 或者 npm install 都不会出错,包的版本会和 package.json 中定义的一样。 注意: 如果之后安装了其他包, npm-shrinkwrap.json 文件 不会自动更新,所以需要再次执行 npm shrinkwrap
在npm 5.x 之后会自动生成 package-lock.json 来解决这个问题
另外还可以解决依赖重复安装问题和冲突问题
因为从npm3开始
node_modules 就开始对依赖的扁平化处理方式 例如你的插件中也安装了相同插件,或者你所依赖的插件安装了不同版本你所依赖的其他插件
简介
最外面的两个属性 name 、version 同 package.json 中的 name 和 version ,用于描述当前包名称和版本。dependencies 是一个对象,对象和 node_modules 中的包结构一一对应,对象的 key 为包名称,值为包的一些描述信息:
- version:包版本 —— 这个包当前安装在 node_modules 中的版本
- resolved:包具体的安装来源integrity:包 hash 值,基于 Subresource
- Integrity 来验证已安装的软件包是否被改动过、是否已失效
- requires:对应子依赖的依赖,与子依赖的 package.json 中 dependencies的依赖项相同。
- dependencies:结构和外层的 dependencies 结构相同,存储安装在子依赖 node_modules 中的依赖包。这里注意,并不是所有的子依赖都有 dependencies 属性,只有子依赖的依赖和当前已安装在根目录的 node_modules 中的依赖冲突之后,才会有这个属性。
补充
- 符号^:表示安装不低于该版本的应用,但是大版本号需相同,例如:vuex: “^3.1.3”,3.1.3及其以上的3.x.x都是满足的。
- 符号~:表示安装不低于该版本的应用,但是大版本号和小版本号需相同,例如:vuex: "
^3.1.3",3.1.3及其以上的3.1.x都是满足的。
4. 无符号:无符号表示固定版本号,例如:vuex: “3.1.3”,此时一定是安装3.1.3版本。
不同npm版本下npm i的规则
package.json 锁的不是版本 是版本的范围,lock锁的是固定的版本范围
[版本号规范]
(https://semver.org/lang/zh-CN/)
按照规范只需要锁主版本号就可以^ 但总有一些开发者没有遵守或者没有注意,小版本号的改动导致插件不兼容。这个时候开发者2号npm i 的时候导致安装版本不一致,导致一些奇怪的问题
版本的优先层级指的是不同版本在排序时如何比较
1.0.0-alpha < 1.0.0-alpha.1 < 1.0.0-alpha.beta < 1.0.0-beta < 1.0.0-beta.2 < 1.0.0-beta.11 < 1.0.0-rc.1 < 1.0.0。
npm i 和 npm ci的区别
- npm i 按照package.json 内的 ^或~ 才下载对应的插件库的版本,并生成package-lock.json文件
- npm ci 删除node_modules 按照lock下载固定的版本的插件 如果没有lock文件不工作
npm ci 会比npm i 更加快速 因为不需要去处理^~各个插件的版本和各个插件的依赖问题