npm dedupe


本文作者: jsweibo

本文链接: https://jsweibo.github.io/2019/04/27/npm-dedupe/

摘要

本文主要讲述了:

  1. 背景
  2. 作用

正文

npm 使用扁平化的策略来管理依赖的文件结构。

示例:

1
2
3
4
5
6
7
{
"name": "example",
"version": "1.0.0",
"dependencies": {
"a": "^1.0.0"
}
}
1
2
3
4
5
6
7
{
"name": "a",
"version": "1.0.0",
"dependencies": {
"c": "^1.0.0"
}
}

在执行npm install a命令时,npm 实际做了下面的事情:

  1. a@1.0.0放在example/node_modules/
  2. 因为example/node_modules/不存在c@1.0.0,于是把c@1.0.0也放在example/node_modules/
  3. a@1.0.0的相关信息写入package.jsonpackage-lock.json

某一天,example的作者添加了b@1.0.0依赖。

1
2
3
4
5
6
7
8
{
"name": "example",
"version": "1.0.0",
"dependencies": {
"a": "^1.0.0",
"b": "^1.0.0"
}
}
1
2
3
4
5
6
7
{
"name": "b",
"version": "1.0.0",
"dependencies": {
"c": "^2.0.0"
}
}

此时,example的作者在执行npm install命令时,npm 实际做了下面的事情:

  1. b@1.0.0放在example/node_modules/
  2. 因为example/node_modules/已经存在c@1.0.0,为了避免和c@2.0.0冲突,于是把c@2.0.0放在example/node_modules/b/node_modules/
  3. b@1.0.0的相关信息写入package.jsonpackage-lock.json

某一天,example的作者添加了c@3.0.0依赖。

1
2
3
4
5
6
7
8
9
{
"name": "example",
"version": "1.0.0",
"dependencies": {
"a": "^1.0.0",
"b": "^1.0.0",
"c": "^3.0.0"
}
}

此时,example的作者在执行npm install命令时,npm 实际做了下面的事情:

  1. 因为example/node_modules/已经存在c@1.0.0,为了避免和c@3.0.0冲突,于是把c@1.0.0移动到example/node_modules/b/node_modules/
  2. c@3.0.0放在example/node_modules/
  3. c@3.0.0的相关信息写入package.jsonpackage-lock.json

某一天,a@1.0.0的作者升级了依赖并发布了新版本。

1
2
3
4
5
6
7
{
"name": "a",
"version": "1.1.0",
"dependencies": {
"c": "^2.0.0"
}
}

此时,example 的作者在执行npm update命令时,npm 实际做了下面的事情:

  1. a@1.1.0替换a@1.0.0
  2. 因为a@1.1.0的同级目录已经存在c@1.0.0,为了避免和c@2.0.0冲突,于是把c@2.0.0放在example/node_modules/a/node_modules
  3. a@1.1.0的相关信息写入package-lock.json

在更新完成后,example/node_modules下存在 1 个c@3.0.0example/node_modules/a/node_modulesexample/node_modules/b/node_modules各存在 1 个相同的c@2.0.0

某一天,example的作者卸载了c@3.0.0依赖。

在执行npm uninstall c命令时,npm 实际做了下面的事情:

  1. 删除example/node_modules/c/
  2. 把c@3.0.0的相关信息从package.jsonpackage-lock.json里删除。

在卸载完成后,example/node_modules/a/node_modulesexample/node_modules/b/node_modules各存在 1 个相同的c@2.0.0

很容易发现,如果把 2 个相同的c@2.0.0移动到example/node_modules/下,就能节约 1 个c@2.0.0的磁盘空间。

于是npm dedupe应运而生。

作用

npm dedupe命令将项目中冗余的依赖向上合并同类项,使项目依赖的文件结构变得更加扁平化。

参考资料

本文作者: jsweibo

本文链接: https://jsweibo.github.io/2019/04/27/npm-dedupe/


本文对你有帮助?请支持我


支付宝
微信