面试官:【webpack和vite的区别?vite一定比webpack快吗?vite的缺点是什么?webpack的热更新和vite的热更新区别?】

文章目录

  • 前言
  • 前端工程化
  • webpack的构建流程
  • vite的构建流程
  • webpack和vite的对比
    • 服务器启动区别
    • 热更新的区别
    • 底层代码实现的区别?
    • 总结
  • vite的缺点是什么?
  • vite一定比webpack快吗?
  • 后言

前言

hello world欢迎来到前端的新世界


😜当前文章系列专栏:前端工程化
🐱‍👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。(如果出现错误,感谢大家指出)🌹
💖感谢大家支持!您的观看就是作者创作的动力

前端工程化

首先这就涉及到我们程序员编写代码的思路和方式了

我们都喜欢多模块,SASS/LESS预编译器,前沿语法,前言API,命名友好,资源分组,有注释的方式

而浏览器喜欢的是少量文件,CSS,兼容语法,兼容API,单字节命名,资源集中,无注释的方式。

在这里插入图片描述

所以我们前端工程化的意义和作用就来了。使用webpack和vite来帮助我们把我们写的代码转换成浏览器能够读写的模式。让我们可以随意的编写我们喜欢的格式的代码

webpack的构建流程

在这里插入图片描述

  • 初始化参数: 从配置文件和shell语句中读取合并参数,得出最终的配置参数。
  • 开始编译: 从上一步得到的参数初始化compiler对象,加载所有配置插件,执行对象的run方法开始编译
  • 确定入口: 通过entry找出入口文件
  • 编译模块: 从入口文件出发,调用所有配置的 loader 对模块进行翻译,再找出该模块依赖的模块,这个步骤是递归执行的,直至所有入口依赖的模块文件都经过本步骤的处理。
  • 完成模块编译: 经过第 4 步使用 loader 翻译完所有模块后,得到了每个模块被翻译后的最终内容以及它们之间的依赖关系。
  • 输出资源: 根据入口和模块之间的依赖关系,组装成一个个包含多个模块的 chunk,再把每个 chunk 转换成一个单独的文件加入到输出列表,这一步是可以修改输出内容的最后机会。
  • 输出完成: 在确定好输出内容后,根据配置确定输出的路径和文件名,把文件内容写入到文件系统。

webpack构建流程

vite的构建流程

Vite 的构建流程与传统的打包工具(如Webpack)有所不同,主要体现在开发阶段和生产环境阶段。以下是 Vite 的构建流程:

开发阶段:

  • 启动开发服务器: 当你启动 Vite 时,它会启动一个开发服务器来为你提供服务。这个开发服务器利用现代浏览器对 ES 模块的本地支持,实现了快速的冷启动和热模块替换(HMR)。

  • 解析并提供文件: 当浏览器请求某个文件时,Vite 会解析这个文件,并根据需要进行转换。例如,对于 Vue 单文件组件(SFC),Vite 会将其实时编译成 JavaScript,然后返回给浏览器。

  • 处理依赖关系: 当浏览器中的代码引入其他模块时,Vite 会分析这些依赖关系,并通过浏览器原生的 ES 模块加载功能来动态地获取这些模块。

生产环境阶段:

  • 预构建: 在生产环境中,Vite 会预先构建你的应用程序,以便在部署时能够提供尽可能高效的代码。

  • 优化和压缩: Vite 会对代码进行优化和压缩,以提高应用程序的性能,并生成适合生产环境部署的静态资源。

  • 输出: 完成构建后,Vite 会将最终的生产代码输出到指定的目录,准备用于部署到生产环境。

webpack和vite的对比

服务器启动区别

  • wepack: 当冷启动开发服务器时,基于打包器的方式是在提供服务前去急切地抓取和构建你的整个应用。

而 Vite 是通过在一开始将应用中的模块区分为 依赖源码 两类,改进了开发服务器启动时间。

