npm install生产与开发依赖和package-lock.json

912 阅读5分钟

文章目录


前言

今天在摸鱼时看到一篇文章,讲到了pnpm这个包管理工具,完全不知道是啥。突然发现npm我都不怎么了解呢,想了解一下。
记得在项目开发时,从仓库clone代码到本地后,会有一个package-lock.json文件,只知道这个文件是用来锁定依赖包版本的,是怎么用来锁定版本的,这个文件在本地修改了要不要提交呢,探讨探讨一下。

这里也推荐两篇很好很好的文章,对于npm依赖安装以及缓存机制讲的很详细。

juejin.cn/post/707165…
juejin.cn/post/706084…

环境

我使用的测试环境是npm的v8+版本,不同的大版本好像有不同的处理方式。
在这里插入图片描述

package-lock.json

此文件是用来锁定依赖包版本的,具有这种功能的文件有3个,当这3个文件放在一个项目中时,优先级的话按下图中顺序从下往上依次变高,优先级低的自动忽略。
在这里插入图片描述
我们所引入的依赖包是别人发布到npm中的,但是package-lock.json文件禁止被发布。
在这里插入图片描述
我在一篇文章上看到对这个文件禁止发布所做的解释:
在这里插入图片描述
所以我们引入的依赖包中都是没有这个package-lock.json文件的!这就是关键。下面演示一下package-lock.json文件是如何变化的以及其作用。

演示案例1

首先通过npm install follow-redirects@1.0.0安装一个固定版本的依赖包,下图中可以看到两个文件中的具体信息。
在这里插入图片描述
可能会有疑惑为什么如ms与debug依赖是怎么安装的呢,这是因为安装的follow-redirects依赖包中package.json中dependencies生产依赖中有debug依赖包,同理,debug依赖包的生产依赖中也有ms依赖包,所以全部安装了。

这里也可以看到下载的follow-redirects依赖包中没有package-lock.json文件
在这里插入图片描述
在这里插入图片描述
可能还有疑问为什么只有生产环境的依赖被安装了,开发环境依赖没被安装。这个原理我也怎么清楚,在后面会讲解一下自己的理解。

接着下一步,npm install axios,我是经过测试知道axios是依赖follow-redirects依赖包的,所以这里安装axios。
在这里插入图片描述
可以看到package-lock.json中的follow-redirects1.0.0版升级到了1.14.9版,同时node_modules中的结构也变了。
这是因为package.json中的"follow-redirects": "^1.0.0",这是版本向上兼容的,axios的package.json中的是"follow-redirects": "^1.14.8",肯定会安装最新版1.14.9,而1.14.9又满足"follow-redirects": "^1.0.0",所以我自己的理解是相当于执行了updata更新操作。
而如果这里修改一下,将"follow-redirects": "^1.0.0"修改为"follow-redirects": "~1.0.0",使之不满足升级为最新版,结果如下:
在这里插入图片描述
由于版本冲突导致竟然安装了两个follow-redirects依赖包版本,放在了不同的地方。我的理解是依赖包在node_modules中是扁平化放置的,当依赖包中的生产依赖与本地项目的依赖有相同依赖包时,但是版本有冲突,依赖包中的生产依赖会安装到该依赖包的node_modules文件夹中。

安装在axios下的follow-redirects依赖包是1.14.9版本,我不知道package-lock.json文件中的这一块有没有锁定版本的功能,所以我手动改成了1.14.8版本,并把integrity属性删除,重新npm install
在这里插入图片描述

然后我发现具有锁定版本功能!还是安装的1.14.8版本。
在这里插入图片描述

好像有一点明白了,我在clone仓库代码到本地执行npm install,就算所依赖的依赖包中的生产依赖有版本升级,但是package-lock.json文件中已经锁定了一个版本,还是会按照package-lock.json文件中的版本进行依赖包下载。

还有开发环境的问题,建议多人开发一个项目时,大家所安装的node版本与npm版本要保持一致,可以使用版本控制器如nvm-windows进行切换。在相同开发环境中,引入新的依赖包导致package-lock.json文件被修改,这个被修改的文件提交至仓库不会有任何问题。

一定不要手动修改package-lock.json文件。

生产与开发环境依赖

下面就思考一下为啥引入npm发布的包时,包中有生产依赖dependencies和开发依赖devDependencies时只会下载dependencies中的依赖,我们在本地npm install项目时dependencies和devDependencies中的依赖都会下载。

我自己的理解是本地执行npm install,就是在开发环境中,处于本地开发阶段。开发环境中dependencies和devDependencies中的依赖都会下载。

而引入npm包时,我们拿别人的包去进行产出了,处于生产环境。生产环境中只会下载dependencies中的依赖。

可以进行试一下,npm官网上有这么一段话:
在这里插入图片描述
我在本地直接执行npm install,安装结果如下所示:
在这里插入图片描述

我在本地执行 npm install --production,就是在生产环境下安装依赖,安装结果如下所示:
在这里插入图片描述
懂了吧,模模糊糊的懂了就行了。

总结

npm里涉及到的知识点很多很多,感觉自己只会简单的使用,慢慢的去了解还要走好远的路。