likes
comments
collection
share

package.json和package-lock.json的区别

作者站长头像
站长
· 阅读数 39

前言

今天正在写代码,同学突然问我,package.jsonpackage-lock.json有什么区别,这两个文件有什么用?我愣住了...

模块化开发

经过这么多年的发展,现在的前端开发基本上都是模块化开发了。而nodenpm则可以很方便的管理项目所依赖的模块。我们在使用npm init初始化项目的时候就会生成一个package.json文件,package.json用来描述项目及项目所依赖的模块信息。

package.json

This document is all you need to know about what's required in your package.json file. It must be actual JSON, not just a JavaScript object literal.

A lot of the behavior described in this document is affected by the config settings described in config.

翻译过来就是:本文档是您需要了解 package.json 文件中所需内容的全部内容。它必须是实际的 JSON,而不仅仅是 JavaScript 对象文字。本文档中描述的许多行为都受 config 中描述的配置设置的影响。

package.json记录了项目的配置信息,包括名称、版本、许可证等数据,也会记录所需的各种模块,包括 执行依赖,和开发依赖,以及scripts字段。

package-lock.json

关于package-lock.json的官方解释如下:

package-lock.json is automatically generated for any operations where npm modifies either the node_modules tree, or package.json. It describes the exact tree that was generated, such that subsequent installs are able to generate identical trees, regardless of intermediate dependency updates.

翻译过来就是:对于npm修改node_modulespackage.json的任何操作,都会自动生成package-lock.json。它准确的描述了当前项目npm包的依赖树,以便在后续的安装中能够生成相同的树,而不管中间依赖项如何更新。

用人话就是,package-lock.json对整个依赖树进行版本固定的,package-lock.json会记录各个模块的版本信息和下载路径。这样,在任何时候,我们再对项目进行npm install的时候,npm发现如果项目中有package-lock.json文件,就会根据package-lock.json里的内容来处理和安装依赖而不再根据package.json

"dependencies": {
 "react": "^16.8.0",
}

package.json文件只能锁定大版本,即版本号的第一位,并不能锁定后面的小版本,如果没有package-lock.json,每次npm install都是拉取的该大版本下的最新的版本。比如上面的react16.8.0版本,假如有了最新版16.8.1,如果没有package-lock.json,在npm install的时候,就会自动更新为16.8.1。很多时候,为了项目的稳定性,我们一般不会随意升级依赖包,因此使用package-lock.json文件,当你每次安装一个依赖的时候就锁定在你安装的这个版本,不会升级依赖包。

参考文档:

docs.npmjs.com/cli/v9/conf…

docs.npmjs.com/cli/v9/conf…

package.json中库的版本号详解(^和~区别)