构建工具 Vite、Webpack、Rollup对比

news2025/2/11 9:15:38

Webpack介绍

热更新方面:webpack支持HMR,但是webpack需要全部重新编译并更新,效率较低
tree-shaking:webpack2开始支持且消除效果不好,但是webpack5有更好的tree-shaking(去除未使用代码)
分包方面:webpack支持代码切割。(分包)
ESM打包:现在webpack支持es6module输出

Rollup介绍

优点:
Rollup 是一款 ES Modules 打包器,从作用上来看,Rollup 与 Webpack 非常类似。不过相比于 Webpack,Rollup要小巧的多,打包生成的文件更小。(识别commonJs需要插件)
热更新:Rollup不支持HMR,在对js以外的模块的支持上不如webpack,但是如果是打包纯js库例如react,前期的vue的话,使用rollup是很合适的,打包的产物比较干净,没有webpack那么多工具函数
Rollup 的插件机制设计得相对更干净简洁,单个模块的 resolve / load / transform 跟打包环节完全解耦,所以 Vite 才能在开发时模拟 Rollup 的插件机制,并且兼容大部分 Rollup 插件
rollup原生支持tree-shaking
缺点:
加载其他类型的资源文件或者支持导入 CommonJS 模块,又或是编译 ES 新特性,这些额外的需求 Rollup需要使用插件去完成
rollup并不适合开发应用使用,因为需要使用第三方模块,而目前第三方模块大多数使用CommonJs方式导出成员,并且rollup不支持HMR,使开发效率降低

Vite介绍

vite是一种新型前端构建工具,能够显著提升前端开发体验。它主要由两部分组成:

一个开发服务器,它基于 原生 ES 模块 提供了丰富的内建功能,如速度很快的 【模块热更新HMR】
一套构建指令,它使用 Rollup打包你的代码,并且它是预配置的,可以输出用于生产环境的优化过的静态资源
Vite主要特点如下:

快速的冷启动:vite会直接启动开发服务器,不需要进行打包操作,所以不需要分析模块的依赖、不需要编译,因此启动速度非常快
即时的模块热更新
真正的按需编译:利用现代浏览器支持ES Module的特性,当浏览器请求某个模块的时候,再根据需要对模块的内容进行编译,这种方式大大缩短了编译时间
优点:
vite热更新,实现按需编译,按模块更新。(快)
在 Vite 中,HMR 是在原生 ESM 上执行的。当编辑一个文件时,Vite 只需要精确地使已编辑的模块与其最近的 HMR 边界之间的链失效,使 HMR 更新始终快速,无论应用的大小。
Vite 同时利用 HTTP 头来加速整个页面的重新加载(再次让浏览器为我们做更多事情):源码模块的请求会根据 304 Not Modified 进行协商缓存,而依赖模块请求则会通过 Cache-Control: max-age=31536000,immutable 进行强缓存,因此一旦被缓存它们将不需要再次请求。
热更新原理:在热模块HMR方面,当修改一个模块的时候,仅需让浏览器重新请求该模块即可,无须像webpack那样需要把该模块的相关依赖模块全部编译一次,效率更高
在这里插入图片描述
2. vite在生产环境通过Rollup进行打包(特点:打包体积小),生成esm模块包。(特点:快)

vite在开发环境时,基于浏览器支持esm,让浏览器解析模块,然后服务器按需编译返回。同时基于esbuild(go)进行预构建打包不常变动的第三包,并用进行缓存。(缓存+快)
Vite 使用 esbuild 预构建依赖。Esbuild 使用 Go 编写,并且比以 Node.js 编写的打包器预构建依赖快 10-100 倍。

缺点:
生态:生态不如webpack,wepback在于loader和plugin非常丰富
prod环境的构建:目前用的Rollup,原因在于esbuild对于css和代码分割不是很友好
还没有被大规模使用,很多问题或者诉求没有真正暴露出来

结论:
Rollup更适合打包库,webpack更适合打包项目应用,vite基于rollup实现了热更新也适合打包项目。

