vite面试题

news2024/11/18 15:32:11

为什么说vite比webpack更快

和webpack对比,为什么 vite 的冷启动、热启动、热更新都会快?这就要说说二者的区别。

使用 webpack 时,从 yarn start 命令启动,到最后页面展示,需要经历的过程:

  1. 以 entry 配置项为起点,做一个全量的打包,并生成一个入口文件 index.html 文件;
  2. 启动一个 node 服务;
  3. 打开浏览器,去访问入 index.html,然后去加载已经打包好的 jscss 文件;

在整个工作过程中,最重要的就是第一步中的全量打包,中间涉及到构建 module graph (涉及到大量度文件操作、文件内容解析、文件内容转换)、chunk 构建,这个需要消耗大量的时间。尽管在二次启动、热更新过程中,在构建 module graph 中可以充分利用缓存,但随着项目的规模越来越大,整个开发体验也越来越差。

 vite对比webpack,优缺点在哪

优点 :

  • 更快的冷启动Vite 借助了浏览器对 ESM 规范的支持,采取了与 Webpack 完全不同的 unbundle 机制
  • 更快的热更新Vite 采用 unbundle 机制,所以 dev server 在监听到文件发生变化以后,只需要通过 ws 连接通知浏览器去重新加载变化的文件,剩下的工作就交给浏览器去做了。

缺点:

  • 开发环境下首屏加载变慢:由于 unbundle 机制,Vite 首屏期间需要额外做其它工作。不过首屏性能差只发生在 dev server 启动以后第一次加载页面时发生。之后再 reload 页面时,首屏性能会好很多。原因是 dev server 会将之前已经完成转换的内容缓存起来
  • 开发环境下懒加载变慢:跟首屏加载变慢的原因一样。Vite 在懒加载方面的性能也比 Webpack 差。由于 unbundle 机制,动态加载的文件,需要做 resolveloadtransformparse 操作,并且还有大量的 http 请求,导致懒加载性能也受到影响。
  • webpack支持的更广。由于 Vite 基于ES Module,所以代码中不可以使用CommonJs;webpack更多的关注兼容性, 而Vite 关注浏览器端的开发体验。Vite目前生态还不如 Webpack

vite和webpack的区别

Vite 和 Webpack 都是现代化的前端构建工具,它们可以帮助开发者优化前端项目的构建和性能。虽然它们的目标是相似的,但它们在设计和实现方面有许多不同之处。

两者原理图

区别如下:

(1)构建原理: Webpack 是一个静态模块打包器,通过对项目中的 JavaScript、CSS、图片等文件进行分析,生成对应的静态资源,并且可以通过一些插件和加载器来实现各种功能;Vite 则是一种基于浏览器原生 ES 模块解析的构建工具。

(2)打包速度: Webpack 的打包速度相对较慢,Vite 的打包速度非常快。

(3)配置难度: Webpack 的配置比较复杂,因为它需要通过各种插件和加载器来实现各种功能;Vite 的配置相对简单,它可以根据不同的开发场景自动配置相应的环境变量和配置选项。

(4)插件和加载器: Webpack 有大量的插件和加载器可以使用,可以实现各种复杂的构建场景,例如代码分割、按需加载、CSS 预处理器等;Vite 的插件和加载器相对较少

(5)Vite是按需加载,webpack是全部加载: 在HMR(热更新)方面,当改动了一个模块后,vite仅需让浏览器重新请求该模块即可,不像webpack那样需要把该模块的相关依赖模块全部编译一次,效率更高。

(6)webpack是先打包再启动开发服务器,vite是直接启动开发服务器,然后按需编译依赖文件 由于vite在启动的时候不需要打包,也就意味着不需要分析模块的依赖、不需要编译,因此启动速度非常快。当浏览器请求某个模块时,再根据需要对模块内容进行编译,这种按需动态编译的方式,极大的缩减了编译时间。

什么是vite

 vite是新一代的前端构建工具

vite核心原理 

  • Vite其核心原理是利用浏览器现在已经支持ES6import,碰见import就会发送一个HTTP请求去加载文件。
  • Vite启动一个 koa 服务器拦截这些请求,并在后端进行相应的处理将项目中使用的文件通过简单的分解与整合,然后再以ESM格式返回给浏览器。
  • Vite整个过程中没有对文件进行打包编译,做到了真正的按需加载,所以其运行速度比原始的webpack开发编译速度快出许多!

它具有以下特点:

  • 快速的冷启动:采用No Bundleesbuild预构建,速度远快于Webpack
  • 高效的热更新:基于ESM实现,同时利用HTTP头来加速整个页面的重新加载,增加缓存策略:源码模块使用协商缓存,依赖模块使用强缓;因此一旦被缓存它们将不需要再次请求。
  • 基于 Rollup 打包:生产环境下由于esbuildcss代码分割并使用Rollup进行打包;

 基于ESM的Dev server

  • Vite出来之前,传统的打包工具如Webpack是先解析依赖、打包构建再启动开发服务器,Dev Server 必须等待所有模块构建完成后才能启动,当我们修改了 bundle模块中的一个子模块, 整个 bundle 文件都会重新打包然后输出。项目应用越大,启动时间越长。
  • Vite利用浏览器对ESM的支持,当 import 模块时,浏览器就会下载被导入的模块。先启动开发服务器,当代码执行到模块加载时再请求对应模块的文件,本质上实现了动态加载。 

