vite 底层解析

vite

目前大多数框架的前端构建工具都已经被vite取代,相信你已经使用过vite了。可是在使用过程中,vite对我来说一直是模糊的,现在就来一探究竟,为啥它更好?
接下来我将为从以下几点出发,究其原理

一、原生ES模块

1、Common JS

  • 文件即模块,每一个文件都是一个 Module 实例,所有代码都运行带模块作用域,不会污染全局作用域(因为CommonJS 输出的是值的拷贝)
  • 所有文件运行时同步加载,模块加载的顺序是按照其在代码中出现的顺序,加载完再执行。
  • 每个模块加载一次后就会被缓存。后续require时,①先检查缓存中是否存在,②如果缓存中没有,检查是否是核心模块,如果是就直接加载,③如果不是核心模块,检查是否是文件模块,解析路径,根据解出的路径定位文件,然后执行,④如果以上都不是,沿当前路径向上级逐级递归,直到根目录的 node_modules 目录
  • CommonJS 模块直接放在浏览器中是无法执行的,所以要想在浏览器中运行,需要使用额外的工具(browserify

2、ES Module

  • 浏览器支持: ES6 Module 也被成为 ES Module,是由ESMAScript 官方提出的模块化规范。目前已经得到了现代浏览器的支持。如果在HTML中加入type ="module"属性的 script 标签,那么浏览器会按照 ES Module 规范来进行以来加载和模块解析,这也是 vite 在开发阶段实现 no-bundle 的原因。由于浏览器可以加载模块,所以即使不打包可以顺利运行模块代码。
  • 动态导入,按需加载
<script type="module">(async () => {const moduleSpecifier = './lib.mjs';const {repeat, shout} = await import(moduleSpecifier);repeat('hello');// → 'hello hello'shout('Dynamic import in action');// → 'DYNAMIC IMPORT IN ACTION!'})();
</script>
  • import map:支持绝对路径(www.baidi.com)、相对路径(./module),同时支持直接写一个第三方包名,如 react、lodash。前两种都是浏览器原生支持的,但是对于第三中,放在浏览器中是无法直接执行的,ESM 解决了这个问题,这里不详细解释,可自行搜索

vite 利用浏览器对原生ES模块的支持,采用按需加载的方式,每次请求一个模块,Vite仅仅返回该模块的内容,而不是整个应用的捆绑文件。
但是!webpack是通过捆绑的方式,将所有模块打包成一个或多个文件,这意味着什么,意味着我们在启动项目是需要对整个应用进行打包,会导致长时间的等待

二、预构建

1、预构建解决了什么问题

  • 将其他格式(例如 UMD 、CommonJS)的产物转换为 ESM 格式,使其在浏览器通过 <script type = "module"><script/> 的方式正常加载。举个例子:大名鼎鼎的 React 就是基于 CommonJS ,而这种格式在vite中是无法直接运行的,但是Vite 没有办法限制第三方的规范,所以改变不了别人,那就改变自己,内部转换
  • 打包第三方库的代码,将各个第三方库分散的文件合并在一起,减少 HTTP 请求,避免页面加载性能劣化。举个例子:loadsh-es 是ES 版本,vite可以直接运行,但实际上,在它加载时会发出特别多的请求,导致页面加载的前几秒几乎处于卡顿状态。每次 import 都会触发一个新的文件请求,如果不加控制,会触发成百上千个网络请求,而 Chrome 对同一个域名在只能同时支持 6 个 HTTP 并发请求,导致页面加载十分缓慢。在加入依赖预构建之后,loadsh-es 的代码被打包成一个文件,这样请求的数量会减少很多,减轻浏览器压力,页面加载速度变快。

三、双引擎(EsBuild 和 Rollup)

1、EsBuild 预构建

esbuild 在 Vite 中的作用集中在提升构建速度、优化依赖处理和简化开发体验

  • 快速构建
    esbuild 是用 go 编写的构建工具,具有极快的编译速度。使得 Vite 在开发环境中可以快速响应文件变更,提供及时反馈
  • 多核并存
    js 是单线程串行,esbuild 直接新开一个线程 ,多线程并行,充分发挥多核优势
  • 代码压缩,减少内存
    esbuild 提供了一个 minify 配置允许用户去压缩代码体积

2、Rollup 打包

vite 选择在生产环境中利用Rollup打包,并基于Rollup 本身成熟的打包能力进行扩展和优化

  • css代码分割。如果某个异步模块中引入了一些 CSS 代码,Vite 就会自动将这些 CSS 抽取出来生成单独的文件,提高线上产物的缓存复用率。
  • 自动预加载。Vite 会自动为入口 chunk 的依赖自动生成预加载标签。这种适当预加载的做法会让浏览器提前下载好资源,优化页面性能。
  • 异步Chunks 加载优化。在异步引入的 Chunk 中,通常会有一些公用的模块,如现有两个异步引入的 Chunk: A 和 B,而且两者有一个公共依赖 C一般情况下,Rollup 打包之后,会先请求 A,然后浏览器在加载 A 的过程中才决定请求和加载 C,但 Vite 进行优化之后,请求 A的同时会自动预加载 C,通过优化 Rollup 产物依赖加载方式节省了不必要的网络开销。
  • 多产物配置。同一个入口文件,打包出多种格式的产物
const buildOptions = {input: ["src/index.js"],// 将 output 改造成一个数组output: [{dir: "dist/es",format: "esm",},{dir: "dist/cjs",format: "cjs",},],
};export default buildOptions;
  • 多入口配置,将 input 设置为一个数组或者一个对象:
{input: ["src/index.js", "src/util.js"]
}
// 或者
{input: {index: "src/index.js",util: "src/util.js",},
}

四、热模块更新(HMR)

vite 热更新过程

  1. 创建一个 websocket 服务端和 client 文件,启动服务
  2. 通过 chokidar 监听文件变更
  3. 当代码变更后,服务端进行判断并推送到客户端
  4. 客户端根据推荐的信息执行不同操作的更新
    在这里插入图片描述

webpack 热更新过程

  1. 使用 webpack-dev-server (后面简称 WDS)托管静态资源,同时以 Runtime 方式注入一段处理 HMR 逻辑的客户端代码;
  2. 浏览器加载页面后,与 WDS 建立 WebSocket 连接;
    Webpack 监听到文件变化后,增量构建发生变更的模块,
  3. 通过 WebSocket 发送 hash 事件;
  4. 浏览器接收到 hash 事件后,请求 manifest 资源文件,确认增量变更范围;
  5. 浏览器加载发生变更的增量模块;
  6. Webpack 运行时触发变更模块的 module.hot.accept 回调,执行代码变更逻辑;
  7. done。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis篇(应用案例 - 商户查询缓存)

目录 一、什么是缓存? 二、为什么要使用缓存 三、如何使用缓存 四、添加商户缓存 1. 缓存模型和思路 2. 代码如下 五、缓存更新策略 1. 内存淘汰 2. 超时剔除 3. 主动更新 六、数据库缓存不一致解决方案 1. 数据库缓存不一致解决方案 2. 数据库和缓存不一致采用什…

excel统计分析(4): 多元线性回归分析

用途&#xff1a;研究多个自变量&#xff08;也称为预测变量或解释变量&#xff09;与一个因变量&#xff08;也称为响应变量&#xff09;之间的线性关系。 多元线性回归分析模型&#xff1a;Yβ0β1X1β2X2…βkXkϵ Y 是因变量。1,X2,…,Xk 是自变量。β0 是截距项。β1,β2,…

Colorful/七彩虹将星X15 AT 23 英特尔13代处理器 Win11原厂OEM系统 带COLORFUL一键还原

安装完毕自带原厂驱动和预装软件以及一键恢复功能&#xff0c;自动重建COLORFUL RECOVERY功能&#xff0c;恢复到新机开箱状态。 【格式】&#xff1a;iso 【系统类型】&#xff1a;Windows11 原厂系统下载网址&#xff1a;http://www.bioxt.cn 注意&#xff1a;安装系统会…

Vue中集中常见的布局方式

布局叠加 完整代码最外层的Container设置为relative&#xff0c;内部的几个box设置为absolute <template><div class"container"><div class"box box1">Box 1</div><div class"box box2">Box 2</div><d…

cobaltstrike之execute-assembly内存加载—后渗透利用

通过execute-assembly内存加载来执行文件&#xff0c;从而避免后渗透中被杀毒软件静态报毒&#xff0c;使更多的工具能够继续利用&#xff0c;常见的方式有权限维持&#xff0c;代理上线等操作 远程bin文件加载 首先尝试远程加载bin文件 使用项目https://github.com/shanekha…

时序预测|基于灰狼优化LightGBM的时间序列预测Matlab程序GWO-LightGBM 单变量和多变量 含基础模型

时序预测|基于灰狼优化LightGBM的时间序列预测Matlab程序GWO-LightGBM 单变量和多变量 含基础模型 文章目录 一、基本原理原理概述流程注意事项 二、实验结果三、核心代码四、代码获取五、总结 一、基本原理 时序预测中使用灰狼优化&#xff08;GWO&#xff09;结合LightGBM的…

828华为云征文|部署多功能集成的协作知识库 AFFiNE

828华为云征文&#xff5c;部署多功能集成的协作知识库 AFFiNE 一、Flexus云服务器X实例介绍二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置2.4 Docker 环境搭建 三、Flexus云服务器X实例部署 AFFiNE3.1 AFFiNE 介绍3.2 AFFiNE 部署3.3 AFFiNE 使用 四、…

如何让系统u盘重新可用

目录 引言开始操作遇到的错误 引言 我们将 u 盘制作为系统 U 盘后&#xff0c;U 盘就没法在电脑中正常识别出了。当装完系统&#xff0c;不再需要 u 盘充当系统 U 盘想要正常使用该 U 盘&#xff0c;这时候就需要有些操作&#xff0c;让这个 U 盘正常化。 上图就是充当系统盘的…

elementui/plus灯下面的指示怎么改成圆圈或者隐藏

改成圆圈的步骤 改成没有indicator-position指示的位置/或者隐藏

58 深层循环神经网络_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录深度循环神经网络1. 模型复杂性增加2. 训练数据不足3. 梯度消失和爆炸4. 正则化不足5. 特征冗余总结 函数依赖关系简洁实现训练与预测小结练习 深度循环神经网络 &#x1f3f7;sec_deep_rnn 到目前为止&#xff0c;我们只讨论了具有一个单…

基于Hive和Hadoop的招聘分析系统

本项目是一个基于大数据技术的招聘分析系统&#xff0c;旨在为用户提供全面的招聘信息和深入的职位市场分析。系统采用 Hadoop 平台进行大规模数据存储和处理&#xff0c;利用 MapReduce 进行数据分析和处理&#xff0c;通过 Sqoop 实现数据的导入导出&#xff0c;以 Spark 为核…

【Qt笔记】QFrame控件详解

目录 引言 一、QFrame的基本特性 二、QFrame的常用方法 2.1 边框形状&#xff08;Frame Shape&#xff09; 2.2 阴影样式&#xff08;Frame Shadow&#xff09; 2.3 线条宽度&#xff08;Line Width&#xff09; 2.4 样式表(styleSheet) 三、QFrame的应用场景 四、应用…

京东健康高级项目经理段一凡受邀为第四届中国项目经理大会演讲嘉宾

全国项目经理专业人士年度盛会 京东健康技术产品部高级项目经理段一凡先生受邀为PMO评论主办的全国项目经理专业人士年度盛会——2024第四届中国项目经理大会演讲嘉宾&#xff0c;演讲议题为“项目经理如何做好资源管理——货币化资源管理实践”。大会将于10月26-27日在北京举办…

7.字符串 Strings

作业系统链接 字符串文字可以使用单引号、双引号或三引号来定义&#xff0c;其中三引号特别适用于多行字符串。转义序列如\n&#xff08;换行&#xff09;和\t&#xff08;制表符&#xff09;在字符串中起到特殊作用。字符串方法如replace()、strip()、lower()和upper()提供了丰…

C++之STL—常用拷贝和替换算法

copy(iterator beg, iterator end, iterator dest); // 按值查找元素&#xff0c;找到返回指定位置迭代器&#xff0c;找不到返回结束迭代器位置 // beg 开始迭代器 // end 结束迭代器 // dest 目标起始迭代器 replace(iterator beg, iterator end, oldvalue, newvalue); …

ComfyUI | 好用的人体 衣服分割工具-③-Layer Style | 超多实用功能 | 强烈推荐

这里为大家分享检测人体的脸部、五官、头发、手臂、腿、脚&#xff0c;上衣、裤子、背景的插件&#xff0c;能够生成出对应的蒙版mask&#xff0c;接入到ComfyUI中&#xff0c;用于后续处理&#xff0c;如局部重绘&#xff0c;换背景等。 &#xff08;需要相关插件的同学可自…

无人机之虚拟云台技术篇

一、概念解释 虚拟云台技术&#xff0c;并非直接安装在无人机上的机械装置&#xff0c;而是通过软件算法和传感器技术&#xff0c;模拟出物理云台的功能&#xff0c;实现对相机或传感器的稳定控制。这种技术通过高精度的算法和实时数据处理&#xff0c;能够在无人机飞行过程中&…

酒水速送小程序开发制作方案

在餐饮娱乐领域&#xff0c;即时酒水配送服务逐渐成为市场新宠。开发一款集在线选购、快速配送、于一体的酒水配送小程序&#xff0c;以满足用户在家中、聚会场所或商业活动中即时获取各类酒水的需求&#xff0c;提升用户体验&#xff0c;拓宽酒水销售渠道。 目标用户 年轻消费…

顶顶通呼叫中心中间件-机器人话术挂机后是否处理完成事件

前言 问题&#xff1a;机器人放音的过程中&#xff0c;如果用户直接挂机就会继续匹配下一个流程&#xff0c;如果匹配上的是放音节点&#xff0c;还会进行放音&#xff0c;那么在数据库表中就会多出一条放音记录。 解决方法 一、话术添加一个全局挂机节点 需要在话术中添加一…

C++在线开发环境搭建(WEBIDE)

C在线开发环境搭建 一、环境说明1.1 系统基础环境说明1.1 docker-ce社区版安装 二、codeserver构建2.1 构建codeserver环境的docker容器2.2 构建docker镜像2.3 运行docker2.4 运行展示 三、构建codeserver中的c开发环境3.1 插件下载3.2 插件安装 四、其他知识4.2 code-server配…