Webpack麻烦你不要靠的那么近,我怕Vite误会

news2024/11/18 5:34:59

某天,实施人员,让我修复了一个小问题,并需要快速的发布到正式环境上,我三下五除二修改了问题;开始了打包发布,以前并没有怎么注意到启动的问题,然而这次比较急,想在用户看到之前发布替换掉内容,于是等啊等,三四分钟过去了,才打包好了;于是就开始了优化webpack构建打包,但效果有点差强人意,于是就碰到Vite,在一番实践之下,直呼"webpack麻烦你不要靠的那么近,我怕vite误会"

问:Webpack为什么启动慢?Vite为什么启动快?

答:Vite它借助了浏览器对ESM规范的支持,采取了与Webpack完全不同的unbundle机制。

  • ESM规范ES modules 是 JavaScript 官方的标准化模块系统。相比于 CommonJS 和 AMD 等模块规范,最新浏览器原生支持模块功能,不再需要额外打包处理。* bundle机制将项目中各种类型的源文件转化供浏览器识别的js、css、img等文件,建立源文件之间的依赖关系,并将数量庞大的源文件合并为少量的几个输出文件。bundle工作机制的核心部分分为两块* 构建模块依赖图 - module graph* 将 module graph 分解为最终供浏览器使用的几个输出文件。强大的 bundle 机制,也引发了构建速度缓慢的问题,而且项目规模越大,构建速度越是缓慢。其主要原因是构建 module graph 的过程中,涉及到大量的文件 IO、文件 transfrom、文件 parse 操作;以及分解 module graph 的过程中,需要遍历 module graph、文件 transform、文件 IO 等。这些操作,往往需要消耗大量的时间,导致构建速度变得缓慢。开发模式下,dev server 需要 Webpack 完成整个工作链路才可以启动成功,这就导致构建过程耗时越久,dev server 启动越久。为了加快构建速度,Webpack 也做了大量的优化,如 loader 的缓存功能、webpack5 的持久化缓存等,但这些都治标不治本,只要 Webpack 的核心工作机制不变,那dev server启动优化,基本上永远都达不到Vite那样的效果。* unbundle机制顾名思义,不需要做 bundle 操作,即不需要构建、分解 module graph,源文件之间的依赖关系完全通过浏览器对 ESM 规范的支持来解析。这就使得 dev server 在启动过程中只需做一些初始化的工作,剩下的完全由浏览器支持。那有的同学就会问,源文件的resolve、load、transform、parse什么时候做呢 ? 答案是浏览器发起请求以后,dev server 端会通过 middlewares 对请求做拦截,然后对源文件做 resolve、load、transform、parse 操作,然后再将转换以后的内容发送给浏览器。unbundle 机制核心* 模块之间的依赖关系的解析由浏览器实现(ESM规范)* 文件的转换由 dev servermiddlewares 实现并做缓存* 不对源文件做合并捆绑操作
  • webpack是基于nodejs构建,js是以毫秒计数。vite是基于esbulid预构建依赖,esbulid是采用go语言编写的,go语言是纳秒级别的;所以vitewebpack打包器快10-100倍。问:Vite的热更新为什么这么快,都到了毫秒级别了?

答:由于Vite采用unbundle机制,所以dev sever在监听到文件变化之后,只需要通过ws连接通知浏览器去重新加载变化的文件,剩下的工作就交给浏览器去做了

而webpack在监听源文件变化后,会重新编译打包;由于我们只修改了一个文件,所以只需要对这个文件做resolveloadtransformparse操作,其他文件直接使用缓存,也因此dev server响应很快,等dev server重新编译打包好,会通过ws连接通知浏览器去获取新的打包文件,然后对页面做局部的更新;

问:webpack和vite打包过程有什么不同;

webpack:

1.分析各模块之间的依赖
2.编译打包
3.启动服务器

vite:

1.启动服务器
2.请求模块时按需动态编译显示

问:Vite有什么缺点?极致的快,消耗的代价是什么?

unbundle机制给Vitedev server方面获得巨大的性能提升,但也带来了一些代价,那就是首屏和懒加载的性能下降

首屏问题

由于unbundle机制,首屏期间需要额外做一些工作

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

相对比于webpack,Vite把需要在dev server启动过程中完成的工作,转移到dev server响应浏览器请求的过程中,所以不可避免的导致首屏性能下降;不过首屏性能差只发生在dev server启动以后第一次加载页面时发生;之后reload页面时,首屏的性能会好很多,因为dev server会将之前已经完成转换的内容缓存起来

