我选了pnpm。
npm的原罪:node_modules大且慢
-
幽灵依赖
- npm模式下的node_modules是扁平化的。
- 何为扁平化:比如你的代码里没有明确在package.json中声明过的包(B),但如果A包引用了B,B也会被提升到node_modules根目录。
- 何为扁平化:比如你的代码里没有明确在package.json中声明过的包(B),但如果A包引用了B,B也会被提升到node_modules根目录。
- 这种扁平化的node_modules除了大,还很容易造成“幽灵依赖”。比如你引用了B,程序没有报错,但是有一天A升级了抛弃了B,你的代码就会意想不到的崩溃了。
- npm模式下的node_modules是扁平化的。
-
磁盘空间的巨大浪费
- 如果你的电脑上有N个项目,都引用了项目依赖antd,你的磁盘上会存10份一模一样的代码
-
安装速度慢
- 虽然npm有缓存机制,但是因为仍然需要做大量的I/O操作,去复制、移动这些文件。当项目较大时也会严重影响到安装速度
pnpm如何对症下药的:硬链接与符号链接结合
- 告别幽灵依赖
- 在pnpm的node_modules里,根目录只有package.json里明确声明的依赖。
- 还是上边的例子A和B的关系,在pnpm模式下,B会被放入.pnpm/目录里,然后通过符号连接的方式链接到A包的node_modules里。
- 还是上边的例子A和B的关系,在pnpm模式下,B会被放入.pnpm/目录里,然后通过符号连接的方式链接到A包的node_modules里。
- 节约磁盘空间
- pnpm会在你的电脑上创建一个“全局内容寻址存储区”,一般在主目录.pnpm-store里。(可以通过命令行pnpm store path 查看)
- 当你的项目需要antd时,pnpm不会再复制到你的node_modules里,而是通过链接的方式,从全局仓库链接一份。几乎不再占用磁盘空间。
- 极速安装
- 因为大部分依赖都是通过“链接”的方式实现的,不需要复制,所以pnpm在安装时大大减少了磁盘I/O操作。在有缓存的情况下,几乎是“秒级”的。
- 在pnpm的node_modules里,根目录只有package.json里明确声明的依赖。
总结
pnpm通过创新的依赖管理方式,解决了npm和yarn的一些问题,特别是在处理大型依赖(如antd)时更加高效。它的硬链接和符号链接策略不仅节省了磁盘空间,还提高了安装速度,同时严格的依赖树结构也避免了常见的依赖问题。