—————————————————————————————————————
扩展:
1、webpack生命周期

  • 使用配置文件中的参数初始化compiler对象,初始化所有插件
  • 从入口文件出发,调用所有loader对模块进行处理(链式),再找出该模块依赖的模块进行处理
  • 根据入口和模块之间的依赖关系,组装成一个个包含多个模块的chunk,再把每个chunk转换成一个单独的文件加入到输出列表
  • 根据配置确定输出的路径和文件名,写入文件系统
  • 在以上过程中,Webpack会在特定的时间点广播出特定的事件,插件在监听对应的事件后会执行特定的逻辑
  • Webpack以开发模式运行时,每当检测到文件变化,一次新的Compilation被创建。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/645984.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

0基础学习VR全景平台篇第43篇:编辑器底部菜单-隐藏场景

大家好,欢迎观看蛙色VR官方系列——后台使用课程! 本期为大家带来蛙色VR平台,底部菜单—隐藏场景功能操作。 功能位置示意 一、本功能将用在哪里? 隐藏场景功能,指将选中的场景隐藏,浏览页将不显示隐藏的…

最详细,从0-1性能测试步骤详细,测试老鸟经验总结...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 性能测试流程 性…

sandfly-entropyscan:一款功能强大的恶意程序熵扫描工具

关于sandfly-entropyscan sandfly-entropyscan是一款功能强大的熵扫描工具,该工具可以用于检测与恶意软件相关的打包文件或加密二进制文件。除此之外,该工具还支持查找恶意文件和Linux进程相关的安全信息,并提供带有加密哈希的输出结果。 s…

cesium学习(下载,官方案例)

下载cesium源码 可以从官网直接下载,官网下载的是编译好的。链接: https://www.cesium.com/downloads/从github下载源码,方便我们本地调试学习(本文采用这种方式)。链接: https://github.com/CesiumGS/cesium 运行项目 安装依赖 npm i运行 npm run …

八股|ThreadLocal的内存泄露

ThreadLocal是个好用的工具类,但是使用不好是会导致内存泄露的。 内存泄露:之前开辟使用的内存空间,在使用完毕后未释放,结果导致一直占据该内存单元,无法被gc回收,导致该内存单元后续无法被使用&#xff0…

优思学院|质量管理六大思维陷阱【四】:抽样检查是最经济又能保证质量的方法吗?

在质量控制的过程中,一个常见的误解是认为抽样检查是最经济又能保证质量的方法。许多人认为进行百分之百的全数检查既浪费人力又时间不够。因此,他们倾向于采用抽样检查的方法,认为这样既符合经济成本,又能确保产品质量的水准。 …

Java中的死锁和Lock锁

6.死锁 1.死锁的理解: 不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁 2.说明: 1出现死锁后,不会出现异常,不会出现提示,只是锁的线程…

【小白入门】Verilog实现异步FIFO

之前也在CSDN上面写过两个FIFO相关的文章,不过代码看起来比较复杂,且注释也比较少,不利于新手入门。很多时候都没有耐心继续看下去。 http://t.csdn.cn/0dPX6 http://t.csdn.cn/lYvoY 因为自己本身是一个初学者,就从初学者的视…

交换排序——冒泡排序和快速排序

一、交换排序的基本思想 1、两两比较&#xff0c;如果发生逆序则交换&#xff0c;直到所有记录都排好序为止。 2、常见的交换排序方法&#xff1a;冒泡排序和快速排序 3、最简单的交换排序——简单选择排序算法描述 void SelectSort(SqList &K) {for (i1; i<L.lengt…

浅谈C++和Java中对象的等号赋值

随着对C学习的深入&#xff0c;发现了一些和Java在设计思想上有所不同的地方。其一就是对象的拷贝赋值。 在Java中&#xff0c;如果定义了两个对象s1和s2&#xff0c;在堆内存中将会创建两个对象实体。那么s1 s2;表示s1指向的对象发生改变&#xff0c;即指向了s2所指向的对象…

8分钟让你完全掌握代理IP基础知识和实际应用

