当前位置: 首页 > news >正文

什么是vite,如何使用

参考:
主要:由一次业务项目落地 Vite 的经历,我重新理解了 Vite 预构建
vite官方文档
为什么有人说 vite 快,有人却说 vite 慢?
深入理解Vite核心原理
面向未来的前端构建工具-vite
聊一聊 Vite 的预构建和二次预构建
聊一聊 Vite

Vite原理

Vite 基于 浏览器原生 ESM 规范的支持,采取了与 Webpack 完全不同的 unbundle 机制。
也就是说Vite无需像webpack那样去遍历生成模块依赖图,它在使用时直接启动了一个开发服务器devServer,劫持浏览器的HTTP请求,在中间件中对请求的文件进行处理,将项目中使用的文件通过简单的分解与整合,然后再返回给浏览器。
Vite在启动时会先做一些准备工作,比如对第三方模块进行预编译处理,然后在本地启动一个开发服务器dev server,在中间件中对请求的文件进行处理,大概处理流程如下:加载源文件、转化翻译成ESM可解析的文件,比如ts -> js, less -> css 等,分析源文件依赖,然后返回请求的js文件。
Vite整个过程中没有对文件进行打包编译,做到了真正的按需加载。因此vite编译速度很快,尤其在大型项目中表现得更加明显,大大节约了开发时间。
它在正式环境采用了rollup打包的方式,但是目前在生态上和稳定性、兼容性上还无法和webpack媲美。

esbuild打包为什么这么快呢?

esbulid是使用goLang进行打包的,goLang是静态语言,因此它的速度比使用js/ts更快。

vite内部解析

vite内部创建了一个本地的KOA server,热更新监听使用chokidar监听文件变化。模块解析、增加中间件、启动服务器。

devServer会编译代码文件,编译成浏览器可运行的代码,它具备静态文件服务功能,vite会使用serveStaticPlugin将项目根目录、public目录设置为静态目录,并且plugin中包含koa-etag中间件,文件如果发生了变化,devServer会通知变化的etag,从而达到浏览器的更新效果。

重写模块路径-非js资源打包策略-静态资源打包策略

vite会重写模块路径:

  • 相对路径转为绝对路径
  • 补齐扩展名
  • 对非js类型的文件地址会加上一个“import”的query参数。
  • hmr文件加上时间戳。
Vue脚本打包策略

Vite会引入vue的插件@vue/compiler-sfc解析vue文件,将template、style、script三部分解析出来,加上一个type=【style|template】的后缀,在打包后的vue文件中增加一个import语句引入style和template,最后渲染出vue页面。

webpack处理静态资源:1. css转为js,新建style标签插入html中。2. 图片转为图片路径或者base64。3. JSON转化为js模块

Vite和webpack对比

webpack会先打包,然后启动开发服务器,请求服务器时直接给予打包结果。 而vite是直接启动开发服务器,请求哪个模块再对该模块进行实时编译。

现代浏览器本身就支持ES Module,会自动向依赖的Module发出请求。
vite利用这一点,将开发环境下的模块文件,就作为浏览器要执行的文件,vite在启动的时候不需要打包,不需要分析模块的依赖和编译,因此启动速度快。

当浏览器请求某个模块时,再根据需要对模块内容进行编译。按需动态编译缩减了编译时间。

HMR方面,当改动了一个模块后,仅需让浏览器重新请求该模块,而webpack需要把该模块的相关依赖模块全部编译一次,效率更高。

Webpack 的热更新会以当前修改的文件为入口重新 build 打包,所有涉及到的依赖也都会被重新加载一次。虽然webpack 也采用的是局部热更新并且是有缓存机制的,但是还是需要重新打包所以很大的代码项目是真的有卡顿的现象

文件缓存:Vite 会将预构建的依赖缓存到node_modules/.vite。它根据几个源来决定是否需要重新运行预构建步骤:package.json中的 dependencies列表, package-lock等
浏览器缓存:源码模块的请求会根据 304 Not Modified 进行协商缓存,而依赖模块请求则会通过 Cache-Control: max-age=31536000,immutable 进行强缓存

Vite的优缺点

  • 优点:
    快速的冷启动: 采用No Bundle和esbuild预构建,速度远快于Webpack
    高效的热更新:基于ESM实现,同时利用HTTP头来加速整个页面的重新加载,增加缓存策略
    真正的按需加载: 基于浏览器ESM的支持,实现真正的按需加载

  • 缺点:
    生态:目前Vite的生态不如Webapck,不过生态应该也只是时间上的问题。
    生产环境由于esbuild对css和代码分割不友好使用Rollup进行打包。
    对服务器渲染方面目前没有比较成熟的方案,不过这也是生态还没有起来的一部分。
    在首屏渲染和懒加载的时候可能会比webpack慢一点,因为服务器中间件拦截请求后在响应过程中完成编译,所以第一次打开的时候,没有缓存 首屏相对而言慢一点,懒加载是因为动态加载的时候,也需要再次请求、动态编译,因此相对而言会慢。

vite使用原理

