不要再纠结了!看完这篇,你就能秒懂webpack、vite、rollup三者间差异!

news2024/12/28 6:06:23

前端打包工具webpack、vite、rollup的区别及使用

  • webpack、vite、rollup的区别
  • webpack、vite的区别
    • 为什么vite比webpack打包快?
    • 为什么有人会说vite慢?
      • 首屏问题
      • 懒加载问题
      • 解决方案
      • 注意点
  • webpack
    • webpack打包过程
    • webpack打包原理
    • 第一次冷启动慢的原因
    • 热更新慢的原因
  • vite
    • vite开发环境打包
    • vite生产环境打包
    • 生产环境的构建为什么使用 esbuild,而选择 rollup ?
      • esbuild语言
  • rollup

webpack、vite、rollup的区别

Webpack 是功能最丰富的打包工具,适用于大型项目和复杂应用。
Rollup 专注于打包 JavaScript 库,生成优化的、轻量级的代码。
vite基于rollup实现了热更新也适合打包项目

webpack、vite的区别

webpackvite
启动时各个模块之间的依赖,然后进行编译,打包后的代码在本地服务器渲染启动时不需要分析各个模块之间的依赖关系、不需要打包编译。可按需动态编译缩减时间。当项目越复杂、模块越多的情况下,vite明显优于webpack。
热更新时,部分代码变更, 整个模块的代码都需要重新编译,然后在推送更新当改动了某个模块的时候,也只用让浏览器重新请求该模块
基于nodejs构建,js是以毫秒计数。基于esbulid预构建依赖,esbulid是采用go语言编写的,go语言是纳秒级别的
Vite采用了ES模块来实现模块的加载。目前基于web标准的ES模块已经覆盖了超过90%的浏览器。
webpack生态相对丰富vite相关生态没有webpack完善,vite可以作为开发的辅助。

为什么vite比webpack打包快?

  • 因为它在启动的时候不需要打包,即不用分析模块与模块之间的依赖关系,也不用进行编译。这种方式就类似于UI组件按需加载。当浏览器请求某个模块时,vite对其按需动态编译.
  • 热更新方面,效率更高。当改动了某个模块的时候,也只用让浏览器重新请求该模块,不需要像webpack那样将模块以及模块依赖的模块全部编译一次。

为什么有人会说vite慢?

Vite 的快,主要体现在两个方面: 快速的冷启动和快速的热更新,即上一节解释;
而他的慢呢?请看一下:

首屏问题

某个界面是首次进入,且依赖比较多/比较复杂的话,那就会比较慢了。
vite启动快的原理,也导致了他在加载依赖项很多,很复杂的页面时,页面打开慢。因为他把 dev server 启动过程中完成的工作,转移到了 dev server 响应浏览器请求的过程中,不可避免的导致首屏性能下降。

由于 unbundle 机制,首屏期间需要额外做以下工作:

  • 不对源文件做合并捆绑操作,导致大量的 http 请求;
  • dev server 运行期间对源文件做 resolve、load、transform、parse 操作;
  • 预构建、二次预构建操作也会阻塞首屏请求,直到预构建完成为止;

不过首屏性能差只发生在 dev server 启动以后第一次加载页面时发生。之后再 reload 页面时,首屏性能会好很多。原因是 devserver 会将之前已经完成转换的内容缓存起来。

懒加载问题

  • 由于 unbundle 机制,动态加载的文件,需要做 resolve、load、transform、parse 操作,并且还有大量的 http 请求,导致懒加载性能也受到影响。
  • 如果懒加载过程中,发生了二次预构建,页面会 reload,对开发体验也有一定程度的影响。

解决方案

1.如果项目首屏过于卡顿,不妨看看这篇文章-vite性能优化 — 增加业务代码预构建,加快首屏输出

2.官网也有部分解释-VITE官网:依赖优化选项

3.也可以参考下面这种方案
在这里插入图片描述
插件使用,万能的开发者开发的插件,让我们谢谢他!

npm i -D vite-plugin-optimize-persist vite-plugin-package-config
// vite.config.ts
import OptimizationPersist from 'vite-plugin-optimize-persist'
import PkgConfig from 'vite-plugin-package-config'

