前端

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

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

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

测试环境

  • 操作系统: Windows10 22H2 10.0.19045

  • 测试项目: StarBlog Vue Admin

  • Node.js环境: v20.18.1

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

使用的分析空间命令是:

"{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 是最快的,但代价是占用更大。

主流 nodejs 包管理器 pnpm vs bun vs npm vs yarn 简单横评的更多相关文章

  1. nodejs的包管理器npm和cnpm

    http://www.ydcss.com/archives/18 3.npm介绍 3.1.说明:npm(node package manager)nodejs的包管理器,用于node插件管理(包括安装 ...

  2. nodejs,python,sublime和Eclipse的包管理器

    Python的包管理器叫pip. 首先安装Python运行环境Python 3.7.0:https://www.python.org/downloads/release/python-370/ Pyt ...

  3. Node.js包管理器Yarn的入门介绍与安装

    FAST, RELIABLE, AND SECURE DEPENDENCY MANAGEMENT. 就在昨天, Facebook 发布了新的 node.js 包管理器 Yarn 用以替代 npm .咱 ...

  4. 你需要知道的包管理器(Package Manager)

    最近我花了一点时间关注了在不同系统之中所用到的包管理器(Package Manager) .最开始的时候,我是在使用Linux操作系统时,对这种工具以及它背后的想法深深迷恋住了:这真是自由的软件世界. ...

  5. 【转】包管理器Bower详细讲解

      包管理器Bower   今天自己用Angular写东西的时候,下载了Angular-seed项目,发现需要用到bower,之前也使用过,没有仔细了解,今天趁机了解到一些. bower的官网地址:  ...

  6. Bower => 前端开发也有包管理器

    摘要: 一直以来npm,pip等各种包管理器好像都和前端开发没什么太大关系,当然因为nodejs的原因可能感觉npm会亲切一些,不过终归不是针对客户端的包管理工作,所以Bower的出现确实让人眼前一亮 ...

  7. 前端开发bower包管理器

    Bower 是 twitter 推出的一款包管理工具,基于nodejs的模块化思想,他可以很好的帮助你帮你解决js的依赖管理,比如jquery angular bootstrap 等等. 可以很方便的 ...

  8. node包管理器

    NPM小结   nodejs的出现,可以算是前端里程碑式的一个事件,它让前端攻城狮们摆脱了浏览器的束缚,踏上了一个更加宽广的舞台.前端的可能性,从此更加具有想象空间. 随着一系列基于nodes的应用/ ...

  9. 怎么在项目中使用前端包管理器bower和构建工具gulp

    下面以WeUI(微信官方网页开发样式库)介绍一下,怎么把WeUi引入到自己的项目中,我的开发环境Visual Studio 2012,当然了Visual Studio 2015对此已有了更好的支持(h ...

  10. 在linux中使用包管理器安装node.js

    网上文章中,在linux下安装node.js都是使用源码编译,其实node的github上已经提供了各个系统下使用各自的包管理器(package manager)安装node.js的方法. 1. 在U ...

随机推荐

  1. 深入浅出容器学习--Docker数据卷

    一.Docker数据卷 Docker镜像是由多个文件系统(只读层)叠加而成,当启动一个容器的时候,Docker会加载只读镜像层并在其上(镜像栈顶部)添加一个读写层.如果运行中的容器修改了现有的一个已经 ...

  2. RabbitMQ中间件

    RabbitMQ 配置环境 安装 erlang环境以及RabbitMQ RabbitMQ端口号: 5672 去官网下载 https://www.rabbitmq.com 然后重启RabbitMQ服务 ...

  3. 直播预约丨《袋鼠云大数据实操指南》No.4:数据服务API实战解读,助力企业数字化跃迁

    近年来,新质生产力.数据要素及数据资产入表等新兴概念犹如一股强劲的浪潮,持续冲击并革新着企业数字化转型的观念视野,昭示着一个以数据为核心驱动力的新时代正稳步启幕. 面对这些引领经济转型的新兴概念,为了 ...

  4. 基于开源流批一体数据同步引擎ChunJun数据还原—DDL解析模块的实战分享

    原文链接:基于开源流批一体数据同步引擎ChunJun数据还原-DDL解析模块的实战分享 课件获取:关注公众号** "数栈研习社",后台私信 "ChunJun"* ...

  5. 渗透中的逆向工具-jsrpc实操手记

    前言 在渗透测试过程中,有些网站的接口参数是加密的.对于逆向小菜鸡的我来说,遇到这种网站总是束手无策,不能修改其中的参数,也就无法进行下一步的测试.偶然间发现一款js逆向工具jsrpc,它可以直接调用 ...

  6. Java源码分析系列笔记-6.ReentrantLock

    目录 1. 是什么 1.1. synchronized vs ReentranLock 2. 实现原理 2.1. uml图 3. 公平锁 3.1. 如何使用 3.2. 原理分析 3.2.1. 构造方法 ...

  7. 借助HarmonyOS SDK,《NBA巅峰对决》实现“分钟级启动”到“秒级进场”

    <NBA巅峰对决>是由望尘科技推出的国内首个真实还原5V5王朝模式的操作篮球手游,提供流畅操作手感和真实篮球赛场体验.丰富的玩法在为玩家带来高质游戏体验的同时,间接带来了启动流程冗长的问题 ...

  8. Qt多线程及线程池的使用笔记(一)

    Qt多线程及线程池的使用笔记(一) ​ ​ 在进行桌面应用程序开发的时候,假设应用程序在某些情况下血要处理较为复杂的逻辑,如果只有一个线程去处理,就会导致窗口卡顿,无法处理用户的相关操作,这种情况下就 ...

  9. java--对象的输入输出流、字节流、序列化与反序列化

    SequenceInputStream(序列流) 合并 //把三个文件合并成一个文件 public static void merge3() throws IOException{ //找到目标文件 ...

  10. leetcode 1047 双出字符串中的相邻元素

    简介 如果能想到栈的话,说明你的基础足够扎实. 我没有想到,我想到的是双向链表.我就是一个弟弟 思路 两个前后指针指向一个双向循环链表,然后判断是否相等相等的话,前一个指针前移,后一个指针后移,中间的 ...