依赖 大多为纯 JavaScript 并在开发时不会变动。一些较大的依赖(例如有上百个模块的组件库)处理的代价也很高。依赖也通常会以某些方式(例如 ESM 或者 CommonJS)被拆分到大量小模块中。

Vite 将会使用 esbuild 预构建依赖。Esbuild 使用 Go 编写,并且比以 JavaScript 编写的打包器预构建依赖快 10-100 倍。

源码 通常包含一些并非直接是 JavaScript 的文件,需要转换(例如 JSX,CSS 或者 Vue/Svelte 组件),时常会被编辑。同时,并不是所有的源码都需要同时被加载。(例如基于路由拆分的代码模块)。

Vite 以 原生 ESM 方式服务源码。这实际上是让浏览器接管了打包程序的部分工作:Vite 只需要在浏览器请求源码时进行转换并按需提供源码。根据情景动态导入的代码,即只在当前屏幕上实际使用时才会被处理。

热更新的区别

webpack

全局刷新: Webpack 的 HMR 通常会在代码发生变化时替换整个模块,然后通过 HMR runtime 来触发页面级别的刷新或重新渲染,这可能导致部分页面状态的丢失。

较慢的冷启动: Webpack 的开发模式下,由于整个应用程序需要被打包和构建,因此冷启动时间相对较长,尤其是随着项目规模的增大,冷启动时间会进一步延长。

配置复杂: 在使用 Webpack 进行 HMR 时,需要进行一定的配置,包括设置 HMR 插件、编写 HMR 相关的代码等,相对来说略显复杂。


vite

  • 局部更新: Vite 的 HMR 实现了更细粒度的模块更新,可以实现局部模块的更新而无需刷新整个页面,从而减少页面状态的丢失。

  • 快速冷启动: Vite 利用现代浏览器的原生 ES 模块加载能力,实现了快速的冷启动时间,因为它不需要将整个应用程序打包成一个或多个文件。

  • 无需额外配置: 在 Vite 中,HMR 是开箱即用的,无需额外配置。Vite 会自动处理模块的更新和热替换,让开发者专注于业务逻辑的开发。

底层代码实现的区别?

webpack是用的node.js来实现的,node.js支持的生态库更多,前后端的一致性比较高,对于异步编程有着很好的支持,node.js的跨平台性比较好,在window,Mac,和linux等不同操作系统上都可以运行


vite是使用的 esbuild,esbuild 是用 Go 语言编写的,专注于快速的构建和打包,它的底层实现经过了高度优化,能够充分利用多核处理器和其他硬件资源,以及高效的算法和数据结构,从而实现了极快的构建速度。

总结

webpack服务器启动速度比vite慢:由于vite启动的时候不需要打包,也就无需分析模块依赖、编译,所以启动速度非常快。当浏览器请求需要的模块时,再对模块进行编译,这种按需动态编译的模式,极大缩短了编译时间,当项目越大,文件越多时,vite的开发时优势越明显

vite热更新比webpack快:vite在HRM方面,当某个模块内容改变时,让浏览器去重新请求该模块即可,而不是像webpack重新将该模块的所有依赖重新编译

vite使用esbuild(Go 编写) 预构建依赖,而webpack基于nodejs, esbuild比node快 10-100 倍

vite生态不及webpack,加载器、插件不够丰富

vite的缺点是什么?

  • 生态,生态,生态不如webpack

wepback厉害之处在于loader和plugin非常丰富,不过我认为生态只是时间问题,现在的vite,更像是当时刚出来的M1芯片Mac,作者当时非常喜欢M1的Mac,毫不犹豫买了,现在也没什么问题,相信vite后续更新会更好

  • prod环境的构建,目前用的Rollup

原因在于esbuild对于css和代码分割不是很友好

  • 还没有被大规模使用,很多问题或者诉求没有真正暴露出来

vite真正崛起那一天,是跟vue3有关系的,当vue3广泛开始使用在生产环境的时候,vite也就大概率意味着被大家慢慢开始接受了

vite一定比webpack快吗?

不能说vite一定比webpack快,相对于不同的场景,webpack和vite有不同的速度优势吧。

