学习vite的核心原理

Vite主要由两个部分组成

  1. 开发服务器
  • 基于原生ES模块(ESM)提供开发环境支持。
  • 提供了丰富的内建功能,如速度快到惊人的模块热更新(HMR)。这意味着开发者在修改代码时,可以实时地看到更新效果,而无需重新加载整个页面。
  • 利用现代浏览器的原生ES模块支持,将开发过程中的构建步骤推迟到了运行时,从而大大减少了启动时间。
  1. 构建指令
  • 使用Rollup作为打包工具,可以生成更小、更优化的代码块,确保生产环境的应用加载速度快。
  • Rollup是一个基于ES6的模块打包工具,其打包的文件小且干净,执行效率更高,更专注于JS打包,并支持Tree-shaking(通过工具“摇”掉JS文件中用不到的代码,是一个性能优化的范畴)。
  • 构建指令是预配置的,开箱即用,可以输出用于生产环境的高度优化过的静态资源。

Vite有哪些主要特性:

  • 冷启动优化:Vite采用原生ESM作为模块系统的实现,避免了传统打包工具在启动时的长时间编译过程,从而实现了极速的冷启动。
  • 热模块替换(HMR):Vite内置了热模块替换功能,可以在不刷新页面的情况下,实时更新模块代码,提高开发效率。
  • 原生ESM支持:Vite直接利用浏览器对ESM的支持,无需额外转换,使得代码更加原生、高效。
  • 插件化扩展:Vite支持通过插件进行扩展,开发者可以根据自己的需求,定制开发流程。

Vite的实现原理

Vite的实现原理主要基于原生ESM、Rollup以及WebSocket等技术。

  • 原生ESM:Vite利用浏览器对ESM的原生支持,将项目中的模块按照ESM的规范进行组织。在开发过程中,Vite只会处理被引用的模块,而不会对整个项目进行打包,从而实现了极速的冷启动。
  • Rollup:虽然Vite没有直接采用Webpack作为打包工具,但它借鉴了Rollup的思想。Rollup是一个轻量级的模块打包器,它采用基于ESM的tree shaking技术,可以去除未使用的代码,减少打包体积。Vite在构建生产环境代码时,会利用Rollup进行打包。因此Vite还附带了一套 构建优化 的 构建命令,开箱即用。
  • WebSocket:为了实现热模块替换功能,Vite使用WebSocket在服务器和客户端之间建立了一个长连接。当文件发生变化时,服务器会通过WebSocket将更新后的模块发送给客户端,客户端收到更新后,会替换掉原有的模块,实现热更新。

1.基于ESM的 Dev Server

在Vite出现之前,传统的打包工具如Webpack通常会在启动开发服务器之前解析所有依赖并进行打包构建。这意味着Dev Server必须等待所有模块构建完成,即使在开发过程中只修改了一个子模块,整个bundle文件也会重新打包,导致启动时间随着项目规模增大而变长。

相比之下,Vite充分利用了浏览器对ESM的原生支持。当代码执行到模块加载时,浏览器会动态地下载导入的模块,而不需要等待整个项目的构建完成。这种动态加载的方式实现了即时编译,使得暂时未用到的路由不会参与构建过程。因此,随着项目规模的增大和路由的增加,Vite的构建速度不会受到影响。

2. 基于ESM的 HRM 热更新

  1. 模块标识符的处理:Vite 在处理模块时,通过识别 import 语句中的模块标识符,可以动态地构建出模块之间的依赖关系图。
  2. WebSocket 通信:Vite 启动一个 WebSocket 服务器,用于与客户端建立持久连接,实现双向通信。通过 WebSocket,Vite 可以向客户端发送消息,告知其发生了模块变化,并触发热更新操作。
  3. 模块替换:当开发者修改了某个模块的代码后,Vite 检测到变化后,会重新编译并构建该模块。然后,Vite 通过 WebSocket 向客户端发送更新消息,告知客户端有模块发生了变化。
  4. 客户端处理:客户端接收到更新消息后,会根据更新消息中的信息,以及之前构建好的模块依赖关系图,进行相应的模块替换操作。具体来说,它会以非阻塞的方式请求被更新的模块,然后将新的模块代码插入到当前页面中,完成热更新操作。
  5. 局部更新:Vite 可以实现局部更新,即仅更新发生变化的模块,而不需要重新加载整个应用程序。这样可以显著减少开发过程中的刷新时间,提高开发效率。

总的来说,Vite 利用了浏览器原生对 ES 模块的支持,通过 WebSocket 实现了与客户端的实时通信,从而实现了基于 ESM 的热模块替换功能。这种实现方式使得开发者可以更快地看到代码修改后的效果,加快了开发迭代速度。