懒加载

由于 unbundle 机制,动态加载的文件,需要做 resolve、load、transform、parse 操作,并且还有大量的 http请求,导致懒加载性能也受到影响

问:resolve、load、transform、parse 操作是什么?

答:Vite 中源文件的转换是在 dev server 启动以后通过 middlewares 实现的。

当浏览器发起请求以后,dev sever 会通过相应的 middlewares 对请求做处理,然后将处理以后的内容返回给浏览器。

middlewares 对源文件的处理,分为 resolveloadtransformparser 四个过程:

  • resolve - 解析 url,找到源文件的绝对路径;
  • load - 加载源文件。如果是第三方依赖,直接将预构建内容返回给浏览器;如果是业务代码,继续 transformparser
  • transfrom - 对源文件内容做转换,即 ts -> js, less -> css 等。转换完成的内容可以直接返回给浏览器了。
  • parser - 对转换以后的内容做分析,找到依赖模块,对依赖模块做预转换 - pre transform 操作,即重复 1 - 4
  • pre transformVite 做的一个优化点。预转换的内容会先做缓存,等浏览器发起请求以后,如果已经完成转换,直接将缓存的内容返回给浏览器。

Vite 在处理步骤 3 时,是通过 esbuild.transform 实现的,对比 Webpack 使用各个 loader 处理源文件,那是非常简单、快捷的。

最后

最近找到一个VUE的文档,它将VUE的各个知识点进行了总结,整理成了《Vue 开发必须知道的36个技巧》。内容比较详实,对各个知识点的讲解也十分到位。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

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

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

相关文章

Java之初入JDBC-连接数据库

之前我们学完了Mysql 现在我们要学习怎么用JAVA来操作Mysql数据库(JDBC不止能操作Mysql还能操作如Redis等数据库) 概述 JDBC原理图 大致我们java语言开发者,指定一个接口 这个接口-包含了对数据库基本操作 然后不同数据库的开发厂商&#x…

HTML中引入CSS样式的第二种方式:样式块

<!-- 第二种方式&#xff1a;在head标签中使用style块&#xff0c;这种方式被称为样式块方式。 语法格式&#xff1a; <head> <style type"text/css"> 选择器 { …

Ragnar-lothbrok靶机总结

Ragnar-lothbrok靶机渗透总结 靶机下载地址: https://download.vulnhub.com/ragnarlothbrok/Ragnar-lothbrok.ova 打开靶机,使用nmap扫描出靶机的ip和所有开放的端口 可以看到靶机开放了21端口,80端口,443端口,3306端口 一般开放21端口,我们可以先尝试ftp的匿名登录 可以看到…

MySQL详解(一)——基础 1.0

MySQL基础 1. 数据库概述 1.1 什么是数据库 数据库是持久化数据的一种介质&#xff0c;可以理解成用来存储和管理数据的仓库&#xff01; 持久化(persistence)&#xff1a;把数据保存到可掉电式存储设备中以供之后使用。持久化的大多数时候是将内存中的数据存储在数据库中&…

CompletableFuture实现异步编排

为什么需要异步执行&#xff1f; 场景&#xff1a;电商系统中获取一个完整的商品信息可能分为以下几步&#xff1a;①获取商品基本信息 ②获取商品图片信息 ③获取商品促销活动信息 ④获取商品各种类的基本信息 等操作&#xff0c;如果使用串行方式去执行这些操作&#xff0c;假…

使用Python包组织代码

使用Python包(package)组织代码Python 通过包(package)的方式来组织代码&#xff0c;包是一种特殊的模块(module)。Python 的包有两种形式&#xff0c;分别是Regular packages 和 namespace packages。所谓 Regular packages 就是指含有__init__.py的目录&#xff0c;这样的包被…

Jeston TX1TX2 A100 Ubuntu_1804_ROS 系统清理系统缓冲日志

大家好&#xff0c;我是虎哥&#xff0c;我自己的系统&#xff0c;运行一段时间后&#xff0c;出现了存储空间不足&#xff0c;详细查了一下&#xff0c;发现ROS本身就占用了大量的日志空间&#xff0c;这个当然在编程阶段&#xff0c;通过少加打印的方式来优化&#xff0c;但是…

黑群晖安装记录

老姐公司黑群晖坏了。临危受命&#xff0c;尝试拯救硬盘文件。 看起来黑群晖启动了&#xff0c;但是在管理软件找不到黑群晖IP&#xff0c;尝试了各种方法都不行&#xff0c;放弃老群晖&#xff0c;直接拯救硬盘数据&#xff0c;看官网有HDD迁移模式&#xff0c;直接把硬盘插到…

