不知道在项目中有没有被npm
整崩溃吧,反正我是有过,而且最近正好又遇到了🤷🏻♀️
❓❓❓
为什么要提起npm
呢,是因为最近在更新依赖包的时候遇到了无法解释的问题😓
事情的起因是这样的:原本项目(vue2.6.14
,使用到了pinia2.0.0-rc.10
)中使用了vue-grid-layout
的2.3.12
的版本,但是由于某些操作不是很兼容,所以就想着降低到2.3.3
来解决问题。万万没想到到的是这次降级导致项目无法正常启动,遇到了以下情况
降级之后启动项目,出新了警告⚠️
在浏览器中查看
删除node_modules
,package-lock.json
,重新npm install
npm install --legacy-peer-deps
根据错误提示需要--force
或者--legacy-peer-deps
,😖😖😖😖
还有一种是项目中用到的websocket包没有被下载下来
(没有截图)
npm来背锅 😏
为什么要找npm
来背锅呢,因为我也无法解释😓😓😓
和同事对比了node
的版本,发现其实错不了多少,最低的就是我的了v16.3.0
(对应的npm
的版本是7.15.1
),然后又对比了依赖包降低前后的变化,发现package-lock.json
的结构发生了变化(之前项目最初应该是用的node14
,npm6
),那就只能合理的怀疑是npm7
的更新导致了依赖包之间的关系发生了一些变化,从而引发了一系列的问题😭😭😭
(虽然我的node版本升级了有一段时间了,但是并没有遇到问题,可能你的也升级了也并没有问题)
npm7
那既然推测是npm7
的原因,就看一下它有哪些变化吧
github.blog/2020-10-13-…
重大变更
一、Workspaces
:
npm CLI
的一组功能,可支持从单个顶级软件包中管理多个软件包
二、 自动安装 peerDependencies
在 npm 7
之前,开发人员需要自己管理和安装peerDependencies
。新的peer dependencies
可确保在 node_modules
树中peerDependencies
的位置处或之上找到有效匹配的 peerDependencies
。
在之前的版本中,peer dependencies
冲突会有版本不兼容的警告,但并不会抛出错误。在npm7
中,如果存在无法自动解决的依赖冲突,将会阻止安装。
可以通过使--force
选项重新安装来绕过冲突,或者选择--legacy-peer-deps
选项peer dependencies
的依赖关系(类似于npm4-6)。
由于许多包都依赖宽松的peer dependencies
解析,npm7
将打印警告并解决包依赖树中存在的大多数同级冲突,请使用--strict-peer-deps
选项。
三、 package-lock v2
和对yarn.lock
的支持:
新的 package-lock
格式将释放确定性可复制构建的功能,并且包括 npm
完全构建软件包树所需的一切。在忽略 npm 7
的 yarn.lock
文件之前,npm cli
现在可以将 yarn.lock
用作软件包元数据和分辨率指南的来源。
npm7
会修改lock文件格式,会兼容npm6的用户
在以前的版本中,yarn.lock
文件被忽略,npm CLI
现在可以使用yarn.lock
作为package元数据和依赖的来源。如果存在yarn.lock
,则npm还将使它与package的内容保持最新。
使用npm7
并且在有v1
的lockfile
的项目中执行npm install
,则会把lockfile
文件的内容取代成v2
的格式。如果想避免这种行为,可以通过执行npm install --no-save