解决npm与yarn痛点:幽灵依赖与依赖分身

前言

在现代前端开发流程中,包管理工具扮演着至关重要的角色,其中npmyarn是两个非常流行的JavaScript包管理工具。虽然它们为开发者提供了极大的便利,但也存在一些痛点,特别是关于“幽灵依赖(Phantom Dependencies)”和“依赖分身(Dependency Duplication)”。

image.png

幽灵依赖(Phantom Dependencies)

举例

假设: 引入依赖a,a依赖又依赖于b,逻辑上则结构就应该是

> -node_module/a
> -node_module/a/node_module/b

但是在扁平化展开后则变成了

>  -node_module/a
>  -node_module/b

此时我们的package.json中只有a,却可以引用b

在某些情况下,项目的依赖树中可能出现所谓的“幽灵依赖”,这是指那些在项目的package.json文件中没有直接声明,但是因为被其他依赖引入而存在项目中的依赖。这种依赖的主要问题在于:

  1. 难以追踪:因为这些依赖没有直接声明,在尝试了解项目使用了哪些包及其版本时,这会造成混淆。
  2. 版本冲突:如果两个模块分别依赖同一个包的不同版本,而npm或yarn解决方案导致某些模块实际使用的版本与其依赖的版本不一致,可能会造成意料之外的问题。

尽管yarn通过yarn.lock锁定了版本以及通过一定的策略减少了此类问题,但仍然不能完全避免。

依赖分身(Dependency Duplication)

举例

> -node_module/a
> -node_module/a/node_module/b@1.0.0
> -node_module/c
> -node_module/c/node_module/b@2.0.0

这时,依赖a和c分别依赖b的不同版本。

不论此刻提升@1.0.0的版本到根目录层级还是提升@2.0.0的版本到根目录层级,都会出现一个问题,将出现一个重复的依赖拷贝,这个依赖拷贝就叫作:依赖分身。

依赖分身指的是在项目的node_modules目录中,同一个依赖包存在多个不同版本的情况。这种情况可能发生的原因包括:

  1. 不同的依赖要求:项目中不同的模块可能依赖同一个包的不同版本。
  2. 扁平化机制的失败:虽然yarn和较新版本的npm尝试通过依赖扁平化(将依赖尽可能安装在顶层node_modules下)来减少重复依赖的问题,但并不是所有情况都能完全扁平化,特别是当存在不兼容版本时。

这会导致以下几个问题:

  • 增加项目大小:同一个包的多个版本会占用更多的磁盘空间。
  • 运行时不确定性:可能导致难以预料的行为,因为不同的代码部分可能会使用同一个包的不同版本。

解决方案和建议

  • 对于“幽灵依赖”,建议定期使用npm lsyarn list来审查项目的依赖树,确保了解所有实际使用的依赖及其来源。
  • 避免“依赖分身”的一个方法是在更新或安装新依赖时认真评估版本要求,尽可能地统一依赖的版本。对于npm,可以使用npm dedupe尝试减少重复的依赖。
  • 使用现代化的工具和方法(如使用最新版本的npmyarn以及合理配置package.json)可以在一定程度上缓解这些问题。
  • 使用pnpm 高效前端开发:解密pnpm的存储与链接

最终,无论是使用npm还是yarn,对依赖管理的合理规划和持续维护都是确保项目稳定性和性能的关键。

相关推荐

  1. yarn 会从npm config registry 下载依赖

    2024-07-10 11:04:05       32 阅读
  2. 简单认识 node 包的幽灵依赖

    2024-07-10 11:04:05       37 阅读
  3. npm yarn 命令比较

    2024-07-10 11:04:05       42 阅读
  4. Golang:依赖注入wire

    2024-07-10 11:04:05       29 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 11:04:05       99 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 11:04:05       107 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 11:04:05       90 阅读
  4. Python语言-面向对象

    2024-07-10 11:04:05       98 阅读

热门阅读

  1. 达梦数据库主备手动切换

    2024-07-10 11:04:05       28 阅读
  2. ffmpeg滤镜创建过程

    2024-07-10 11:04:05       30 阅读
  3. stm32使用单通道规则组ADC

    2024-07-10 11:04:05       30 阅读
  4. HTML 学习指南:从入门到精通

    2024-07-10 11:04:05       29 阅读
  5. 经导管二尖瓣修复系统市场全面解析与未来展望

    2024-07-10 11:04:05       28 阅读
  6. 大众点评商家电话采集软件分享 解析爬虫工具

    2024-07-10 11:04:05       25 阅读
  7. Python 使用正则提取字符串

    2024-07-10 11:04:05       22 阅读
  8. 专业课笔记——(第十二章:文件的读写)

    2024-07-10 11:04:05       27 阅读
  9. lvs集群

    2024-07-10 11:04:05       26 阅读
  10. Perl 语言入门学习

    2024-07-10 11:04:05       28 阅读
  11. 大模型/NLP/算法面试题总结3——BERT和T5的区别?

    2024-07-10 11:04:05       38 阅读