一:package.json、node_modules、package-lock.json是什么?

  • package.json里面定义的是版本范围(比如^1.0.0),具体跑npm install的时候安的什么版本,要解析后才能决定,这里面定义的依赖关系树,可以称之为逻辑树(logical tree)。产生背景:在拷贝项目时不需要拷贝node_modules文件夹,如果拷贝的话会很慢,那么如何解决安装的依赖与原项目依赖及版本保持一致呢?①package.json项目描述文件,保存在项目的根目录下面,记录了当前的项目信息,用npm init -y命令生成。②拷贝项目后,直接执行npm install会自动安装package.json 文件中记录的依赖。
  • node_modules文件夹下才是npm实际安装的确定版本的东西,这里面的文件夹结构我们可以称之为物理树(physical tree)。node_modules文件夹中存放许多的模块文件及插件。安装过程中有一些去重算法,所以你会发现逻辑树结构和物理树结构不完全一样。
  • package-lock.json可以理解成对结合了逻辑树和物理树的一个快照(snapshot),里面有明确的各依赖版本号,实际安装的结构,也有逻辑树的结构。其作用:①记录模块与模块之间的依赖关系 ②锁定包的版本 ③记录项目所依赖第三方包的树状结构和包的下载地址,加快重新安装的下载速度。

npm5以前,没有package-lock.json这个文件,npm5以后才加入这个文件的。当安装包的时候,npm都会生成或者更新package-lock.json这个文件。npm5以后的版本安装包不需要加–save参数,它会自动保存依赖信息。

二:为什么会出现 package-lock.json 呢?

为什么会有 package-lock.json 文件呢?这个我们就要先从 package.json 文件说起了。
package.json的不足之处:
npm install 执行后,会生成一个 node_modules 树,在理想情况下, 希望对于同一个 package.json 总是生成完全相同 node_modules 树。在某些情况下,确实如此。但在多数情况下,npm无法做到这一点。有以下两个原因:
1)某些依赖项自上次安装以来,可能已发布了新版本 。比如:A 包在团队中第一个人安装的时候是 1.0.5 版本,package.json 中的配置项为 A: ‘^1.0.5’;团队中第二个人把代码拉下来的时候,A 包的版本已经升级成了1.0.8,根据 package.json 中的 semver-range version 规范,此时第二个人 npm install 后 A 的版本为 1.0.8;可能会造成因为依赖版本不同而导致的 bug;
2)针对 1)中的问题,可能有的小伙伴会是把 A 的版本号固定为 A: ‘1.0.5’ 不就可以了吗?但是这样的做法其实并没有解决问题,比如 A 的某个依赖在第一个人下载的时候是 2.1.3 版本,但是第二个人下载的时候已经升级到了 2.2.5 版本,此时生成的node_modules 树依旧不完全相同 ,固定版本只是固定项目自身第一层依赖的版本,被项目间接依赖的包的版本则无法固定。。
针对 package.json 不足的解决方法:
为了解决上述问题以及 npm 3 的问题,在 npm 5.0 版本后,npm install 后都会自动生成一个 package-lock.json 文件 ,当包中有 package-lock.json 文件时,npm install 执行时,如果 package.json 和 package-lock.json 中的版本兼容,会根据 package-lock.json 中的版本下载;如果不兼容,将会根据 package.json 的版本,更新 package-lock.json 中的版本,然后再去下载实际包。这样做,第一可以已保证 package-lock.json 中的版本兼容 package.json;第二也保证了package-lock.json中的版本号是和node_module下的包实际的版本号是一致的。
package-lock.json文件锁定所有模块的版本号,包括主模块和所有依赖子模块。当你执行npm install的时候,node从package.json文件读取模块名称,从package-lock.json文件中获取版本号,然后进行下载或者更新。因此,正因为有了package-lock.json文件锁定版本号,所以当你执行npm install的时候,node不会自动更新package.json文件中的模块,必须用npm install packagename(自动更新小版本号)或者npm install packagename@x.x.x(指定版本号)来进行安装才会更新,package-lock.json文件中的版本号也会随着更新。
附:当package.json与package-lock.json都不存在,执行"npm install"时,node会重新生成package-lock.json文件,然后把node_modules中的模块信息全部记入package-lock.json文件,但不会生成package.json文件,此时,你可以通过"npm init --yes"来初始化生成package.json文件。

