package.json 和 package-lock.json 有哪些区别和作用

182 阅读2分钟

package.json 是项目中的核心文件,用来声明项目的名称,版本号,脚本,依赖等等

我们在执行 npm install 的时候就会自动根据声明的依赖去 npm 仓库下载依赖并安装到项目的 node_modules 目录下,这样我们就可以在代码中使用 import xxx from 'module' 或者 require('module') 去引用依赖了。

下面是一个 package.json 简单示例

{
  "name": "my-project",
  "version": "1.0.0",
  "description": "test project",
  "author": "xxx",
  "scripts": {},
  "dependencies": {
    "vue": "^2.6.0",
    "cross-env": "~5.2.0",
    "element-ui": "*",
    "axios": "18.0.0"
  },
  "devDependencies": {
  }
}

我们看上述文件的依赖版本有四种

  • ~ 开头的版本会匹配最近的小版本依赖包,比如 ~1.2.3 会匹配所有 1.2.x 版本,但是不包括 1.3.0
  • ^ 开头的版本会匹配最新的次版本依赖包,比如 ^1.2.3 会匹配所有 1.x.x 的包,包括 1.3.0,但是不包括 2.0.0
  • * 这意味着安装最新版本的依赖包
  • 不带以上前缀的就是下载固定的版本号

而 package-lock.json 就是为了锁定版本号而出现的。当我们首次执行 npm install 的时候会根据上述规则去下载对应版本的依赖包,然后生成 package-lock.json 文件,这个文件记录了实际下载的版本,这样当我们把项目提交到 git 上后,其他人 clone 后执行 npm install , 由于存在 package-lock.json 文件,安装的时候会根据 package-lock.json 文件声明的版本去安装,这样就能保证每个人安装的依赖包版本都是一样的了。

为什么要保证版本一样呢,首先依赖包本身升级可能是没有问题的,但是可能会与现有代码库有兼容问题,也可能与其他依赖包有兼容问题,所以保证每个环境的版本一致是有必要的。如需升级需要经过测试在将 package-lock.json 提交到代码库,这样其他人重新拉取代码执行 npm install 就完成依赖的升级了