3. Vite实现的核心流程

  1. 启动服务器
    • Vite首先启动一个开发服务器,该服务器使用原生ESM(ECMAScript模块)规范。
    • 服务器同时创建一个WebSocket连接,用于实现与浏览器的实时通信。
  2. 解析请求
    • 当浏览器请求一个模块(例如,通过<script type="module">标签引入的JavaScript文件)时,Vite服务器接收请求。
    • 服务器解析请求,确定要加载的模块。
  3. 模块转换
    • 如果请求的模块需要转换(例如,使用Vue或React等框架编写的组件),Vite会调用相应的插件或转换器进行处理。
    • 转换后的模块被缓存起来,以便后续请求可以更快地提供服务。
  4. 发送模块到浏览器
    • Vite服务器将处理后的模块作为HTTP响应发送给浏览器。
    • 浏览器接收到模块后,按照ESM规范进行加载和执行。
  5. 文件监听与热更新
    • Vite服务器使用文件系统监听器(如chokidar)来监控项目文件的变化。
    • 当文件发生变化时(例如,保存了一个源代码文件),Vite会重新处理受影响的模块。
    • 通过WebSocket连接,Vite将更新后的模块发送给浏览器。
    • 浏览器接收到更新后,使用HMR(热模块替换)机制替换旧模块,无需重新加载整个页面。
  6. 构建生产环境代码
    • 当需要构建生产环境的代码时,Vite会使用Rollup或其他打包工具进行打包。
    • 打包过程会进行代码优化、压缩和分割等操作,以减小最终代码的体积并提高加载性能。
    • 打包完成后,生成的生产环境代码可以部署到服务器上供用户访问。

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

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

相关文章

边缘微型AI的宿主?—— RISC-V芯片

一、RISC-V技术 RISC-V&#xff08;发音为 "risk-five"&#xff09;是一种基于精简指令集计算&#xff08;RISC&#xff09;原则的开放源代码指令集架构&#xff08;ISA&#xff09;。它由加州大学伯克利分校在2010年首次发布&#xff0c;并迅速获得了全球学术界和工…

嵌入式门槛高不高,工资怎么样?

一般来说&#xff0c;嵌入式岗位的准入门槛其实并不是特别高。通常情况下&#xff0c;只要能够熟练掌握 C 语言编程以及单片机相关知识&#xff0c;就能够去制作一些较为简单的电子产品&#xff0c;由此可见其门槛相对而言是比较低的&#xff0c;相应的薪水可能也不会特别高。 …

数据库-数据定义和操纵-初始MySQL数据库

连接数据库&#xff1a; mysql -u用户名 -p密码 创建数据库&#xff1a; create database 数据库名; 命令查看MySQL中已存在的数据库 show database; 数据库中创建表的规则&#xff1a; CREATE TABLE 表名 (字段名,数据类型,字段名,数据类型,..... ) eg: 首先创建数据库&am…

速盾:cdn影响seo吗?

CDN (Content Delivery Network) 是一个分布式网络架构&#xff0c;用于在全球范围内加速网站内容的传输和分发。它通过将网站的静态资源&#xff08;例如图片、CSS、JavaScript 文件等&#xff09;存储在多个服务器上&#xff0c;使用户可以从最接近他们位置的服务器上获取这些…

计算机专业:黄金时代是否依旧?

计算机专业&#xff1a;黄金时代是否依旧&#xff1f; 随着2024年高考落幕&#xff0c;数百万高三学生将面临人生中的重要抉择&#xff1a;选择大学专业。在这个关键节点&#xff0c;计算机相关专业是否仍是“万金油”的选择&#xff1f;在过去的几十年里&#xff0c;计算机科…

LC1091:二进制矩阵中的最短路径

1091 二进制矩阵中的最短路径 这道题做起来还挺顺利的&#xff0c;挺常见的套路求最短路径&#xff0c;因为做的时候没有卡住就做完了&#xff0c;不过要注意特殊用例的判断&#xff0c;以下是AC代码&#xff1a; class Solution {// Dimensions of the gridint n, m; ​// I…

资治通鉴(二)

今天是6月15日&#xff0c;大约两个月的时间里我看完了《资治通鉴&#xff08;二&#xff09;》&#xff0c;回顾一下这本书主要讲了哪些帝王的故事。 汉武帝刘彻&#xff0c;公元前141年至前87年在位54年&#xff0c;他加强了中央集权&#xff0c;尊崇儒术&#xff0c;开创了丝…

AI Agents 的五个级别

原文地址:https://cobusgreyling.medium.com/five-levels-of-ai-agents-5ac39a7b07ed AI Agents 被定义为能够感知环境、做出决策并根据可用工具采取行动的人工实体。 2024 年 5 月 16 日 介绍 这是我非常喜欢研究的一个主题,我很期待写这篇文章。主要是因为我想揭开代理的概…

fetch_lfw_people()报错urllib.error.HTTPError: HTTP Error 403: Forbidden的解决方案