export default {
  plugins: [
    PkgConfig(),
    OptimizationPersist()
  ]
}

package.json 会自动生成其依赖项,当然你也可以手动加,但不建议,因为很多呀~
在这里插入图片描述

注意点

  • 首次加载的时候,依然会很慢,这个是正常现象,因为这个插件第一次也没法知道,哪些依赖需要预构建,他只是在vite动态引入资源的时候,将这些资源都记录下来,自动写入了package.json中,当再次启动项目的时候,插件会读取之前他写入在package.json中的数据,并告知vite,这样vite就能对这些资源进行预构建了。
  • 如果在这之后,被人再拿到你的源代码,因为package.json中已经有了预构建配置了,所以,他的vite在第一次启动时,就能对资源进行预构建了,另外,如果你由于某些原因需要删除node_modules/.vite这个缓存目录, 由于有这个插件,你的这次首次渲染也会快起来。

webpack

webpack打包过程

1.识别入口文件
2.通过逐层识别模块依赖。(Commonjs、amd或者es6的import,webpack都会对其进行分析。来获取代码的依赖)
3.webpack做的就是分析代码。转换代码,编译代码,输出代码
4.最终形成打包后的代码

webpack打包原理

1.先逐级递归识别依赖,构建依赖图谱
2.将代码转化成AST抽象语法树
3.在AST阶段中去处理代码
4.把AST抽象语法树变成浏览器可以识别的代码, 然后输出

第一次冷启动慢的原因

在之前的浏览器中没有模块化的设计,所以期望把所有源代码编译进一个 js文件中提供给浏览器使用,所以在开发中当我们运行启动命令的时候,webpack 总是需要从入口文件去索引整个项目的文件,编译成一个或多个单独的js 文件,即使采用了代码拆分,也需要一次生成所有路由下的编译后文件(这也是为什么代码拆分对开发模式性能没有帮助)。这也导致了服务启动时间随着项目复杂度而指数增长。

热更新慢的原因

当基于打包器启动时,编辑文件后将重新构建文件本身。显然我们不应该重新构建整个包,因为这样更新速度会随着应用体积增长而直线下降。
而即使我们使用了HMR, 更新速度也会随着应用规模的增长而显著下降。

vite

vite开发环境打包

  • Vite 一开始将应用中的模块区分为依赖和源码两类,
  • vite在开发环境时,基于浏览器支持esm,让浏览器解析源码模块,然后服务器按需编译返回(浏览器的原生 ES Modules 能力允许在不将代码打包到一起的情况下运行 JavaScript 应用),基于esbuild进行预构建(开发环境)打包不常变动的第三方依赖包,并进行缓存。
  • Vite 利用 HTTP 头来加速整个页面的重新加载,源码模块的请求会根据 304 Not Modified 进行协商缓存,而依赖模块请求则会通过 Cache-Control: max-age,immutable 进行强缓存,因此一旦被缓存它们将不需要再次请求。
  • 热更新时,当某个模块内容改变时,让浏览器去重新请求该模块即可,而不是像webpack重新将该模块的所有依赖重新编译,

vite生产环境打包

  • 构建应用程序
  • Rollup打包:Vite在生产环境中使用Rollup进行打包。将应用程序中的所有模块打包成一个或多个bundle文件,以便在生产环境中使用。
  • 代码压缩和优化:Rollup可以对代码进行压缩和优化,例如删除未使用的代码、合并模块等,以减少最终生成的代码的大小。
  • 生成最终的静态资源:在打包完成后,Vite会生成最终的静态资源文件,包括JavaScript文件、CSS文件和其他静态文件,这些文件可以直接部署到Web服务器上。

vite本身并不参与编译,它的编译能力只是集成了rollup和ESbuild的功能.

生产环境的构建为什么使用 esbuild,而选择 rollup ?

这是因为 esbuild 在代码分隔、css 处理等方面的功能仍在开发中,rollup 在应用打包方面更加的成熟且灵活

esbuild语言

  • 使用 Go 编写,并且编译成了机器码
  • 大量使用并行算法
  • esbuild 的所有内容都是从零编写的,避免了不要的数据转换
  • 更有效利用内存

