node中的package.json和package-lock.json

491 阅读3分钟

一、前言

  如果使用npm来管理依赖包的同学可能会经常遇见package和package-json这两个文件,但是可能并不是每个人都知道这两个文件的含义,今天我们来简单介绍一下这两个文件。首先我们先来介绍一下语义化版本控制

二、语义化版本

  什么是语义化版本?我们使用npm引入的包版本都是0.1.93或者0.1.97,这就是语义化版本,这几个数字可不是随随便便写的,那么他们到底都是什么意思呢?其实这三个数字分别依照以下规则:   版本格式:主版本号.次版本号.修订号,版本号递增规则如下:

  • 主版本号:当你做了不兼容的 API 修改
  • 次版本号:当你做了向下兼容的功能性新增
  • 修订号:当你做了向下兼容的问题修正

  那么使用这种规则有什么意义呢?想象一下,如果你的项目依赖了很多的包,这些包不可能是完美无缺的,他的维护者肯对会对其进行更新。那么,你怎么知道你使用的是包的哪个版本?你怎么知道你在升级包的版本之后原有代码还能运行?这就需要使用版本控制。如果我们依赖了一个2.0.0版本的包,在包更新时,只要是2.x.x的包我们都应该可以直接升级,因为他的更新是向下兼容的。同时,如果我们想更新一个大版本,那势必就要对程序进行修改。就好比reac15升react16,势必要对原代码进行一些修改。更多的细节可以点击我查看。下面我们开始介绍package和package-lock。

三、package和package-lock文件

  我们首先从package讲起,package中有很多信息,这次我们只关注devDependencies/dependencies,他们代表了开发环境和生产环境我们依赖的包,可以看到,这里就使用的语义化版本来表示包的版本。细心的同学可能会注意到,有的版本之前还会有^,~这样的符号,这又是代表什么意思呢?其实,包依赖有下面三种表示方法:

  • 兼容模块新发布的补丁版本:~16.2.0,可以更新至16.2.x、16.2
  • 兼容模块新发布的小版本、补丁版本:^16.2.0,可以更新至16.x.x、16
  • 兼容模块新发布的大版本、小版本、补丁版本:*,可以更新至任意版本

  不过我们一般是不会使用*来表示的,因为当升级大版本的时候肯定需要我们调整之前的代码来对它进行兼容,不能直接就进行升级。搞清楚package之后,那么这个package-lock又是个什么东西?想象这样一种场景,我们在本地发现了一个bug,自己不能搞定,所以找了大佬来帮忙。大佬从github上将你的项目源码clone到本地之后,npm install,然后运行,发现没问题啊。这又是怎么回事?可能是因为你在本地依赖的包是1.1.0,而大佬重新npm install之后包已经升级了,变成了1.1.5。所以现在你能猜到package-lock文件是干什么的了吗?对,就是锁定包的版本,为了保证在不同的电脑上安装的版本都是一致的。其实在不同的node版本中npm install的规则还不太一样,具体的规则如下:

  • npm 5.0.x版本,不管package.json怎么变,npm install时都会根据package-lock.json下载;
  • npm 5.1.0版本后,npm install会无视package-lock.json,下载最新的版本;
  • npm 5.4.2版本后,如果package.json与package-lock.json不一致,npm install会根据package.json去下载版本,并更新package-lock.json;如果package.json与package-lock.json一致,npm install会根据package-lock.json去下载。

三、结语

  好了,相信现在你对于package和package-lock两个文件已经有一定的了解了,这篇文章到这里也就结束了,大家一起加油!