【GD32F427开发板试用】8. 脉搏监控仪

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;hehung 之前发帖 【GD32F427开发板试用】1. 串口实现scanf输入控制LED 【GD32F427开发板试用】2. RT-Thread标准版移植 【GD32F427开发板试用…

动态内存开辟必看,一篇就能学会贯通

目录 为什么存在动态内存分配 动态内存函数的介绍 1.malloc函数和free函数 2.calloc函数 3.realloc函数 常见的动态内存错误 经典的笔试题 柔性数组 今天来介绍一下动态内存&#xff0c;让我们直入主题&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 为…

【Cocos新手入门】cocos creator 的研发思路和工具操作说明

本篇文章主要讲解cocos creator 的研发思路和工具操作说明 作者&#xff1a;任聪聪 日期&#xff1a;2023年1月29日 研发思路 关于cocos creator 工具说明 首先cocos creator 是一个编辑游戏界面的窗口&#xff0c;省去了我们日常开发游戏时频繁修改参数调整动画、场景的工作…

Siam R-CNN: 通过重检测进行视觉跟踪

Siam R-CNN: 通过重检测进行视觉跟踪Siam R-CNN: Visual Tracking by Re-DetectionContributionsMethodSiam RCNNVideo Hard Example MiningTracklet Dynamic Programming Algorithm实验总结更多Ai资讯&#xff1a;公主号AiCharm Siam R-CNN: Visual Tracking by Re-Detectio…

DMETL5单机版安装使用

DMETL5安装使用 1.创建dm8数据库 使用dm数据库配置助手dbca创建数据库 2.根据dmetl在线文档创建HOTEL模式 DROP USER IF EXISTS HOTEL CASCADE; DROP TABLESPACE IF EXISTS HOTEL; CREATE TABLESPACE HOTEL DATAFILE HOTEL.DBF SIZE 150 AUTOEXTEND ON NEXT 10; CREATE USE…

基于springboot的仓库管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

增鑫科技更新招股书,冲刺深交所上市,正邦集团是其主要股东

近日&#xff0c;江西增鑫科技股份有限公司&#xff08;下称“增鑫科技”&#xff09;预披露更新招股书&#xff0c;准备在深圳证券交易所主板上市。据贝多财经了解&#xff0c;增鑫科技曾于2022年7月1日递交招股书&#xff0c;此次更新了截至2022年6月30日的财务数据等信息。 …

权威报告!免费解锁IBM最新《2022-2023年Salesforce状态报告》

前不久&#xff0c;IBM发布了2022-2023年Salesforce状态报告&#xff0c;揭示了一些热门趋势&#xff0c;报告显示Salesforce仍然是许多企业客户成功战略的重要力量。 Salesforce状态报告是一项全球性的、数据驱动的调查&#xff0c;主要调查业务战略、投资和发展&#xff0c;同…

Linux常用命令——rpm命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) rpm RPM软件包的管理工具 补充说明 rpm命令是RPM软件包的管理工具。rpm原本是Red Hat Linux发行版专门用来管理Linux各项套件的程序&#xff0c;由于它遵循GPL规则且功能强大方便&#xff0c;因而广受欢迎。逐…

5.2 晶体管的高频等效模型

从晶体管的物理结构出发&#xff0c;考虑发射结和集电结电容的影响&#xff0c;就可以得到在高频信号作用下的物理模型&#xff0c;称为混合 π\pmb{π}π 模型。由于晶体管的混合 πππ 模型与 hhh 参数等效模型在低频信号作用下具有一致性&#xff0c;因此&#xff0c;可用 …

Unity Native Plugin C#和C++互相调用

官方链接 1.DLL的方式&#xff1a; C代码&#xff1a;编译成DLL&#xff0c;导入Unity #pragma once #include <map> #include <string>//导出宏定义 #define _DllExport _declspec(dllexport)//函数指针 typedef void (*NativeCallback)(const char*);extern &…

【28】C语言 | 关于指针练习(2)

目录 10、下列关于二维数组输出 11、下列关输出 12、下列代码输出什么 13、下列代码输出什么 14、下列代码输出什么 15、下列代码输出什么 16、下列代码输出什么 17、下列代码输出什么 18、杨氏矩阵 19、左旋转两个字符 10、下列关于二维数组输出 int main() {int …