首先浏览器向开发服务器请求页面,返回一个html文件,文件中引入了需要挂载的js文件。
<script type="module" src="/src/main.js"></script>

当浏览器解析资源时,会往当前域名发起一个GET请求main.js文件

// main.js
import { createApp } from 'vue'
import App from './App.vue'
createApp(App).mount('#app')

请求到了main.js文件,会检测到内部含有import引入的包,又会import 引用发起HTTP请求获取模块的内容文件,如App.vue、vue文件

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

import { defineConfig } from 'vite'
import { resolve } from "path"; 		// 主要用于alias文件路径别名
import vue from '@vitejs/plugin-vue'
import vueJsx from "@vitejs/plugin-vue-jsx"; // jsx插件export default defineConfig({plugins: [vue(), vueJsx()], // 插件列表base: './',   				// 在生产中服务时的基本公共路径。 resolve: {alias: { "@": path.resolve(__dirname, './src'), } 	// 配置别名},// 引入第三方的配置,强制预构建插件包optimizeDeps: { include: ['echarts', 'axios', 'mockjs'], },// 打包配置build: {target: 'modules', 	// 最终构建的浏览器兼容目标。modules:支持原生 ES 模块的浏览器outDir: 'dist', 		// 指定输出路径assetsDir: 'assets', 	// 指定生成静态资源的存放路径sourcemap: false, 		// 构建后是否生成 source map 文件minify: 'terser' 		// 混淆器,terser构建后文件体积更小},// 本地运行配置,及反向代理配置server: {host: 'localhost', 		// 指定服务器主机名port: 3000, 		// 指定服务器端口open: true, 		// 在服务器启动时自动在浏览器中打开应用程序strictPort: false, // false-- 若端口已被占用则会尝试下一个可用端口,而不是直接退出https: false, 		// 是否开启 httpscors: true, 		// 为开发服务器配置 CORS。默认启用并允许任何源proxy: { 			// 为开发服务器配置自定义代理规则'/foo': 'http://192.168.xxx.xxx:xxxx', '/api': {target: 'http://192.168.xxx.xxx:xxxx', //代理接口changeOrigin: true,rewrite: (path) => path.replace(/^\/api/, '')}}}
})

相关文章:

什么是vite,如何使用

参考&#xff1a; 主要&#xff1a;由一次业务项目落地 Vite 的经历&#xff0c;我重新理解了 Vite 预构建 vite官方文档 为什么有人说 vite 快&#xff0c;有人却说 vite 慢&#xff1f; 深入理解Vite核心原理 面向未来的前端构建工具-vite 聊一聊 Vite 的预构建和二次预构建 …...

基于大语言模型的AI Agents

代理&#xff08;Agent&#xff09;指能自主感知环境并采取行动实现目标的智能体。基于大语言模型&#xff08;LLM&#xff09;的 AI Agent 利用 LLM 进行记忆检索、决策推理和行动顺序选择等&#xff0c;把Agent的智能程度提升到了新的高度。LLM驱动的Agent具体是怎么做的呢&a…...

23种设计模式之抽象工厂模式

目录 什么是抽象工厂模式 基本结构 基本实现步骤 实现代码&#xff08;有注释&#xff09; 应用场景 简单工厂、工厂方法、抽象工厂的区别 什么是抽象工厂模式 抽象工厂模式也是一种创建型设计模式&#xff0c;提供了一系列相关或相互依赖对象的接口&#xff0c;而无需…...

飞天使-linux操作的一些技巧与知识点9-zabbix6.0 容器之纸飞机告警设置

文章目录 zabbix 告警纸飞机方式webhook 方式 告警设置 zabbix 告警纸飞机方式 第一种方式参考 https://blog.csdn.net/yetugeng/article/details/99682432bash-4.4$ cat telegram.sh #!/bin/bashMSG$1TOKEN"61231432278:AAsdfsdfsdfsdHUxBwPSINc2kfOGhVik" CHAT_I…...

京东组件移动端库的使用 Nut-UI

1.介绍 NutUI NutUI-Vue 组件库&#xff0c;基于 Taro&#xff0c;使用 Vue 技术栈开发小程序应用&#xff0c;开箱即用&#xff0c;帮助研发快速开发用户界面&#xff0c;提升开发效率&#xff0c;改善开发体验。 特性 &#x1f680; 80 高质量组件&#xff0c;覆盖移动端主…...

用Python来实现2024年春晚刘谦魔术

简介 这是新春的第一篇&#xff0c;今天早上睡到了自然醒&#xff0c;打开手机刷视频就被刘谦的魔术所吸引&#xff0c;忍不住用编程去模拟一下这个过程。 首先&#xff0c;声明的一点&#xff0c;大年初一不学习&#xff0c;所以这其中涉及的数学原理约瑟夫环大家可以找找其…...

TestNG基础教程

TestNG基础教程 一、常用断言二、执行顺序三、依赖测试四、参数化测试1、通过dataProvider实现2、通过xml配置&#xff08;这里是直接跑xml&#xff09; 五、testng.xml常用配置方式1、分组维度控制2、类维度配置3、包维度配置 六、TestNG并发测试1、通过注解来实现2、通过xml来…...

