一文解析package.json和package-lock.json

1. package.json是什么?

在node.js项目中,package.json文件是非常重要的一个文件,它是Node.js中用来描述和定义项目的依赖关系和配置信息的文件。package.json文件记录了项目所需的插件和依赖,帮助开发人员方便的安装、升级和卸载依赖包,以及让程序员很容易的找到项目的各项信息。

在package.json中定义了项目的名称、版本、依赖、开发环境依赖、打包命令、测试命令等配置,这些都能够较完整地描述一个项目,并帮助程序开发者在开发和发布中更好的管理和控制自己的项目。

这里是一个典型的package.json文件的例子:

{

"name": "my-awesome-app",

"version": "0.1.0",

"private": true,

"dependencies": {

"react": "^16.8.0",

"react-dom": "^16.8.0",

"express": "^4.17.1",

"mongoose": "^5.7.5"

},

"devDependencies": {

"webpack": "^4.35.2",

"babel-loader": "^8.0.6",

"nodemon": "^1.18.10"

},

"scripts": {

"start": "node app.js",

"dev": "nodemon app.js",

"build": "webpack"

}

}

1.1 示例说明:

"name": 表示项目的名称,这个名称可用于npm install或者远程仓库的访问。

"version": 表示当前的版本号。

"private": 如果设置为true,这个项目将不会被发布到npmjs。一般建议私有项目打上这个标记,避免意外发布私有代码。

"dependencies": 依赖的模块,可以理解为项目运行必须的模块,示例中列出了react、react-dom、express和mongoose,开发者在保证项目正常运行的情况下可以在这个分区更新对应的模块,比如将express从4.17.1更新到4.17.2。

"devDependencies": 开发依赖模块,列出的是只用于开发的模块,一般是开发和测试过程会用到的模块,而不是用于项目的运行的模块,示例中列出了webpack、babel-loader和nodemon等依赖。

"scripts": 脚本命令,除了安装依赖,开发者可以使用这个分区定义一些其他的命令,以方便使用。比如示例中的start、dev、build等命令就非常方便,在控制台输入npm run start就可以启动app.js。

1.2 package.json的生成

Node.js推荐使用npm进行模块管理和发布,通过npm init命令可以在当前目录生成一个package.json文件,也可以通过npm init –y命令来快速生成默认的package.json文件,在项目开发中使用npm来添加或删除依赖时,package.json也会随之更新。

示例:生成一个默认的package.json文件

npm init -y

执行完成后,当前目录下会生成一个默认的package.json文件,然后程序员就可以在这个文件基础上添加描述依赖和配置的信息了。

2. package-lock.json是什么?

在项目开发中,我们使用npm安装依赖的时候会生成一个package-lock.json文件,这个文件记录了整个项目中的依赖树,包括每个依赖项的app-npm-registry信息、下载地址、版本号等。

package-lock.json文件是自动生成的,以npm 5.0.0版本为例,执行npm install的时候就会生成一个package-lock.json文件,npm会把每个包的version值锁定在特定的版本号,这样就可以确保不会因为其他版本的包而引发问题,因此,它对于珂以帮助管理您的项目的依赖项非常重要。

2.1 为什么需要package-lock.json?

在项目开发过程中,如果不使用package-lock.json,npm install的时候会根据package.json文件中的版本号进行安装依赖。在不同的机器、环境中执行npm install可能会安装不同版本的依赖,这对于项目的稳定性是非常不利的,尤其在一些关键组件发生变化的情况下,就有可能导致Bug的产生,严重甚至会导致项目失控。

package-lock.json则可以解决这个问题。

2.2 package-lock.json文件内容解析

package-lock.json文件中,每个依赖的层级信息都会写到锁文件中,格式类似于:

"dependencies": {

"foo": {

"version": "1.2.3",

"resolved": "https://registry.npmjs.org/foo/-/foo-1.2.3.tgz",

"integrity": "sha512-f3nOx5BnoHOxy6iuoClXzqF144i27z2sW28KhRkRWRBs7Qx+gZmbet+Loojfg759WaQiUCRmcG3+Z/vNpCx3rw==",

"requires": {

"bar": "^2.0.0"

}

},

"bar": {

"version": "2.1.0",

"resolved": "https://registry.npmjs.org/bar/-/bar-2.1.0.tgz",

"integrity": "sha512-mp8jK1FFc3bNPxrzhV0yNtR8fMdLODMB6YNqXL7xQFekFqtJTPdDLyHNY7C6pnv/+EjRcS51kOms9pH/h7y6ew=="

}

}

其中,每个module都包含以下信息:

version: 模块的版本号。

resolved: 模块的下载地址。

integrity: 表示模块的完整性检验值。

requires: 表示依赖的其他模块和它们的版本信息。

这些信息均由npm自动读取和保存,因此使用npm安装依赖的时候,我们不必考虑这些信息的具体细节。

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

package.json和package-lock.json两个文件都是npm中的文件,用于描述项目依赖信息,两者有很多相似之处,但也有一些明显的区别。

3.1 对比区别

文件名不同:package.json和package-lock.json文件名不同。

文件类型不同:package.json是JSON文件,用于描述项目的依赖关系和配置信息,package-lock.json是自动生成的文件,它记录了整个项目中的依赖树,包括每个依赖项的app-npm-registry信息、下载地址、版本号等。

生命周期不同:package.json中的dependencies部分列出的是项目需要的模块,package-lock.json文件记录了实际依赖的模块,保证开发者在做了改动之后,持续紧跟每个依赖包与项目的结构变更,但不包括devDependencies部分和npm run scripts的部分。所以,package.json文件提供的是开发和测试阶段使用的依赖项,而package-lock.json文件则记录了在开发环境中实际的依赖项,包括其版本号、hash值以及安装源,以避免不同平台生成的依赖项不同。

3.2 总结:

在开发过程中,package.json文件是必不可少的。它让开发者能够很方便地管理项目中的所需依赖,并且帮助程序员控制版本,同步开发环境等。

package-lock.json的出现,解决了依赖随意变动(依赖版本变动、依赖地信息变动、依赖hash值变动等)所带来的问题。因为我们可以通过它记录并同步依赖的行为,从而避免在代码分发和运行的时候因不同依赖产生的问题。在使用npm install时,npm会根据这个package-lock.json文件来进行依赖的升级和安装等相关操作。通过package-lock.json文件,保证每次依赖的安装效果是高度一致的。