基于ESM的HRM热更新 

所有的 HMR 原理:

目前所有的打包工具实现热更新的思路都大同小异:主要是通过WebSocket创建浏览器和服务器的通信监听文件的改变,当文件被修改时,服务端发送消息通知客户端修改相应的代码,客户端对应不同的文件进行不同的操作的更新。

Vite 的表现:

  • Vite 监听文件系统的变更,只用对发生变更的模块重新加载,这样HMR 更新速度就不会因为应用体积的增加而变慢
  • Webpack 还要经历一次打包构建。
  • 所以 HMR 场景下,Vite 表现也要好于 Webpack。 

基于Esbuild的依赖预编译优化 

Vite预编译之后,将文件缓存在node_modules/.vite/文件夹下 

为什么需要预编译&预构建 

  • 支持 非ESM 格式的依赖包:Vite是基于浏览器原生支持ESM的能力实现的,因此必须将commonJs的文件提前处理,转化成 ESM 模块并缓存入 node_modules/.vite
  • 减少模块和请求数量:Vite 将有许多内部模块的 ESM 依赖关系转换为单个模块,以提高后续页面加载性能。
    • 如果不使用esbuild进行预构建,浏览器每检测到一个import语句就会向服务器发送一个请求,如果一个三方包被分割成很多的文件,这样就会发送很多请求,会触发浏览器并发请求限制;

为什么用Esbuild 

Esbuild 打包速度太快了,比类似的工具快10~100倍, 

Esbuild为什么为么快 

  • Esbuild 使用 Go 语言编写,可以直接被转化为机器语言,在启动时直接执行;
  • 而其余大多数的打包工具基于 JS 实现,是解释型语言,需要边运行边解释;
  • JS 本质上是单线程语言,GO语言天生具有多线程的优势,充分利用 CPU 资源;

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

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

相关文章

如何制作订单工序流转报表

使用外部数据分析工具,比如百度Sugar,连接草料二维码官方数据库,即可制作自定义可视化报表。本文会具体介绍订单工序流转报表的制作流程。 一、案例效果 订单工序流转报表可以帮助管理者快速查询各订单的最新进展、是否超期,关注…

SAP Web IDE本地环境搭建

SAP Web IDE本地环境搭建 1、JDK的安装及配置环境变量 可通过官网自行下载JDK: Java Downloads | Oracle 直接傻瓜式安装至默认路径“C:\Program Files\Java\jdk-17.0.2”,然后配置环境变量“JAVA_HOME”、“CLASSPATH”和“PATH”。 JAVA_HOME&…

MySQL的基础学习

文章目录 一、MySQL NULL 值处理二、MySQL 正则表达式三、MySQL 事务四、MySQL ALTER命令总结 一、MySQL NULL 值处理 MySQL 使用 SQL SELECT 命令及 WHERE 子句来读取数据表中的数据,但是当提供的查询条件字段为 NULL 时,该命令可能就无法正常工作。 为了处理这种…

HTTP常用请求头和响应头有哪些?

一、什么是http 超文本传输协议( Hypertext Transfer Protocol ,HTTP)的请求和响应消息中,协议头部分的那些组件。用来准确描述正在获取的资源、服务器或者客户端的行为,定义了HTTP事务中的具体操作参数。 二、什么是…

webGL前端数字孪生技术方案

本篇内容本是为公司内部分享会准备的大纲,发出来给想做webGL的前端做个参考。 课程介绍: 基于webGL技术,实现数字孪生应用。讲解从模型绘制、webGL框架、数据通讯等方案的技术选型。初步了解图形学的基础内容,熟悉webGL的开发流程…

瀚高股份吕新杰:创新开源双驱动 躬耕国产数据库

近年来,国际形势不断变幻,也给人们带来巨大警示:关键核心技术是买不来、讨不来的,中国科技企业需寻找研发自强之路。 瀚高基础软件股份有限公司(简称瀚高股份)专注数据库十八年,始终以“振兴民…

【技巧分享】Nacos未经授权的登录漏洞-任意密码直接登录后台

文章目录 前言一、nacos简介二、漏洞复现总结 前言 碰到个很有意思的系统&#xff0c;Nacos。通过查找资料&#xff0c;发现Nacos < 2.1.0 版本都存在这个漏洞。 漏洞描述&#xff1a;Nacos中发现影响Nacos < 2.1.0的问题&#xff0c;Nacos用户使用默认JWT密钥导致未授…

好用还免费的10个Figma插件推荐

Figma是一款广受设计师喜爱的工具&#xff0c;可用于创建和协作用户界面、图形和原型。它广泛应用的原因之一是因为有许多插件可供选择&#xff0c;可以增强其功能。在本文中&#xff0c;我们将探讨10个设计师必备的Figma插件。如果你无法使用Figma 可以使用即时设计——即时设…