rollup

Rollup是一个现代化的JavaScript模块打包器,专注于打包JavaScript库和应用程序。它采用了ES模块的标准,并支持各种JavaScript模块格式,包括ES modules、CommonJS、AMD等。通过插件和工具的组合来处理Vue文件的各个部分(模板、样式、脚本),将它们转换为浏览器可识别的格式,并最终生成最小化、优化的打包文件。

  • rollup基于esm打包,打包生成的文件更小。Rollup不支持HMR(识别commonJs需要插件)
    -基于rollup- npm发包教程 react组件–npm发包总过程-基于rollup

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

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

相关文章

在yolov5源码中添加注意力机制

yolov5源码中添加注意力机制 1 项目环境配置1.1 yolov5 源码下载1.2 创建虚拟环境1.3 安装依赖 2 常用的注意力机制2.1 SE 注意力机制2.2 CBAM 注意力机制2.3 ECA 注意力机制2.4 CA 注意力机制 3 添加方式3.1 修改 common.py 文件3.2 修改 yolo.py 文件3.3 修改 yolov5s.yaml 文…

易查分如何导入数据?这个最关键的要点别忽略

我们在使用易查分制作查询系统时,偶尔会遇到Excel文件没有办法正常上传的情况。这个问题困扰着许多老师,他们不知道该如何解决。今天我想和大家讨论一下,易查分导入数据时最常出现错误的原因,其中这个要点最关键,但很多…

谷歌Bard入门指南

文章目录 谷歌Bard入门指南一、简介二、使用指南三、中文化3.1 中文提问3.2 中文回答 四、Hello Game五、亮点 谷歌Bard入门指南 一、简介 Bard 是一个大型语言模型,也称为对话式 AI 或聊天机器人,经过训练,内容丰富且全面。Bard 接受过大量…

Mysql——》哈希索引

推荐链接: 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

接口测试-postman,JMeter与LoadRunner比较