###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目

前言&#xff1a;感谢您的关注哦&#xff0c;我会持续更新编程相关知识&#xff0c;愿您在这里有所收获。如果有任何问题&#xff0c;欢迎沟通交流&#xff01;期待与您在学习编程的道路上共同进步。 一. 两个主要软件的介绍 1.KeiluVision5软件 Keil uVision5是一款集成开发…...

Android 9.0 任务栏中清除掉播放器的进程,状态栏仍有音乐播放器状态问题的解决

1.概述 在9.0的rom定制化开发中,在点击系统自带的播放器以后,播放音乐的时候,在最近任务栏recents列表中,点击全部清除,发现音乐播放器还在播放音乐,导致出现bug,完整的 解决方法,肯定是需要点击全部清除以后,音乐播放器也被杀掉进程,接下来分析下这个移除任务栏流程…...

【笔记】Helm-5 Chart模板指南-13 调是模版

调试模板 调试模板可能很棘手&#xff0c;因为渲染后的模板发送了kubernetes API server&#xff0c;可能会以格式化以外的原因拒绝YAML文件。 以下命令有助于调试&#xff1a; 1、helm lint 是验证chart是否遵循最佳实践的首选工具。 2、helm template --debug在本地测试渲…...

Gateway反向代理配置

前言 一般而言&#xff0c;反向代理都是在Nginx中来实现的&#xff0c;其实Gateway也可以作为反向代理服务&#xff0c;不过一般不会这么做&#xff0c;只不过最近的项目&#xff0c;在通过Nginx反向代理之后&#xff0c;iPhone手机访问接口代理地址会异常&#xff0c;安卓手机…...

HiveSQL——共同使用ip的用户检测问题【自关联问题】

注&#xff1a;参考文章&#xff1a; SQL 之共同使用ip用户检测问题【自关联问题】-HQL面试题48【拼多多面试题】_hive sql 自关联-CSDN博客文章浏览阅读810次。0 问题描述create table log( uid char(10), ip char(15), time timestamp);insert into log valuesinsert into l…...

猫头虎分享已解决Bug ‍ || 修改mongodb3.0副本集用户密码遇到 BeanDefinitionParsingException

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …...

如何将ChatGPT升级到4.0版本?如何充值?

如何将ChatGPT升级到4.0版本&#xff1f; 在人工智能的世界里&#xff0c;每一个升级都可能带来革命性的变革。ChatGPT的4.0版本无疑是当前最炙手可热的话题之一&#xff0c;那么如何进行升级&#xff0c;体验到这一版所带来的全新特性呢&#xff1f;以下是一步一步的指南。 …...

conda 相关命令

创建并激活环境&#xff1a;打开终端&#xff0c;并创建一个新的conda环境&#xff0c;以确保安装的软件与M1芯片兼容。运行以下命令&#xff1a; conda create -n myenv python这将创建一个名为"myenv"的新环境&#xff0c;并安装Python。然后&#xff0c;激活该环境…...

探索现代Web前端开发框架:选择最适合你的工具

在当今快速发展的Web开发领域&#xff0c;前端开发框架的选择显得尤为关键。这些框架可以帮助我们更高效地构建出交互性强、性能卓越的用户界面。本文将带你了解几个当前最受欢迎的Web前端开发框架&#xff0c;并帮助你根据自己的需求选择最合适的工具。 1. React React由Fac…...

记录一下,我使用stm32实现pwm波输入,以及对频率和占空比的计算,同时通过串口输出(实现-重要)

1&#xff0c;首先看下半物理仿真 看下我的配置&#xff1a; 看下计算方法以及matlab的仿真输出的数据&#xff1a; timer3的ch2是选择高电平&#xff0c;计算频率 timer3的ch1是选择的是低电平&#xff0c;用来计算周期 其中TemPIpre表示的是CH2输出的值&#xff0c; TemPI…...

Spring Cloud使用ZooKeeper作为注册中心的示例

简单的Spring Cloud应用程序使用ZooKeeper作为注册中心的示例&#xff1a; 1.新建模块&#xff1a; 2.勾选依赖&#xff1a; 3.在pom.xml文件中做出部分修改及添加Spring Cloud Zookeeper 依赖版本&#xff1a; 完整pom文件 <?xml version"1.0" encoding&q…...

【项目日记(九)】项目整体测试,优化以及缺陷分析

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:项目日记-高并发内存池⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你做项目   &#x1f51d;&#x1f51d; 开发环境: Visual Studio 2022 项目日…...

JavaScript 设计模式之外观模式

外观模式 我们为啥要使用外观模式呢&#xff0c;其实我们在使用各种 js 库的时候常常会看到很多的外观者模式&#xff0c;也正是这些库的大量使用&#xff0c;所以使得兼容性更广泛&#xff0c;通过外观者模式来封装多个功能&#xff0c;简化底层操作方法 const A {g: functi…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...