Vite: 新一代高效的前端构建工具

概述

  • 随着前端技术的飞速发展,构建工具在项目开发中扮演着至关重要的角色
  • 因为项目日益复杂,开发体验和构建效率成为了开发者关注的焦点
  • 在众多前端构建工具中,Vite凭借其独特的优势,逐渐成为开发者们的新宠
  • Vite,作为一个新兴的前端构建工具,由尤雨溪(Vue.js的作者)于2020年推出
  • 旨在解决传统构建工具如Webpack在开发环境中的启动慢、热更新延迟等问题
  • 为开发者带来了前所未有的开发速度和体验提升
  • 本文将深入探讨Vite如何解决了webpack的一系列问题,其毫秒级响应的原理
  • 以及Vite的生态和插件系统,同时还会涉及Vite底层引擎Esbuild和Rollup
  • 以及Vite与其他前端工具的结合

Vite如何解决Webpack存在的痛点

  • Webpack作为前端构建工具的佼佼者,长期以来一直受到开发者的青睐
  • 然而,随着项目规模的扩大和复杂度的增加,Webpack的启动速度和热更新性能逐渐成为其短板
  • Vite通过按需编译和ES模块热更新彻底改变了这一现状
  • Vite通过以下方式解决了这些问题:
    • 1 )即时服务启动:Vite利用浏览器原生ESM(ECMAScript模块)的特性
    • 在开发模式下,Vite利用浏览器对ES模块的原生支持
    • 直接从源文件提供服务,省去了打包步骤,使得启动时间缩短至秒级甚至毫秒级
    • 这种方式使得Vite的启动速度远超过Webpack,实现了即时服务启动
    • 2 )闪电般快速的热更新:与Webpack重新编译并传输变更模块的方式不同
    • Vite只请求变更的模块,并在浏览器端重新加载
    • 这种方式不仅提高了热更新的速度,而且不会随着模块增多而变慢
    • Vite的热更新(HMR)机制更是令人印象深刻
    • 它利用了浏览器的ES模块重加载能力,当源文件发生变化时
    • 仅需更新变动的模块,而非重新加载整个页面,大大提高了开发效率
    • 相比之下,Webpack的热更新虽然也实现了类似功能,但在大型项目中响应速度往往较慢

Vite高效工作的原理


1 )在开发效率上来说

  • 传统构建工具普遍的缺点就是太慢了, 与之相比,Vite 能毫秒级响应,将项目的启动性能提升一个量级,并且达到毫秒级的瞬间热更新效果
  • 就拿 Webpack 来说, 一般的项目使用 Webpack 之后,启动花个几分钟都是很常见的事情
  • Webpack的热更新也经常需要等待十秒以上,这主要是因为:项目冷启动时必须递归打包整个项目的依赖树, JavaScript 语言本身的性能限制,导致构建性能遇到瓶颈, 直接影响开发效率
  • 这样一来,代码改动后不能立马看到效果,自然开发体验也越来越差,而其中,最占用时间的就是代码打包和文件编译
  • 而 Vite 很好地解决了这些问题,核心在于其快速的服务启动和高效的模块热替换机制,Vite在开发模式下不生成任何打包文件,而是直接通过HTTP服务器提供源代码
  • 在开发阶段,Vite使用Esbuild作为底层引擎,对第三方依赖进行预构建,并转换为ESM格式,这使得Vite在启动时可以迅速加载依赖,并快速响应代码变更
  • 此外,Vite还利用Koa框架作为底层服务器,每个插件都可以访问Koa的上下文对象,并在请求处理过程中执行自定义逻辑,从而实现了毫秒级响应
  • Vite 在开发阶段基于浏览器原生 ESM 的支持,实现了 no-bundle 服务,借助 Esbuild 超快的编译速度来做第三方库构建和TS/JSX 语法编译,从而能够有效提高开发效率

2 )模块化相关

  • Vite 基于浏览器原生 ESM 的支持实现模块加载
  • 并且无论是开发环境还是生产环境,都可以将其他格式的产物(如 CommonJS)转换为 ESM

3 )语法转译相关

  • Vite 内置了对 TypeScript、JSX、Sass 等高级语法的支持
  • 也能够加载各种各样的静态资源,如图片、Worker 等等

4 )产物质量相关

  • Vite 基于成熟的打包工具 Rollup 实现生产环境打包
  • 同时可以配合Terser 、 Babel 等工具链,可以极大程度保证构建产物的质量

Esbuild和Rollup底层引擎

  • Vite底层深度使用了两个构建引擎:Esbuild和Rollup
  • Esbuild主要用于开发阶段的依赖预构建和转换,其高性能使得Vite在启动和响应速度上表现优异
  • Esbuild以其超快的构建速度和小体积著称,它使用Go语言编写,利用了并发和高效的代码解析算法
  • 使得打包速度远远超过JavaScript编写的同类工具
  • 而Rollup则用于生产环境的代码打包和优化
  • 确保最终构建出的代码具有高度的优化和压缩效果