零、实验报告地址 计算机视觉实验二:基于支持向量机和随机森林的分类(Part one: 编程实现基于支持向量机的人脸识别分类 )-CSDN博客 一、代码报错 fetch_lfw_people()报错urllib.error.HTTPError: HTTP Error 403: Forbidden 二、报错原因 通常是由于访问权限不足导致的…

Mysql中索引详解

1、什么是索引 在日常学习中&#xff0c;最常见使用索引的例子就是词典&#xff0c;通过对字母进行排序&#xff0c;并设置对应的页数&#xff0c;从而循序定位某个单词&#xff0c;除了词典&#xff0c;如火车站的车次表、图书的目录等都是使用了索引。它们的原理都是一样的&…

C++11参数包...Args

以list中的包装器做介绍 包装器是由一个类模板接收后存储在统一的...Args中 标准格式 说明&#xff1a;...Args就是参数包的类型 实例&#xff1a; //参数包 void Show() {cout <<"结束" << endl; }template<class T,class ...Args> void Show(T…

RocketMq多环境自动隔离

一、多环境隔离场景 当多个环境使用同一套rocketmq的服务的时候&#xff0c;如果不对环境进行隔离&#xff0c;将会导致消息被错误的环境消费&#xff0c;因此可以采用两种方式进行隔离。 方式1 通过$Value注入&#xff0c;但是这个需要每个环境都维护自己的topic等信…

LabVIEW与C#的区别及重新开发自动测试程序的可行性分析

LabVIEW和C#是两种广泛使用的编程语言&#xff0c;各自有不同的应用领域和特点。本文将详细比较LabVIEW与C#在自动测试程序开发中的区别&#xff0c;并分析将已完成的LabVIEW自动测试程序重新用C#开发的合理性。本文帮助评估这种转换的必要性和潜在影响。 LabVIEW与C#的区别 开…

C++编程:vector容器的简单模拟实现

前言&#xff1a; 在C标准库&#xff08;STL&#xff09;中&#xff0c;vector容器是最常见使用的动态数组。它结合了链表与数组的优点&#xff0c;提供了灵活的大小调整与高效的随机访问。本文将简单的对vector容器进行介绍并且对vector容器简单的模拟实现。 一、vector的文…

Mybatis的面试题

1. 什么是一级缓存什么是二级缓存&#xff1f; MyBatis是一款优秀的持久层框架&#xff0c;它提供了一级缓存和二级缓存来提高数据库访问性能。 一级缓存 一级缓存是指在同一个SqlSession中进行的缓存。当MyBatis执行查询时&#xff0c;查询结果会被缓存在SqlSession的内存中…

uniapp实现路由拦截——实战案例(二)

uniapp如何实现登录路由拦截&#xff1f; 今天再次介绍一下 uni-simple-router 插件&#xff0c;记得最初使用时&#xff0c;是在三年以前了&#xff0c;这里简单介绍通过自动读取 pages.json 作为路由表的方式&#xff0c;欢迎指教~ 文章目录 uniapp如何实现登录路由拦截&…

LangChain入门学习笔记(二)——LangChain表达式语言(LCEL)

基于LangChain框架编写大模型应用的过程就像垒积木&#xff0c;其中的积木就是Prompts&#xff0c;LLMs和各种OutputParser等。如何将这些积木组织起来&#xff0c;除了使用基本Python语法调用对应类的方法&#xff0c;一种更灵活的方法就是使用位于LangChain-Core层中的LCEL&a…

SwiftUI 6.0(Xcode 16)全新 @Entry 和 @Previewable 宏让开发妙趣横生

概览 如火如荼的 WWDC 2024 已进入第五天&#xff0c;苹果开发平台中众多海量新功能都争先恐后的喷薄欲出。 在这里就让我们从中挑两个轻松有趣的新功能展示给小伙伴们吧&#xff1a;它们分别是 全新的 Entry 和 Previewable 宏。 在本篇博文中&#xff0c;您将学到如下内容&a…

dayjs将星期的第一天设置为周一

默认引入的dayjs的语言是英文&#xff0c;一周的开始是星期日&#xff0c;当使用dayjs().startOf(week)的时候&#xff0c;就不是周一而是周日了。 import dayjs from "dayjs" import "dayjs/locale/zh-cn" import updateLocale from "dayjs/plugin/…

【Python】 探索 CatBoost:高效的机器学习分类与回归工具

我们都找到天使了 说好了 心事不能偷藏着 什么都 一起做 幸福得 没话说 把坏脾气变成了好沟通 我们都找到天使了 约好了 负责对方的快乐 阳光下 的山坡 你素描 的以后 怎么抄袭我脑袋 想的 &#x1f3b5; 薛凯琪《找到天使了》 在机器学习领域中&#xff…