概念 代理IP可以理解为一个中转服务器&#xff0c;将用户和目标服务器之间的请求和响应进行转发和代理。使用代理IP的主要目的是隐藏用户的真实IP地址、访问被限制的内容、提高网络连接速度和保护用户隐私。 目录 概念 一、代理IP的工作原理 二、代理IP的类型 三、为什么…

总结的太到位:python 多线程系列详解

前言&#xff1a; 上vip课的时候每次讲到框架的执行&#xff0c;就会有好学的同学问用多线程怎么执行&#xff0c;然后我每次都会说在测开课程会详细讲解&#xff0c;这并不是套路&#xff0c;因为如果你不理解多线程&#xff0c;不清楚什么时候该用什么时候不该用&#xff0c;…

Clean架构与MVVM:助你打造优质Android应用

Android应用程序开发可能具有挑战性&#xff0c;特别是在创建可扩展和可维护的代码以适应不断变化的需求和用户需求方面。为了解决这个挑战&#xff0c;开发者通常依赖于软件架构模式&#xff0c;为代码组织和关注点分离提供了坚实的基础。在Android开发中&#xff0c;两种流行…

7-基于51单片机的金属探测器检测金属报警器设计(源程序+原理图+PCB+论文)全套资料

编号: 0007 本系统采用单片机1602液晶按键比较器蜂鸣器发光二极管组合而成。 按键说明: 加键、减键。单独一个按键为复位按键 1.单片机型号: STC89C52/51、AT89C52/51、AT89S52/51 可任选&#xff0c;程序通用2.产品自带单片机上电复位电路、手动复位电路(复位按键)、晶振电路(…

Unity入门8——音效系统

一、音频文件参数面板 Force To Mono&#xff1a;多声道转单声道 Normalize&#xff1a;强制为单声道时&#xff0c;混合过程中被标准化 Load In Background&#xff1a;后台加载&#xff0c;不阻塞主线程&#xff0c;适合大音效 Ambisonic&#xff1a;立体混响声 非常适合 36…

Java数据结构之第十六章、并查集

一、并查集原理 在一些应用问题中&#xff0c;需要将n个不同的元素划分成一些不相交的集合。开始时&#xff0c;每个元素自成一个单元素集合&#xff0c;然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个集合的运算。适合于描述这类…

【CSDN铁粉】(获取铁粉的终极秘诀)

目录 铁粉和普通粉丝有什么区别什么是CSDN中的铁粉CSDN铁粉的用处如何获得更多的铁粉如何吸引更多的铁粉总结 目录) 铁粉和普通粉丝有什么区别 在CSDN社区中&#xff0c;铁粉和普通粉丝是两个不同的等级。铁粉是指对某个特定领域或某个专业人士非常崇拜和追随的用户&#xff0…

leetcode:1822. 数组元素积的符号(python3解法)

难度&#xff1a;简单 已知函数 signFunc(x) 将会根据 x 的正负返回特定值&#xff1a; 如果 x 是正数&#xff0c;返回 1 。如果 x 是负数&#xff0c;返回 -1 。如果 x 是等于 0 &#xff0c;返回 0 。 给你一个整数数组 nums 。令 product 为数组 nums 中所有元素值的乘积。…

Compose Desktop 实战 宝可梦图鉴

Compose Desktop 实战 宝可梦图鉴 前言 阅读本文需要一定compose基础&#xff0c;如果没有请移步Jetpack Compose入门详解&#xff08;实时更新&#xff09; 接口数据来源于pokeapi 项目源代码 如果你觉得不错&#xff0c;请给我一个star&#xff0c;THKS 实现效果 闲话不…

unity制作捕鱼达人

文章目录 介绍制作水波特效制作多种ui制作不同种类鱼的动画鱼的多种移动效果制作鱼的生成点多种炮台多种子弹多种网游戏控制器声音控制器游戏存档游戏开始 介绍 水波荡漾的特效 鱼有多种运动轨迹 每隔一段时间自动收集金币 可以切换不同的炮台 升级后有不同的特效 捕捉到普通鱼…