你升级npm7了么

554 阅读3分钟

不知道在项目中有没有被npm整崩溃吧,反正我是有过,而且最近正好又遇到了🤷🏻‍♀️

❓❓❓

为什么要提起npm呢,是因为最近在更新依赖包的时候遇到了无法解释的问题😓

事情的起因是这样的:原本项目(vue2.6.14,使用到了pinia2.0.0-rc.10)中使用了vue-grid-layout2.3.12的版本,但是由于某些操作不是很兼容,所以就想着降低到2.3.3来解决问题。万万没想到到的是这次降级导致项目无法正常启动,遇到了以下情况

降级之后启动项目,出新了警告⚠️

image.png

在浏览器中查看

image.png

删除node_modulespackage-lock.json,重新npm install

image.png

npm install --legacy-peer-deps

根据错误提示需要--force或者--legacy-peer-deps,😖😖😖😖

image.png

还有一种是项目中用到的websocket包没有被下载下来

(没有截图)

npm来背锅 😏

为什么要找npm来背锅呢,因为我也无法解释😓😓😓

和同事对比了node的版本,发现其实错不了多少,最低的就是我的了v16.3.0(对应的npm的版本是7.15.1),然后又对比了依赖包降低前后的变化,发现package-lock.json的结构发生了变化(之前项目最初应该是用的node14npm6),那就只能合理的怀疑是npm7的更新导致了依赖包之间的关系发生了一些变化,从而引发了一系列的问题😭😭😭
(虽然我的node版本升级了有一段时间了,但是并没有遇到问题,可能你的也升级了也并没有问题)

npm7

那既然推测是npm7的原因,就看一下它有哪些变化吧
github.blog/2020-10-13-…

github.blog/2021-02-02-…

重大变更

一、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并且在有v1lockfile的项目中执行npm install,则会把lockfile文件的内容取代成v2的格式。如果想避免这种行为,可以通过执行npm install --no-save