1 )构建工具原理与底层实现

  • Vite的构建工具原理基于两阶段策略:开发模式和生产模式
  • 开发模式下,借助于Vite服务器直接服务ES模块,依赖预构建和ESM格式的转换
  • 并利用chokidar等工具监听文件系统的变更实现了即时加载和热更新
  • 生产模式则利用Esbuild或Rollup进行打包
  • 通过Tree Shaking、ModuleGraph、代码分割等技术优化输出文件
  • 确保最终产物的体积最小化和加载效率最大化

1.1 Esbuild

  • Esbuild利用Go语言的高效性能和专为打包设计的算法
  • 对JavaScript、CSS等资源进行高速转换和压缩
  • 同时支持并行处理和静态分析,大幅提升了构建速度

1.2 Rollup

  • 作为另一种打包方案,Rollup通过分析代码的依赖关系
  • 专注于ES模块的打包,支持代码拆分、Tree shaking等高级特性
  • 保证了输出代码的高效和简洁

2 )综上所述

  • Vite凭借其创新的开发模式、高效的构建策略、灵活的插件系统
  • 以及与其他工具的良好集成,为前端开发者提供了前所未有的开发体验
  • 无论是初创项目还是大型企业级应用,Vite都是一个值得考虑的强大工具
  • 它正引领着前端构建工具的新趋势

Vite的生态和插件系统

  • Vite拥有强大的生态和插件系统,允许开发者通过编写自定义插件来扩展Vite的功能
  • 这些插件可以用于修改Vite的默认行为、添加全局变量、处理特定类型的文件等
  • 由于Vite的插件系统基于中间件(Middleware)的概念
  • 每个插件都可以通过注册中间件来处理请求和响应
  • 这使得Vite的插件系统非常灵活和可扩展
  • 开发者可以轻松地通过Vite插件扩展其功能,比如支持TypeScript、SCSS、PWA等功能
  • Vite插件市场提供了大量的社区插件,涵盖了从基础构建到高级优化的方方面面
  • 极大地丰富了Vite的功能性

Vite与其他前端工具的结合

  • Vite可以与其他前端工具结合使用,以进一步扩展其功能
  • 在设计之初就考虑了与其他前端工具的无缝集成,如Babel和core-js
  • 例如,当在低版本浏览器上开发时,可以使用Babel插件将ECMAScript 2015+代码转换为向后兼容的JavaScript代码,Vite通过配置文件轻松集成Babel,支持按需转译
  • 此外,还可以使用core-js等库来提供对旧版浏览器的polyfill支持
  • 确保代码能够在旧浏览器中正常运行,从而在享受现代语法便利的同时,保障广泛的浏览器兼容性
  • 通过这些工具的结合使得Vite能够应对各种复杂的前端开发场景

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

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

相关文章

什么是 Java 中的 Optional 类,它如何帮助避免空指针异常?

想象一下,你正在厨房里烹饪一道美味的菜肴,需要从冰箱里取出牛奶来使用。但是,当你打开冰箱门时,发现牛奶已经喝完了,没有牛奶可用。这时,如果你直接假设牛奶一定在那里,并且不加检查就去倒牛奶…

github无法访问,下载慢的解决方法

GitHub是一个存储分享无数的开源项目和代码的宝库网站。然而,由于一些原因,国内用户在访问GitHub时常常遭遇无法访问或下载速度缓慢的问题。这不仅影响了开发者的工作效率,也使一些想要访问下载github文件的普通用户遇到困难。下面小编就来和…

如何简单的生成SSL证书

下面是简单的SSL证书生成的方法: 第1步:生成私钥 我们一般运用openSSL这个工具来生成一个RSA私钥 说明:生成rsa私钥,des3算法,2048位强度,server.key是秘钥文件名。 注意:一般生成私钥&…

Java stream操作流常用的方式

在Java中,Stream操作流是Java 8新引入的一个功能,它提供了很多强大的操作,方便我们进行集合的处理和操作。常用的Stream操作方式有: 1.过滤:使用filter()方法可以过滤掉集合中不符合条件的元素。 2.映射:…

python学习笔记四

1.自己平方本身 x2 x**4#xx**4 print(x) 2.把一个多位数拆分成单个数,方法一通过字符串下标获取对应元素,并对获取的元素使用eval函数把左右引号去掉,是字符串变为整型;方法二,通过对数进行取余和整除得到各个位的数 …

Django ORM 详解

Django ORM(Object-Relational Mapping,对象关系映射)是 Django 框架的一部分,它允许我们通过 Python 代码来操作数据库,而无需编写 SQL 语句。在这篇文章中,我们将详细介绍 Django ORM 的使用方法。 定义模型 在 Django 中,数据库的每个表都对应一个 Python 类,这个…

