详解vite原理

news2024/11/14 17:21:52

背景

自从尤大大的 vite 问世后,现在前端的构建工具由 webpack 转向 vite 的越来越多,今天主要来讨论一下 vite 的一些工作原理,讨论之前大家可以看这篇文章,尤其是注意其中谈到的 Bundleless,这样也能更好的理解 vite。
前端构建工具大盘点:gulp、webpack、vite、rollup、esbuild、snowpack、babel、parcel、swc、tsc

毫无疑问,由于 EMS 的出现,Bundleless 是未来的趋势,而 vite 基本上是 Bundleless 的一个代表。

两种模式

Vite分为开发模式和生产模式

开发模式

Vite提供了一个开发服务器,然后结合原生的ESM,当代码中出现import的时候,发送一个资源请求,Vite开发服务器拦截请求,根据不同文件类型,在服务端完成模块的改写(比如单文件的解析编译等)和请求处理,实现真正的按需编译,然后返回给浏览器。请求的资源在服务器端按需编译返回,完全跳过了打包这个概念,不需要生成一个大的bundle。服务器随起随用,所以开发环境下的初次启动是非常快的。而且热更新的速度不会随着模块增多而变慢,因为代码改动后,并不会有bundle的过程。

Vite Server 所有逻辑基本都依赖中间件实现。这些中间件,拦截请求之后,完成了如下内容:

  • 处理 ESM 语法,比如将业务代码中的 import 第三方依赖路径转为浏览器可识别的依赖路径;
  • 对 .ts、.vue 等文件进行即时编译;
  • 对 Sass/Less 的需要预编译的模块进行编译;
  • 和浏览器端建立 socket 连接,实现 HMR。

在这里插入图片描述

生产模式

利用Rollup来构建源代码。
Vite将需要处理的代码分为了两大类

第三方依赖:
这类代码大部分都是纯JavaScript,而且不会怎么经常变化,Vite会通过pre-bundle的方式来处理这部分代码。Vite2使用esbulid来构建这部分代码,esbuild是基于go的,处理速度会比用JavaScript写的打包器要快10-100倍,这也是Vite为什么在开发阶段很快的一个原因。

业务代码:
通常这部分代码,都不是纯的JavaScript(例如:JSX,Vue等),经常会被修改,而且也不需要一次性全部加载(可以根据路由,做代码分割加载)
由于Vite使用了原生的ESM,Vite本身只需要按需编译代码,启动静态服务器就可以。只有当浏览器请求这些模块,这些模块才会被编译,动态加载到当前页面中。

热更新原理

就是在客户端与服务端建立了一个 websocket 连接,当代码被修改时,服务端发送消息通知客户端去请求修改模块的代码,完成热更新。

其他优化

缓存
https://cn.vitejs.dev/guide/dep-pre-bundling.html#caching

  • Vite会将pre-bundle的依赖存放在 node_modules/.vite 下,如果想修改目录,可以在 vite 文档中搜索 cacheDir
    在这里插入图片描述
  • 浏览器缓存 Vite Dev Server 会将这些第三方依赖设置HTTP强缓存来提升性能,只有当这些依赖发生变化时,才会去更新query id使之前的的缓存失效。

使用esbuild依赖预构建
依赖预构建仅会在开发模式下应用,并会使用 esbuild 将依赖转为 ESM 模块。在生产构建中则会使用 @rollup/plugin-commonjs。
https://cn.vitejs.dev/guide/dep-pre-bundling.html#dependency-pre-bundling

Q&A

为什么生产环境还是需要bundle?
尽管原生 ESM 现在得到了广泛支持,但由于嵌套导入会导致额外的网络往返,在生产环境中发布未打包的 ESM 仍然效率低下(即使使用 HTTP/2)。为了在生产环境中获得最佳的加载性能,最好还是将代码进行 tree-shaking、懒加载和 chunk 分割(以获得更好的缓存)。