三:package-lock.json 文件的作用

在团队开发中,确保每个团队成员安装的依赖版本是一致的,确定一棵唯一的 node_modules 树。
node_modules 目录本身是不会被提交到代码库的,但是 package-lock.json 可以提交到代码库,如果开发人员想要回溯到某一天的目录状态,只需要把 package.json 和 package-lock.json 这两个文件回退到那一天即可。
由于 package-lock.json 和 node_modules 中的依赖嵌套完全一致,可以更加清楚的了解树的结构及其变化。在安装时,npm 会比较 node_modules 已有的包,和 package-lock.json 进行比较,如果重复的话,就跳过安装 ,从而优化了安装的过程。
package-lock.json 文件的结构
package-lock.json 文件中的 name、version 与 package.json 中的 name、version 一样,描述了当前包的名字和版本,dependencies 是一个对象,该对象和 node_modules 中的包结构一一对应,对象的 key 为包的名称,值为包的一些描述信息, 根据 package-lock-json官方文档 (官方文档),主要的结构如下:
①version :包版本,即这个包当前安装在 node_modules 中的版本
②resolved :包具体的安装来源
③integrity :包 hash 值,验证已安装的软件包是否被改动过、是否已失效
④requires :对应依赖的依赖,与子依赖的 package.json 中 dependencies 的依赖项相同
⑤dependencies :结构和外层的 dependencies 结构相同,存储安装在子依赖 node_modules 中的依赖包
(需要注意的是,并不是所有的子依赖都有 dependencies 属性,只有子依赖的依赖和当前已安装在根目录的 node_modules 中的依赖冲突之后,才会有这个属性)

四:为什么说package-lock.json提升下载速度:

package-lock.json这个文件会自动保存node_modules中所包含的信息(版本,下载地址),这样在重新npm
install的时候速度就可以提升。

五:package-lock.json锁定版本:

从文件名来看,一个lock称之为锁。这个lock是用来锁定版本的,如果项目依赖了1.1.1版本,在没有package-lock.json文件的情况下,重新npm
install其实会下载最新的版本,而不是
1.1.1,我们的目的是希望可以锁住1.1.1这个版本,所以这个package-lock.json文件的另一个作用是锁定版本,防止自动升级新版。

六:自npm 5.0版本发布以来,npm i的规则发生了三次变化:

  • npm 5.0.x 版本,不管package.json怎么变,npm i 时都会根据lock文件下载。但是这个就出现了明明手动改了package.json,为什么不升级包。
  • npm 5.1.0版本后 npm install 会无视lock文件 ,去下载最新的npm。.但是出现了控诉“为什么package-lock 被忽视了的问题”。
  • npm 5.4.2版本,规则变成了,大致意思是,①如果改了package.json,且package.json和lock文件不同,那么执行npm i时npm会根据package中的版本号以及语义含义去下载最新的包,并更新至lock。②如果两者是同一状态,那么执行npm i都会根据lock下载,不会理会package实际包的版本是否有新。

参考:
npm安装包的原理
npm模块安装的机制