OpenAI最新官方ChatGPT聊天插件接口《智能聊天插件引言》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(一)(附源码)

Chat Plugins Limited Alpha 聊天插件 前言IntroductionPlugin flow 插件流其它资料下载 Learn how to build a plugin that allows ChatGPT to intelligently call your API. 了解如何构建允许ChatGPT智能调用API的插件。 前言 在现代的软件开发环境中&#xff0c;使用第三方…

Doris使用总结

场景 Apache Doris是由百度贡献的开源MPP分析型数据库产品&#xff0c;亚秒级查询响应时间&#xff0c;支持实时数据分析&#xff1b;分布式架构简洁&#xff0c;易于运维&#xff0c;可以支持10PB以上的超大数据集&#xff1b;可以满足多种数据分析需求&#xff0c;例如固定历…

Maven(六):Maven的使用——继承与聚合

Maven&#xff08;六&#xff09;&#xff1a;Maven的使用——继承与聚合 前言一、实验九&#xff1a;继承1、概念2、作用3、举例4、操作4.1 创建父工程4.2 创建模块工程4.3 查看被添加新内容的父工程 pom.xml4.4 解读子工程的pom.xml4.5 在父工程中配置依赖的统一管理4.6 子工…

电脑端(PC)按键精灵——5.找色/找图命令

电脑端(PC)按键精灵——5.找色/找图命令 注&#xff1a;说了键盘、鼠标、其他、控制命令还有安装内容&#xff0c;现在说下颜色/图形命令&#xff0c;这一节相当重要 按键精灵小白入门详细教程&#xff1a; 电脑端(PC)按键精灵—小白入门 详细教程 命令介绍 1.GetPixelCol…

人大金仓携手深信服打造更高效、更融合一体化平台联合解决方案

近日&#xff0c;人大金仓数据库与深信服超融合平台完成深度优化&#xff0c;表现出性能更优、运行更稳定、数据更安全。双方联合打造更高效、更融合的一体化平台联合解决方案&#xff0c;能更好地满足行业信创升级需求。 随着新一轮信创政策陆续出台&#xff0c;信创产业从党政…

基于 SpringBoot + Vue 实现的可视化拖拽编辑的大屏项目

今天给小伙伴们分享一个基于 SpringBoot Vue 实现的可视化拖拽编辑的大屏项目&#xff1b; 一、简介 这个是一个开源的一个BI平台&#xff0c;酷炫大屏展示&#xff0c;能随时随地掌控业务动态&#xff0c;让每个决策都有数据支撑。 多数据源支持&#xff0c;内置mysql、el…

攻防世界-Reversing-x64Elf-100

Reversing-x64Elf-100 18最佳Writeup由 yuchouxuan 提供 收藏 反馈 难度&#xff1a;1 方向&#xff1a;Reverse 题解数&#xff1a;15 解出人数&#xff1a;2460 题目来源: 题目描述: 暂无 note:undefined8 FUN_004006fd(long param_1){int local_2c;char *local_28 …

设置环境变量

文章目录 window设置linux设置python设置 window设置 命令行设置 set 临时设置setx 永久设置 # 打开一个cmd命令行 set # 查看所有环境变量 set FLASK_APPsuperset # 临时设置&#xff0c;当前窗口有效 set FLASK_APP%FLASK_APP%;777 # # 查看 echo %FLASK_APP%# 永久设置…

1.18 从0开始学习Unity游戏开发--资源加载

在上一篇文章中&#xff0c;我们大约是开始接触到资源加载的事情了&#xff0c;场景资源则是一个比较特殊的资源&#xff0c;我们只要添加到Build Settings里面&#xff0c;那么我们就可以通过API直接加载。 但是其他类型的资源怎么办呢&#xff1f;比如我们制作一个网络游戏&…

为什么Spring和IDEA不推荐使用@Autowired注解?

在Spring开发中&#xff0c;Autowired注解是一个常用的依赖注入方式。但是&#xff0c;你可能会惊奇地发现&#xff0c;Spring和IDEA都不推荐使用Autowired注解。关于这个问题&#xff0c;其实答案相对统一&#xff0c;实际上用大白话说起来也容易理解。 官方答案 首先&#…

使用springboot解释什么是jwt

目录 使用springboot解释什么是jwt简介组成结构在springboot中的作用1. 添加依赖 在pom.xml文件中添加以下依赖2. 配置JWT 在Spring Boot的配置文件中配置JWT的相关参数&#xff0c;例如密钥、过期时间等&#xff1a;3. 创建JWT工具类 创建一个JWT工具类&#xff0c;用于生成和…

数据治理体系建设

01 数据治理建设路径 1. 业务数字化的目的是打造一体化的业务流、信息流与数据流 从企业整体经营管理的角度&#xff0c;战略制定及分解—领域业务目标制定—业务方案设计—业务需求识别 & 信息系统功能及数据库设计—数据汇聚及分析—业务目标监测及改善&#xff0c;这个…