本文作者: jsweibo
本文链接: https://jsweibo.github.io/2019/04/27/npm-dedupe/
摘要
本文主要讲述了:
- 背景
- 作用
正文
npm 使用扁平化的策略来管理依赖的文件结构。
示例:
1 | { |
1 | { |
在执行npm install a
命令时,npm 实际做了下面的事情:
- 把
a@1.0.0
放在example/node_modules/
里 - 因为
example/node_modules/
不存在c@1.0.0
,于是把c@1.0.0
也放在example/node_modules/
里 - 把
a@1.0.0
的相关信息写入package.json
和package-lock.json
里
某一天,example
的作者添加了b@1.0.0
依赖。
1 | { |
1 | { |
此时,example
的作者在执行npm install
命令时,npm 实际做了下面的事情:
- 把
b@1.0.0
放在example/node_modules/
里 - 因为
example/node_modules/
已经存在c@1.0.0
,为了避免和c@2.0.0
冲突,于是把c@2.0.0
放在example/node_modules/b/node_modules/
里 - 把
b@1.0.0
的相关信息写入package.json
和package-lock.json
里
某一天,example
的作者添加了c@3.0.0
依赖。
1 | { |
此时,example
的作者在执行npm install
命令时,npm 实际做了下面的事情:
- 因为
example/node_modules/
已经存在c@1.0.0
,为了避免和c@3.0.0
冲突,于是把c@1.0.0
移动到example/node_modules/b/node_modules/
里 - 把
c@3.0.0
放在example/node_modules/
里 - 把
c@3.0.0
的相关信息写入package.json
和package-lock.json
里
某一天,a@1.0.0
的作者升级了依赖并发布了新版本。
1 | { |
此时,example 的作者在执行npm update
命令时,npm 实际做了下面的事情:
- 用
a@1.1.0
替换a@1.0.0
- 因为
a@1.1.0
的同级目录已经存在c@1.0.0
,为了避免和c@2.0.0
冲突,于是把c@2.0.0
放在example/node_modules/a/node_modules
里 - 把
a@1.1.0
的相关信息写入package-lock.json
在更新完成后,example/node_modules
下存在 1 个c@3.0.0
。example/node_modules/a/node_modules
和example/node_modules/b/node_modules
各存在 1 个相同的c@2.0.0
。
某一天,example
的作者卸载了c@3.0.0
依赖。
在执行npm uninstall c
命令时,npm 实际做了下面的事情:
- 删除
example/node_modules/c/
- 把c@3.0.0的相关信息从
package.json
和package-lock.json
里删除。
在卸载完成后,example/node_modules/a/node_modules
和example/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/
本文对你有帮助?请支持我
- 本文链接: https://jsweibo.github.io/2019/04/27/npm-dedupe/
- 版权声明: 除非另有说明,否则本网站上的内容根据署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。