npm install生成的package-lock.json文件有什么作用?相关推荐

  1. qt中生成含有中文的json文件和解析json文件

    提要 生成的json文件在程序加载解析时出现上述错误,究其原因是生成json文件过程中编码问题.qt编译器默认的编码格式为utf-8,而windows一般为gbk编码,所以就需要在生成本地json文件 ...

  2. qt中生成含有中文的json文件,读取含有中文的json文件

    引言 之前将变量保存并在本地生成json文件,由于其中含有中文,导致生成的json文件出现乱码,或者就是生成的json文件没有乱码,但是读取生成的json文件时出现乱码,不能正常解析json. 示例 ...

  3. Electron npm install node.lib : fatal error LNK1106: 文件无效或磁盘已满

    在npm install的时候.发现明明路径下有和这个lib.但是一直报错.处理办法 直接把node-gyp这路径去掉.通过node-gyp rebuild重新在下即可. ps:我是在用nvm控制no ...

  4. 更新json文件_忽略packagelock.json?

    背景 近期经常遇到包版本导致的问题,之前使用过 package-lock.json 来约束版本,但总是导致一些问题或者冲突,没有多研究原因,直接在 .gitignore 把它忽略了,当时倒是没啥问题, ...

  5. npm package.json文件中的依赖关系,devDependencies和peerDependencies之间有什么区别?

    本文翻译自:What's the difference between dependencies, devDependencies and peerDependencies in npm packag ...

  6. 为什么“ npm install”会重写package-lock.json?

    本文翻译自:Why does "npm install" rewrite package-lock.json? I just recently upgraded to npm@5. ...

  7. npm中package-lock.json的作用:npm install安装时使用

    简单理解: XYZ 的格式 对应为: 主版本号.次版本号.修订号,版本号递增规则如下: 主版本号:当你做了不兼容的 API 修改, 次版本号:当你做了向下兼容的功能性新增, 修订号:当你做了向下兼容的 ...

  8. package.json文件||项目依赖||开发依赖

    package.json文件 node_modules文件夹的问题 package.json文件的作用 项目描述文件,记录了当前项目信息,例如项目名称.版本.作者.github地址.当前项目依赖了哪些 ...

  9. npm install含义 及vue安装启动项目时报错解决及vue建项目时各文件间的依赖关系...

    全局安装vue-cli,使用命令npm install -g vue-cli. 下载模板代码,使用命令vue init webpack my-project,之后会有一些询问,按需填写即可. 最后会看 ...

  10. package.json文件是个什么东东?

    package.json文件 一.node_modules文件夹的问题 文件夹以及文件过多过碎,当我们将项目整体拷贝给别人的时候,,传输速度会很慢很慢. 复杂的模块依赖关系需要被记录,确保模块的版本和 ...

最新文章

  1. random函数用法_Python函数式编程:从入门到走火入魔
  2. cgdb基本用法总结
  3. php中的eq的含义,jquery,_jQuery中的eq(0)到底是什么意思??详情请看下面代码!,jquery - phpStudy...
  4. 超标量体系结构_CPU体系结构以及指令流水原理
  5. WPS for Linux(ubuntu)字体缺失解决办法(转)
  6. WPF 中如何使用第三方控件 ,可以使用WindowsFormsHost 类
  7. spark写mysql优化简书_spark——通过jdbc连接数据库中遇到的问题
  8. 用redis实现消息队列(实时消费+ack机制)【转】
  9. 【机器视觉】 dev_open_dialog算子
  10. Django从理论到实战(part16)--指定默认的参数
  11. uiview生命周期
  12. Super-palindrome 模拟+思维
  13. 腾讯云服务器安装AMH控制面板
  14. 手顺解决 Foxmail7.2 无法搜索“主题”和“全文”,只能搜“发件人”和“收件人” 问题
  15. 利用EViews做截面数据的线性回归分析
  16. 苹果和亚马逊因疑似侵犯云端同步功能专利而被提起美国337调查
  17. 基于Flash的开源网页播放器使用方法(FlowPlayer/AdobePlayer)
  18. TSINGSEE青犀视频开发AI人脸对比如何输出多个对比相似度的人脸?
  19. C# 实现eval,支持任意个数、任意基本类型的参数
  20. 关于marked数组处理

热门文章

  1. CentOS系统下文件夹目录结构及其作用
  2. python+opencv 批量修改视频分辨率
  3. js实现数组扁平化的6种方法
  4. 网页前端第五次培训(JS的一些基本使用)
  5. l13Nginx创建负载均衡
  6. Pray for 京阿尼——愿逝者安息,伤者早日康复
  7. html post 加号,post提交数据空格被编码成加号的解决办法
  8. 【机器学习】AI去马赛克工具(图像修复)
  9. sdut - 英文金曲大赛
  10. Docker Registry搭建私有镜像仓库(干货)http/https