pnpm

更先进的 npm 包管理工具

Node.js 模块的问题

  • 安装速度慢
  • 磁盘占用多
  • 磁盘上存在大量重复文件
  • 每次安装版本不一致

早期 npm 方案的问题

  • 全局包缓存:解决重复下载问题
  • Hoisting:模块扁平化至根目录,解决重复文件
  • Lock 文件:固定版本号

1.x 的改进

扁平化未解决的问题

  • 不同项目内还是有大量重复文件
  • 扁平化引入的新问题
    • 版本不确定性
    • 幽灵依赖 Phantom dependencies
    • NPM 包分身 NPM doppelgangers

依赖版本不确定性

幽灵依赖 Phantom dependencies

  • 举个例子
    • 你在项目中用了 webpack,webpack 依赖了 lodash
    • 你使用了 lodash 但未在 package.json 声明依赖
    • 由于 Hoisting,代码可以正常运行
  • 一段时间之后
    • webpack 不再依赖 lodash 了
    • 或者 webpack 依赖的 lodash 版本变了

NPM doppelgangers

NPM 分身的问题

  • 重复文件导致磁盘占用
  • 包体积变大
  • 破坏单例模式

pnpm 的方案

  • 硬盘每个包的每个版本只存一份(Store)
  • 创建从 Store 到项目 node_modules 的链接
  • 保持 node_modules 树型结构
  1. 为什么需要 .pnpm 目录?
  2. 软连接和硬连接区别?

问题

  • npm 包的加载机制
  • Plug'n'Play (yarn 2+ & pnpm)

可以不要 node_modules 吗?

benchmark

Performant Node Package Manager

pnpm 社区生态

  • 15.4K Github star
  • 知名用户
    • Microsoft
    • Bytedance
    • Vue 生态
  • 避免混用包管理器 (pnpm only)
  • corepack: Node.js' manager of package managers

使用 pnpm

扩展阅读

Thank You!

Questions?

Made with Slides.com