vite相对于webpack在开发环境下有着更快的启动速度,因为vite底层是用的esbuild,这种设计使得 Vite 能够以非常低的延迟启动开发服务器,并且在修改文件时能够实现近乎即时的重新加载。

然而,在生产环境中,Vite 和 Webpack 的性能差异可能会变得不那么明显。Webpack 通过使用高度优化的构建算法和各种插件来提供出色的打包性能,尤其适用于复杂的项目和大规模的应用程序。

因此,是否可以说 Vite 一定比 Webpack 快,取决于具体的使用场景和项目需求。对于简单的小型项目,特别是新项目,Vite 通常会具有更快的启动和开发速度。而对于复杂的项目或需要更多自定义配置和功能的情况,Webpack 可能会更适合,因为它提供了更多的灵活性和扩展性。

后言

创作不易,要是本文章对广大读者有那么一点点帮助 不妨三连支持一下,您的鼓励就是博主创作的动力

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第1关:简单查询

任务描述相关知识 检索数据表的内容编程要求测试说明 任务描述 本关任务: 用 SELECT 语句检索数据表中指定字段的数据; 用 SELECT 语句检索数据表中所有字段的数据。 相关知识 为了完成本关任务,你需要掌握:1.如何获取数据表…

申请SSL证书常见问题

在申请SSL证书过程中,很可能会遇到一些问题,有些需要技术人员进行协助解决,而有些可能自己能解决了,那我们在申请SSL证书过程中到底会遇到哪些常见问题呢,一起来看看吧! 1.申请SSL证书时需要注意什么吗&…

鼎捷PLM:引领国产替代,创造极致体验,探索数字化研发可行之路

目录 01 直击痛点,鼎捷PLM重塑研发价值链 02 从实际需求出发,支持创新研发 ① 正向的设计思维 ② 智能化的产品设计 ③ 支持大规模定制的设计 03 广域协同,全供应链快速响应研发 04 精益管理,研发体系化、企业低碳化 05 生…

12周年庆|一文回顾思迈特十二年大事记

白驹过隙,转眼思迈特软件迎来了十二岁生日🎂 在中华文化里,十二是一个轮回,十二寓意着圆满。圆满代表着一种从容、自信、充满能量的状态。 任何一种圆满的状态,都不是一蹴而就的,都曾经经历过千锤百炼的磨砺…

RocketMQ(4.9.4)学习笔记 - 安装部署

单机部署: 官网文档地址: https://rocketmq.apache.org/zh/docs/4.x 参考文档: windows安装RocketMQ_rocketmq windows_book多得的博客-CSDN博客 下载地址: https://archive.apache.org/dist/rocketmq/4.9.4/rocketmq-all-4.9.…

ESP32C3工程找不到蓝牙头文件解决方法

本次在我的工程里要加上蓝牙辅助配网功能的方法。 1、在官方SDK里找到例程并复制头文件和源文件到自己的工程中。 我复制到如下图所示,并增添app_blufi.h以供其它文件操作。并增添make文件。 其中CMakeLists.txt和component.mk如下 2、使能menuconfig里的蓝牙并使能…

RUST与Python对比分析

1 什么是Rust? Rust 是一种系统编程语言,注重安全性,尤其是并发安全性,支持函数式、命令式和泛型编程范式等多范式语言。Rust 在语法上与 C 类似,但设计者希望在保持性能的同时提供更好的内存安全性。Rust 最初是由 Mo…

SAP Query报表的简单使用

Query报表一般是顾问做的简单输出报表,适用于一些单表显示,或者简单的多表连接 相关的事务代码 SQ01 SQ02 SQ03 1.首先去SQ03建立你自己的用户组并分配 2.SQ02去建立你自己的信息集 这里可以用改描述 这里点击生成并保存 然后去点击用户组分配&#x…

【动态内存管理】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 1. 为什么要有动态内存分配 2. malloc和free 2.1 malloc 2.2 free 3. calloc和realloc 3.1 calloc 3.2 realloc 4.常见的动态内存的错误 4.1对NULL指针的解引用操作…