为何不用 ESBuild 打包?
虽然 esbuild 快得惊人,并且已经是一个在构建库方面比较出色的工具,但一些针对构建 应用 的重要功能仍然还在持续开发中 —— 特别是代码分割和 CSS 处理方面。就目前来说,Rollup 在应用打包方面更加成熟和灵活。尽管如此,当未来这些功能稳定后,我们也不排除使用 esbuild 作为生产构建器的可能。

参考

https://cn.vitejs.dev/guide/why.html

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

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

相关文章

C#学习记录0.1

一、环境 编译器使用 Visual Studio 2022。  IDE(集成开发环境)搭建不做阐述。 二、创建项目与解决方案 打开Visual Studio 2022点击创建新项目,如下图所示。 搜索并选择控制台应用程序,如下图所示。 解决方案:针对用户的具体需要&#x…

RocketMQ【3】Rocketmq集群部署(多master多slave)异步复制

系列文章目录 RocketMQ【1】linux安装配置Rocketmq(单机版) RocketMQ【2】Rocketmq控制台安装启动(单机版) 文章目录系列文章目录一、异步复制的优缺点1、优点2、缺点二、架构1、架构图2、介绍3、机器配置三、配置1、master节点配…

ES32中OTA空中升级

打开SDK可视化配置,检查flash大小设定和“partition table”分区表设定。 左下角,点击SDK可视化配置按钮,进入配置。flash大小为4MB,Partition Table选择Factory app, two OTA definitions,分区表烧写偏移地址0x8000&…

关于缓存的理解

关于缓存的理解 为系统引入缓存的理由 通常情况,在我们面临系统的基础设施,例如数据库无法处理量级的请求时候,总是会下意识的使用缓存,这次我们以设计的角度思考,在为你的系统引入缓存之前,它是否真的需…

Windows下nvm的安装配置及使用

目录 一:nvm简介 二:nvm下载及安装 三:nvm配置镜像 四:nvm的基本使用 五:nvm的一些常用命令 一:nvm简介 nvm 全名叫做 nodejs version manage,是一个非常棒的nodejs的版本管理工具&#x…

Mp4屏录文件无法播放的修复方法

屏录文件算是比较特殊的一类文件,原因是其采集范围仅限于桌面,和我们现实的摄像机采集相比,桌面类的更单一,所以能实现较小的长度存放较多的帧。下面我来看一个屏录文件损坏后的修复案例,同时讲下CHS零壹视频修复程序Q…

GraphCut、最大流最小割定理

G(V,E);V为点集,E为边集; 节点集V中的节点分为: (1)终端节点。不包含图像像素,用S和T表示。S为源点,T为汇点。图像分割中通常用S表示前景目标&a…

sql开窗函数

用的Oracle数据库进行测试一、数据准备DROP TABLE T_TEST; CREATE TABLE T_TEST (id NUMBER(10) VISIBLE NOT NULL ,姓名 VARCHAR2(50 BYTE) VISIBLE ,性别 VARCHAR2(50 BYTE) VISIBLE ,班级 VARCHAR2(50 BYTE) VISIBLE ,成绩 NUMBER(5,2) VISIBLE );INSERT INTO T_TEST VALUE…

【蓝桥杯专题】 递归 递推 (C++ | 洛谷 | acwing)

文章目录【蓝桥杯专题】 递归 &递推 (C | 洛谷 | acwing)复习P5534 【XR-3】等差数列P4994 终于结束的起点P1028 [NOIP2001 普及组] 数的计算波动数列[递归]母牛的故事蓝桥杯:耐摔指数菜狗现在才开始备战蓝桥杯QAQ 【蓝桥杯专题】 递归 &…

8 神经网络及Python实现

