主流 nodejs 包管理器 pnpm vs bun vs npm vs yarn 简单横评

前端

我最近一直在写前端项目,使用的环境也从原本的 Node.js 切换到 bun,感受到了飞一般的体验。

今天要维护一下 StarBlog Vue Admin 项目时,又得安装一次依赖,于是突发奇想,想要看看不同包管理器的空间占用如何,所以有了这篇文章的测试。

本文着重测试 node_modules 的空间占用情况

测试环境

  • 操作系统: Windows10 22H2 10.0.19045

  • 测试项目: StarBlog Vue Admin

  • Node.js环境: v20.18.1

这是一个 Vue2 的管理后台项目,可以很好代表一些旧前端项目。

使用的分析空间命令是:

powershell 复制代码
"{0:N2} MB" -f ((Get-ChildItem -Recurse -Force .\node_modules | Measure-Object -Property Length -Sum).Sum / 1MB)

测试结果

包管理器 node_modules 占用空间
pnpm 🏆 205.36 MB (最省)
npm 209.02 MB
yarn 213.42 MB
bun 234.13 MB (最占)

测试下来,令我比较惊讶的是,曾几何时还是人人嫌弃的 npm 现在已经这么好了,无论是速度还是空间占用,都有不错的竞争力👍,看来我真的太久没用 npm 了😂(大人,时代变了😄

PS: 对了,这里面 pnpm dev 无法正常启动项目,有一堆报错,推测是版本不兼容,降级 node 版本或许能解决了,但我懒得折腾了。🥱

小结

  • pnpm 的"硬链接 + 全局 store"机制果然在空间占用上最强,符合预期。
  • npm / yarn 在单项目下差异不大,空间表现接近。
  • bun 虽然在速度上通常领先,但在这个测试里,反而是最占磁盘的 ------ 这也说明了它目前在"去重/节省空间"上的优化还不如 pnpm,甚至不如 npm。

分析

项目依赖结构的影响

  • Vue2 项目依赖相对固定,包体量不会像 Vue3 + Vite 那种动辄几百上千小包的组合。
  • 在这种情况下,npm 的冗余问题不明显,所以它和 yarn / pnpm / bun 在空间占用上差距很小(200 MB 左右,都在同一量级)。
  • pnpm 的硬链接优化,在"依赖重复多的场景"才能拉开更大差距(比如 monorepo、多项目复用依赖时)。单一项目时,优势就被"压缩"了。

Node.js 20 的改进

  • 从 Node.js 16 开始,npm 默认版本已经是 npm 8+ / 9+,它的性能和磁盘效率都提升了不少。
  • 以前大家吐槽 npm 慢、空间大,是 npm 6/7 时代的体验。现在 npm 在单项目场景下其实完全不"拉胯"。
  • 这就是为什么我会觉得:"npm 并没有传说中那么慢,占用空间也不算大"。

安装速度 vs 空间占用

  • bun:安装速度快是它的绝对优势,但空间优化机制不如 pnpm,所以磁盘占用最高。
  • pnpm:安装速度快,空间省,但在"单项目"里领先不大,要多个项目共享依赖时才能完全发挥。
  • npm:在 Node.js 20 的优化下,速度已经不算慢,空间占用也优化过,和 yarn 处于一个水平。
  • yarn (classic):相比 npm 没太大优势了,现在更多人转向 yarn berry(v2+),但那一套对 Vue2 老项目可能兼容性堪忧。

结论

  • 单项目场景:npm/yarn/pnpm/bun 差异其实很小,选谁都够用。
  • 多项目 / monorepo 场景:pnpm 的空间优势会爆炸性放大,npm/yarn/bun 会逐渐膨胀。
  • 极限速度需求:bun 是最快的,但代价是占用更大。
相关推荐
程序设计实验室2 个月前
视频中台解决方案:组织树组件+多路视频直播界面开发
web前端·项目完成小结
牧码岛3 个月前
Web前端之隐藏元素方式的区别、Vue循环标签的时候在同一标签上隐藏元素的解决办法、hidden、display、visibility
前端·css·vue·html·web·web前端
牧码岛5 个月前
Web前端之Vue+Element实现表格动态不同列合并多行、localeCompare、forEach、table、push、sort、Map
前端·javascript·elementui·vue·web·web前端
little_kid_pea7 个月前
网站上的图片无法使用右键“图片另存为”
web前端·图片下载
程序设计实验室8 个月前
StarBlog博客Vue前端开发笔记:(4)使用FontAwesome图标库
web前端·starblog-vue
程序设计实验室8 个月前
StarBlog博客Vue前端开发笔记:(3)SASS与SCSS
web前端·starblog-vue
程序设计实验室9 个月前
StarBlog博客Vue前端开发笔记:(2)页面路由
web前端·starblog-vue
程序设计实验室9 个月前
StarBlog博客Vue前端开发笔记:(1)准备篇
web前端·starblog-vue
.NET快速开发框架9 个月前
一文搞懂flex(弹性盒布局)
c#·.netcore·web前端·开发技术·rdif·rdiframework.net