市面上很轻的 100kW 负载组

FX100S-C 负载组 EAK的 FX100S-C 负载组在轻质外壳中以 415Vac 50Hz 提供 100kW 的连续负载。数字仪表允许您测量功率、电压、电流和频率,同时还允许您在进行测试时记录数据。 EAK是市场上最轻的 100kW 负载组之一,它将使您能够访问其他负载组无法到达…

GPT版本通俗简单介绍

# GPT系列:人工智能语言模型的进化之旅 在人工智能的广阔天地里,自然语言处理技术一直是探索的前沿地带,而OpenAI推出的GPT(Generative Pre-trained Transformer)系列模型,无疑是这一领域内的一颗璀璨明星…

ISCC2024--pwn

ISCC2024 练武题 chaos 考点:基础UAF 分析 1.首先将附件放入IDA查看主函数功能,进入菜单函数: 注意到选项5不太一样,跟进该功能模块的函数查看: 分析得到该功能存在UAF漏洞,system(/bin/sh) 执行的前…

沙姆镜头标定与重建

沙姆定律( Scheimpflug principle)则可以保证测量平面的物体能够清晰成像, 因此能够起到调整景深区域位置的作用。Scheimpflug 镜头就是根据沙姆定律所设计的一种特殊的镜头,通过机械结构使镜头与相机本体发生一定程度的偏转&…

一文介绍 Tapable 的特性和使用,助力理解 webpack 插件架构!

一、引言 众所周知,webpack 的 plugins 非常灵活,可以在编译的不同阶段注册事件回调,这个功能便是基于 Tapable 实现的。 Tapable 的使用步骤如下: 创建钩子实例,如 SyncHook、SyncLoopHook 钩子;调用订阅接口注册事…

【树状数组 队列】1505. 最多 K 次交换相邻数位后得到的最小整数

本文涉及知识点 树状数组 队列 LeetCode1505. 最多 K 次交换相邻数位后得到的最小整数 给你一个字符串 num 和一个整数 k 。其中,num 表示一个很大的整数,字符串中的每个字符依次对应整数上的各个 数位 。 你可以交换这个整数相邻数位的数字 最多 k 次…

在线epub阅读器epub;在线图书阅读器;专门为epub定制的阅读器;免费在线电子图书epub阅读器

背景:不记得某时某刻了,就是当时想要使用电脑阅读epub图书,也找了好些个在线epub阅读器,但总有一些不如意的地方,如某些功能需要会员之类的,突发临想的就想到自己开发一个,就此,一个…

Python笔记 文件的写,追加,备份操作

一、文件的写操作 案例演示: # 1.打开文件 f open(python.txt,w)# 2.文件写入 f.write(hello world)# 3.内容刷新 f.flush() 注意: 直接调用write,内容并为真正的写入文件,二十会积攒在程序的内存中,称之为缓冲区…

Android SurfaceFlinger——OpenGL ES初始化(十三)

上一篇文章我们对 OpenGL ES 相关知识有了一定的了解,并知道在使用 OpenGL ES 是需要先通过 eglGetDisplay() 方法获取 EGLDisplay 默认主屏幕句柄。这里就分析一下 eglGetDisplay() 中的 egl_init_drivers() 初始化 OpenGL ES 的对应流程。 一、OpenGL ES初始化 1、egl.cpp…

【Docker】Docker网络模式

1、概述 docker run创建Docker容器时,可以用–net选项指定容器的网络模式,Docker有以下4种网络模式:bridge模式:使--net bridge指定,默认设置;host模式:使--net host指定;none模式&…

前端技术栈学习:Vue2、Vue cli脚手架、ElementUI组件库、Axios

1 基本介绍 (1)Vue 是一个前端框架, 易于构建用户界面 (2)Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或项目整合 (3)支持和其它类库结合使用 (4&#…

期末复习题中的问题

一、编程中(包括函数)的问题 1. malloc 头文件是stdlib.h 二、第二次写复习题的不会的 三、程序填空 总结: 删除节点m >>>>要有一个指针来遍历找到这个m >>>> 用另一个指针指向这个指针的下一 个 >>&…

达梦(DM8)数据库备份与还原(逻辑备份)一

一、达梦数据库的逻辑备份分四种级别的导出(dexp)与导入(dimp)的备份 第一种是:数据库级:导出或导入数据库中所有的对象。主要参数是:FULL 第二种是:用户级别:导出或导…

小程序的生命周期使用方法和应用场景

小程序生命周期 初始化(App Launch) • 触发时机:小程序首次启动时。 • 主要事件:onLaunch。 • 功能与适用场景: • 全局数据初始化:设置应用的全局状态和变量。 • 登录状态检查:判断用户是…