EasyHttp 更新功能 form类型post + 限制次数

场景 easyHttp gitte 很高兴帮到您 点一个star 支持一下作者吧 之前的easyHttp只支持json类型post请求,而且有些接口有限制次数的,在循环调用过程中,容易出现突破限制的情况,现在我们引入了限制次数,例如一分钟6次&…

JavaScript库:jQuery,简化编程

jQuery介绍 官方网站: https://jquery.com jQuery 是一个 JavaScript 库 。极大地简化了 JavaScript 编程,例如 JS 原生代码几十行 实现的功 能, jQuery 可能一两行就可以实现,因此得到前端程序猿广泛应用。(现在处在比较边…

thinkPHP controller_suffix 使用方法

在‘config/route.php’配置’controller_suffix’ > true 后, 在controller里面所有的类都要添加Controller为后缀的名字。 在网页使用的时候不用输入Controller的后缀 访问方法,他默认自己带上controller后缀 这样做其实就为了规范controller类

我以前真的不知道独立站还有这么多优点!怪不得他们挤破头也要做!!!

文章目录 1.前言 2.了解独立站 3.独立站的优势有哪些 4.独立站的劣势有哪些 5.新手做独立站需要准备的材料和成本 6.总结 1. 前 言 随着线上购物的日益激烈,独立站成了许多卖家的首选,眼下独立站已经成为出海卖家的标配。 你是不是真的了解“独…

istio学习笔记-安装

Istioldie 1.18 / 安装指南 基于Kubernetes的Istio的微服务架构需要安装以下组件: Istio控制平面组件:包括Istio-Pilot、Istio-Policy、Istio-Telemetry等。这些组件负责微服务的管理和配置,如流量管理、策略执行、遥测数据收集等。数据平面…

图论16-拓扑排序

文章目录 1 拓扑排序2 拓扑排序的普通实现2.1 算法实现 - 度数为0入队列2.2 拓扑排序中的环检测 3 深度优先遍历的后续遍历3.1 使用环检测类先判断是否有环3.2 调用无向图的深度优先后续遍历方法,进行DFS 1 拓扑排序 对一个有向无环图G进行拓扑排序,是将…

重生奇迹mu超级恶魔怎么合成

重生奇迹mu强化恶魔去哪弄 重生奇迹mu强化恶魔不可以合成,在游戏里打怪掉。强化恶魔和强化天使也可以额外给勇士们增加伤害和增强伤害吸收。 开启主线任务的剑士、魔法师、弓箭手回归大礼包,迅速主线任务后打更高级的装备,实力突出的也可以…

Django 的国际化与本地化详解

概要 随着全球化的发展,为 Web 应用提供多语言支持变得日益重要。Django 作为一个功能强大的 Web 框架,提供了一套完整的国际化(i18n)和本地化(l10n)工具,使得开发多语言应用变得简单。本文将详…

【科研新手指南3】chatgpt辅助论文优化表达

chatgpt辅助论文优化表达 写在最前面最终版什么是好的论文整体上:逻辑/连贯性细节上一些具体的修改例子 一些建议,包括具体的提问范例1. 明确你的需求2. 提供上下文信息3. 明确问题类型4. 测试不同建议5. 请求详细解释综合提问范例: 常规技巧…

MVME5100 MOTOROLA 使用GX Works3集成工程软件进行配置

MVME5100 MOTOROLA 使用GX Works3集成工程软件进行配置 例如,在楼宇自动化中,冗余控制器可用于集中控制系统,以管理HVAC、照明、应急响应、电梯系统和其他电气组件。在石油和天然气领域,冗余控制器可以管理起重机设备的制动系统、…

我被这奇葩的答辩评价给惊呆了

最近组里有个小伙伴晋升,我司职级跟腾讯的不一样,可以理解为大概是要晋升高工(T9)吧。 据我了解,我司的晋升答辩还不成熟,没有统一规范和套路,那我就以腾讯的经验来辅导我的小伙伴吧。我想&…