目录 JMeter与LoadRunner比较 JMeter缺点 一.创建测试用例集、子集 二.创建测试用例 三.设置变量 四.添加响应处理 五.批量执行测试用例 总结: postman是一个谷歌出的轻量级的专门测试接口的小工具~(PS:postman包括两种:C…

PostgreSQL如何根据执行计划进行性能调优?

EXPLAIN命令 PG中EXPLAIN命令语法格式如下: EXPLAIN [(option[,...])] statement EXPLAIN [ANALYZE] [VERBOSE] statement该命令的options如下: ANALYZE [boolean]VERBOSE [boolean]COSTS [boolean]BUFFERS [boolean]FORMAT {TEXT | XML | JSON | YAM…

【UnityDOTS 十】DynamicBufferComponent介绍

DynamicBufferComponent 前言 DynamicBufferComponent 作为一种特殊的组件存在,可以作为一种非托管内存下可动态调整带下的数组容器组件。 一、DynamicBufferComponent是什么? DynamicBufferComponent也是组件的一种。 需要关注的是内部指针&#xf…

spring使用01

① 导入 Spring 开发的基本包坐标 ② 编写 Dao 接口和实现类 ③ 创建 Spring 核心配置文件 ④ 在 Spring 配置文件中配置 UserDaoImpl ⑤ 使用 Spring 的 API 获得 Bean 实例 第一步&#xff1a;创建maven的web骨架 然后&#xff0c;导入 Spring 开发的基本包坐标 <depe…

工资10K,副业20K,这届程序员搞副业真野

最近刚完成了一个远程外包项目工作&#xff0c;钱刚到账&#xff0c;小金库又添了一笔&#xff1a; 从一开始的15K死工资&#xff0c;到现在的主业副业一共25K收入&#xff0c;最近的经济压力小了很多&#xff0c;终于也有闲钱和老婆去旅旅游&#xff0c;升级一下外设&#xff…

平板电脑的触控笔有必要买吗?平价电容笔排行榜

伴随着ipad的流行&#xff0c;部分学习党开始从传统的纸笔教学向无纸化教学转变。于是&#xff0c;原本属于苹果专利的电容笔&#xff0c;一下子就火了起来&#xff0c;不少人都对这个价格接近一千块钱的电容笔产生了浓厚的兴趣。我想&#xff0c;苹果电容笔特有的的“重力压感…

MySQL数据库基础(二):DDL,DML,DQL

六、DDL数据库操作 1、MySQL的组成结构 注&#xff1a;我们平常说的MySQL&#xff0c;其实主要指的是MySQL数据库管理软件。 一个MySQL DBMS可以同时存放多个数据库&#xff0c;理论上一个项目就对应一个数据库。如博客项目blzhujianog数据库、商城项目shop数据库、微信项目wec…

OpenCV创建一张类型为CV_8UC3的3通道彩色图像

#include <iostream> #include <opencv2/imgcodecs.hpp> #include <opencv2/opencv.hpp> #include <opencv2/highgui.hpp>int

[MySQL]MySQL库的操作

[MySQL]MySQL库的操作 文章目录 [MySQL]MySQL库的操作1. 创建数据库2. 字符集和校验规则2.1. 基本概念2.2. 查看系统默认字符集以及校验规则2.3. 查看数据库支持的字符集2.4 查看数据库支持的校验规则2.5 指明字符集和校验规则创建数据库2.6 校验规则对数据库的影响 3. 删除数据…

经典轻量级神经网络(1)MobileNet V1及其在Fashion-MNIST数据集上的应用

经典轻量级神经网络(1)MobileNet V1及其在Fashion-MNIST数据集上的应用 1 MobileNet V1的简述 自从2017年由谷歌公司提出&#xff0c;MobileNet可谓是轻量级网络中的Inception&#xff0c;经历了一代又一代的更新。 MobileNet 应用了Depthwise 深度可分离卷积来代替常规卷积…

【hadoop】Google的基本思想

Google的基本思想 三架马车GFS分布式文件系统的核心架构和原理机架感知 MapReduce计算模型PageRank问题MapReduce BigTable 三架马车 Google的基本思想主要有三个&#xff0c;称之为三架马车&#xff0c;分别是GFS&#xff08;Google File System&#xff09;、MapReduce计算模…

gitlab/gerrit

gitlab/gerrit 1. gitlab2. gerrit2.1 环境准备2.2 下载软件2.3 创建启动账户2.4 安装gerrit2.5 创建登录账户2.6 启动服务2.7 修改配置文件2.8 配置反向代理(nginx)2.9 gerrit主页 3. gitlabgerrit3.1 配置gerrit replication功能&#xff08;用于复制具体项目&#xff09;3.2…

深入浅出讲解Stable Diffusion原理,新手也能看明白

说明 最近一段时间对多模态很感兴趣&#xff0c;尤其是Stable Diffusion&#xff0c;安装了环境&#xff0c;圆了自己艺术家的梦想。看了这方面的一些论文&#xff0c;也给人讲过一些这方面的原理&#xff0c;写了一些文章&#xff0c;具体可以参考我的文章&#xff1a; 北方…

51单片机驱动 mg996r金属舵机 STC89C52单片机直接驱动金属大舵机

/*无论是大舵机&#xff0c;还是小舵机&#xff0c;控制方法都一样会区别在 大舵机只能接P0口&#xff08;此口外接上拉&#xff0c;驱动电流最大&#xff09;小舵机任意口 */ //#include<reg51.h> //#define uint unsigned int //#define uchar unsigned char //sbit S…

10、架构:组件通信设计

通信是一个应用中不可或缺的一个功能&#xff0c;现如今前端视图类框架大多数都是由数据驱动&#xff0c;通过数据来进行视图层的展示渲染。举个简单的例子如下&#xff0c;这是一个常见的 React 列表渲染&#xff1a; // each const numbers [1, 2, 3, 4, 5]; const listIte…

应用级监控方案Spring Boot Admin

1.简介 Spring Boot Admin为项目常用的监控方式&#xff0c;可以动态的监控服务是否运行和运行的参数&#xff0c;如类的调用情况、流量等。其中分为server与client&#xff1a; server&#xff1a; 提供展示UI与监控服务。client&#xff1a;加入server&#xff0c;被监控的…