你选pnpm还是npm

91 阅读2分钟

我选了pnpm。

npm的原罪:node_modules大且慢

  • 幽灵依赖

    • npm模式下的node_modules是扁平化的。
      • 何为扁平化:比如你的代码里没有明确在package.json中声明过的包(B),但如果A包引用了B,B也会被提升到node_modules根目录。 image.png
    • 这种扁平化的node_modules除了大,还很容易造成“幽灵依赖”。比如你引用了B,程序没有报错,但是有一天A升级了抛弃了B,你的代码就会意想不到的崩溃了。
  • 磁盘空间的巨大浪费

    • 如果你的电脑上有N个项目,都引用了项目依赖antd,你的磁盘上会存10份一模一样的代码
    • image.png
  • 安装速度慢

    • 虽然npm有缓存机制,但是因为仍然需要做大量的I/O操作,去复制、移动这些文件。当项目较大时也会严重影响到安装速度

pnpm如何对症下药的:硬链接与符号链接结合

  • 告别幽灵依赖
    • 在pnpm的node_modules里,根目录只有package.json里明确声明的依赖。
      • 还是上边的例子A和B的关系,在pnpm模式下,B会被放入.pnpm/目录里,然后通过符号连接的方式链接到A包的node_modules里。 image.png
    • 节约磁盘空间
      • pnpm会在你的电脑上创建一个“全局内容寻址存储区”,一般在主目录.pnpm-store里。(可以通过命令行pnpm store path 查看)
      • 当你的项目需要antd时,pnpm不会再复制到你的node_modules里,而是通过链接的方式,从全局仓库链接一份。几乎不再占用磁盘空间。 image.png
    • 极速安装
      • 因为大部分依赖都是通过“链接”的方式实现的,不需要复制,所以pnpm在安装时大大减少了磁盘I/O操作。在有缓存的情况下,几乎是“秒级”的。

总结

pnpm通过创新的依赖管理方式,解决了npm和yarn的一些问题,特别是在处理大型依赖(如antd)时更加高效。它的硬链接和符号链接策略不仅节省了磁盘空间,还提高了安装速度,同时严格的依赖树结构也避免了常见的依赖问题。