1 人工神经网络的历史 1.1 生物模型 1943年,心理学家W.S.McCulloch和数理逻辑学家W.Pitts基于神经元的生理特征,建立了单个神经元的数学模型(MP模型)。 1.2 数学模型 ykφ(∑i1mωkixibk)φ(WkTXb)y_{k}\varphi\left(\sum_{i1…

基于龙芯+国产FPGA 的VPX以太网交换板设计(三)

调试与测试是本系统设计实现的重要环节。单板调试主要包括各单元电路和接口 的调试,主要通过查看信号波形和运行软件对每个功能进行测试。本章将设计一系列 的调试和测试方案来验证电路设计的正确性。 6.1 电路板静态检查 经过原理图设计、印制板设计、制造、印制板…

HTML5智慧渔业WebGL可视化云平台

中国作为全球第一大水产养殖大国,未来中国水产养殖的出路在哪里?智慧渔业到底能起到多大的作用?在未来它能为我国水产养殖做出什么深刻的变化吗?今天给大家分享一个基于 数维图 的 Sovit3D可视化编辑器 构建的水产养殖3D可视化场景案例——智慧渔业可视化管理系统…

Hadoop框架:MapReduce基本原理和入门案例

Hadoop MapReduce是一种用于处理大数据的编程模型。它将数据集切分成多个小任务,每一个小任务都可以通过独立的计算来完成,最终的结果可以通过合并或更新数据来进行聚合。Hadoop MapReduce极大地简化了处理大数据的过程,因为它可以同时进行多…

锁屏面试题百日百刷-Hive篇(十一)

锁屏面试题百日百刷,每个工作日坚持更新面试题。锁屏面试题app、小程序现已上线,官网地址:https://www.demosoftware.cn。已收录了每日更新的面试题的所有内容,还包含特色的解锁屏幕复习面试题、每日编程题目邮件推送等功能。让你…

大坝安全监测和水雨情测报系统-智慧水利

政策背景2021年3月23日《国务院办公厅关于切实加强水库除险加固和运行管护工作的通知》(国办发〔2021〕8号)和2021年9月22日国务院常务会议均明确要求,加快推进水库除险加固,加强雨水情和安全监测预警设施建设,健全常态…

23种Java设计模式

目录 🧡 Java 设计模式 六大原则 创建型模式 工厂模式 (Factory Pattern) 抽象工厂模式 (Abstract Factory Pattern) 单例模式 (Singleton Pattern) 建造者模式 (BuilderPattern) 原型模式 (Prototype Pattern) 结构型模式 适配器模式 (Adapter Pattern) …

vmware 虚拟机创建 LVM

LVM 原理 LVM (Logical volume Manager): 虚拟设备驱动,是在内核中块设备和物理设备之间添加的一个新的抽象层次, LVM 可以弹性的调整 文件系统的容量 LVM的实现原理:LVM 将几个实体的 partitions/disk 通过软件组合成一块独立的大磁盘VG,之…

中职网络空间安全B-windows渗透

Windows渗透 目录 Windows渗透 要点 cev2017-7269 ms14-064 pr.exe 提权 3389.bat 打开连接 破解hash 总体是众多小点的结合 1.通过本地pc中的渗透平台kali对服务器场景进行服务及版本扫描渗透测试,并将该操作显示结果中445端口对应的服务版本信息字符串作为fla…

Django实践-03模型-02基于admin管理表

文章目录Django实践-03模型利用Django后台管理模型1. 将admin应用所需的表迁移到数据库中。2. 创建访问admin应用的超级用户账号,3. 运行项目4.注册模型类5.对模型进行CRUD操作。6.实现学科页和老师页效果1. 修改polls/views.py文件。2.修改templates/polls/subject…

THUPC-2023 游记

清华校赛,战火重燃 原文链接 宣传图 上周四同学在洛谷无意间看到了宣传图,当时很有感触。不知觉间,又是一年春,又是一场触动心弦的 THUPC 了。 周五的团建过于有趣,致使我完全将 THUPC 抛之脑后了。 周日上午被省选…