npm update/dedupe更新依赖

当安装依赖的时候,由于时间差异,可能会安装上同一依赖的不同版本,导致一个npm包存在多个版本。如:

  1. 三月之前,我们安装了A包,它依赖于postcss@^8.4.10
  2. 现在,我们安装了一个B包,它依赖于postcss@^8.4.28

如果在同一时间安装,则只会装一个 postcss@8.4.39 (假如现在8.4.39是最新版)。但是如果安装时间不同的话

  1. A 依赖于postcss@^8.4.10三个月前 装包,安装 postcss@8.4.10,因为当时最新版本是8.4.10,并写入 lockfile
  2. B 依赖于 postcss@^8.4.28现在安装最新版本,安装postcss@8.4.29,并写入lockfile

此时就会出现两个版本的 postcss,将会导致一系列问题:

  1. 安装体积变大
  2. postcss 中的编译流程将要重复跑两次,而编译是极其耗时的
  3. 如果重复版本为 react/lodash 等页面依赖内容,则会增加打包体积

npm update

npm update 将会使 package.json/package-lock.json 中的依赖升级到符合其版本号范围的最新版本

当我们使用npm update升级后,只会出现了一个依赖postcss@8.4.39

具体package-lock.jsondiff差异如下

www.diffchecker.com/IhHkjSSH/

但是package.json中的信息并没有同步更新,要想将新的版本号重新写入package.json中,需要npm update --save,这样依赖才会都更新成8.4.39

json 复制代码
// package.json

"dependencies": {
  "postcss": "^8.4.39"
}

如此,便可以通过 npm update 减少重复依赖安装,提升安装速度,以及减小包体积。

pnpm update

pnpm update 与 npm 不同的是,它将把 package.json 中的依赖升级至符合该版本号范围的最新版本,并重新写入 package.json。效果类似于 npm update --save

npm dedupe

虽然 npm update 可以解决大部分依赖安装问题,但仍然有一部分问题。比如:

  1. postcss 最新版本为 postcss@8.4.39
  2. A 依赖于 postcss@^8.4.10,三个月前装包,安装 postcss@8.4.10,并写入 lockfile
  3. B 依赖于 postcss@8.4.28,三个月后装包,安装 postcss@8.4.28,并写入 lockfile

此时,即便使用 npm update 进行升级,仍然会出现两个 npm 包的情况

  • A 依赖于 postcss@^8.4.10,依赖升级后为 postcss@8.4.39
  • B 依赖于 postcss@8.4.28,依赖升级后为 postcss@8.4.28

此时,可以使用 npm dedupe 将二者均升级为符合二者 npm 包范围的共同版本的 postcss@8.4.28

具体diff信息如下:

www.diffchecker.com/T22XN4KU/

npm install/pnpm install

如以上依赖,postcss@^8.4.10postcss@8.4.28 在同一时间安装会如何呢?

  • npm install 将会下载符合 npm 包依赖的最新版本号,此时会存在两个 postcss,需要手动 npm dedupe
  • pnpm install 可理解为自带 pnpm dedupe 过程,只会存在一个 postcss

下面是pnpm-lock.yaml文件,可以发现只有8.4.28这一个版本的依赖

yaml 复制代码
lockfileVersion: '6.0'

settings:
  autoInstallPeers: true
  excludeLinksFromLockfile: false

importers:

  .: {}

  packages/A:
    dependencies:
      postcss:
        specifier: ^8.4.10
        version: 8.4.28

  packages/B:
    dependencies:
      postcss:
        specifier: 8.4.28
        version: 8.4.28

packages:

  /nanoid@3.3.7:
    resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
    engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
    hasBin: true
    dev: false

  /picocolors@1.0.1:
    resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==}
    dev: false

  /postcss@8.4.28:
    resolution: {integrity: sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==}
    engines: {node: ^10 || ^12 || >=14}
    dependencies:
      nanoid: 3.3.7
      picocolors: 1.0.1
      source-map-js: 1.2.0
    dev: false

  /source-map-js@1.2.0:
    resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==}
    engines: {node: '>=0.10.0'}
    dev: false

参考链接

  1. # npm update/dedupe
  2. Demo链接如下,推荐自己尝试:github.com/chenwll/npm...
相关推荐
F2E_Zhangmo1 小时前
基于cornerstone3D的dicom影像浏览器 第三章 拖拽seriesItem至displayer上显示第一张dicom
前端·javascript·cornerstone·cornerstone3d·cornerstonejs
gnip6 小时前
Jst执行上下文栈和变量对象
前端·javascript
excel6 小时前
🐣 最简单的卷积与激活函数指南(带示例)
前端
醉方休7 小时前
npm/pnpm软链接的优点和使用场景
前端·npm·node.js
拉不动的猪7 小时前
简单回顾下Weakmap在vue中为何不能去作为循环数据源,以及替代方案
前端·javascript·vue.js
醉方休7 小时前
PNPM库离线安装方案
npm
How_doyou_do7 小时前
数据传输优化-异步不阻塞处理增强首屏体验
开发语言·前端·javascript
奇舞精选7 小时前
超越Siri的耳朵:ASR与Whisper零代码部署实战指南
前端·人工智能·aigc
奇舞精选7 小时前
Nano Banana 如何为前端注入 AI 控制力
前端·aigc
一支鱼7 小时前
基于 Node.js 的短视频制作神器 ——FFCreator
前端·node.js·音视频开发