本文作者: 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) 进行许可。