Vite 基础理解及应用
文章目录
- 概要
- Vite基础知识点
- 1. 快速启动和热更新
- 热更新原理
 
- 2. 基于ES模块的构建
- 3. 对不同前端框架的支持
 
- vite.config.js配置实例
- 1. 基本结构
- 2. 服务器相关配置
- 3. 输入输出路径配置
- 4. 打包优化配置
 
 
- 项目构建
- 一、项目初始化
- 二、项目结构理解
- 三、CSS处理
- 四、静态资源处理
- 五、构建项目用于生产环境
 
 
概要
Vite基础知识点
1. 快速启动和热更新
- Vite利用浏览器原生ES模块的支持实现快速启动。在开发模式下,它不需要像传统构建工具那样进行完整的项目构建。当启动开发服务器时,Vite仅需启动一个轻量级的服务器,然后根据浏览器请求按需加载模块。
- 热更新方面,Vite的HMR(热模块替换)非常高效。当修改代码时,它能准确地更新变化的模块,保持应用的当前状态,极大地提高了开发效率。例如,在修改一个Vue组件的样式或方法时,页面不会重新加载,组件会即时更新。
热更新原理
- 基于ES模块的依赖追踪 - Vite利用了浏览器对ES模块的原生支持。在开发模式下,浏览器请求的每个模块都有一个对应的URL。例如,当浏览器加载一个JavaScript模块(如main.js)时,Vite的开发服务器会根据这个请求找到对应的文件并返回。
- 每个ES模块都可以通过import和export语句来声明依赖关系。Vite会解析这些模块的依赖,构建一个依赖图。例如,main.js可能会导入componentA.js和util.js,Vite会记录这种依赖关系。当componentA.js或util.js发生变化时,Vite可以通过这个依赖图快速定位到哪些模块会受到影响。
 
- Vite利用了浏览器对ES模块的原生支持。在开发模式下,浏览器请求的每个模块都有一个对应的URL。例如,当浏览器加载一个JavaScript模块(如
- Websocket通信实现实时更新 - Vite在开发服务器和浏览器之间建立了一个Websocket连接。当文件发生修改时,开发服务器会通过这个Websocket连接向浏览器发送更新消息。
- 这个更新消息包含了修改的文件信息和更新类型(如样式更新、脚本更新等)。例如,当修改了一个CSS文件,服务器会发送消息告诉浏览器需要更新对应的样式,浏览器收到消息后,会根据消息内容采取相应的更新策略。
 
- 模块热替换(HMR)策略 - 样式更新: - 对于CSS样式的更新,Vite采用的策略相对简单直接。当CSS文件发生变化时,服务器发送更新消息给浏览器,浏览器会重新请求新的CSS文件内容,并将其应用到页面上,从而实现样式的即时更新。这种更新不会引起页面的重新加载,用户可以立即看到样式变化后的效果。
 
- 脚本更新: - 对于JavaScript模块的更新,Vite会根据模块的类型和更新内容采取不同的策略。如果是一个纯函数模块(如工具函数模块)更新,Vite会尝试用新的模块内容替换旧的模块内容,同时保持引用这个模块的其他模块的状态不变。
- 如果是一个组件模块更新,Vite会重新执行更新后的组件模块代码,更新组件的渲染函数或生命周期函数等,然后将更新后的组件重新渲染到页面上。在这个过程中,会尽可能地保留组件的状态,例如,组件中的data属性值(如果是Vue组件)或useState钩子的值(如果是React组件)等会尽量保持不变,从而实现平滑的更新。
 
 
- 样式更新: 
- 缓存机制辅助更新 - Vite在开发过程中会对已经加载过的模块进行缓存。当收到更新消息时,它会先检查缓存中的模块信息。如果缓存中的模块与更新后的模块有关联,Vite会根据更新内容和缓存信息来优化更新过程。
- 例如,一个被多个组件引用的工具模块发生了变化,Vite可以利用缓存信息快速确定哪些组件引用了这个模块,然后只对这些相关组件进行更新,而不是重新加载所有组件,提高了更新效率。
 
2. 基于ES模块的构建
- Vite基于ES模块构建项目。这意味着在开发过程中,可以直接在浏览器中使用原生的import和export语法。这种方式使得代码的依赖关系更加清晰,同时也便于浏览器进行优化。在生产构建时,Vite会将这些ES模块转换为适合生产环境的格式。
3. 对不同前端框架的支持
- Vite对多种前端框架有很好的支持,如Vue、React、Preact等。对于Vue3,它与Vue的响应式系统和组件模型完美配合。通过相应的插件(如@vitejs/plugin - vue),可以轻松地在Vite项目中开发Vue3应用。
vite.config.js配置实例
1. 基本结构
以下是一个简单的vite.config.js文件的基本结构:
import { defineConfig } from 'vite';
export default defineConfig({// 配置项将写在这里
});
2. 服务器相关配置
- 端口配置
 可以指定开发服务器的端口号,例如将端口设置为8080:
server: {port: 8080
}
- 跨域配置
 如果需要解决开发环境中的跨域问题,可以配置服务器代理。假设后端API服务器在http://localhost:3000/api,以下是一个代理配置示例:
server: {proxy: {'/api': {target: 'http://localhost:3000',changeOrigin: true,rewrite: (path) => path.replace(/^\/api/, '')}}
}
3. 输入输出路径配置
- 输入路径(项目入口)
 默认情况下,Vite以index.html为入口。如果需要指定其他入口文件,可以这样配置(不过这种情况比较少见):
build: {rollupOptions: {input: 'src/main.js'}
}
- 输出路径(构建目录)
 可以指定构建后的文件输出目录,例如将输出目录设置为dist-build:
build: {outDir: 'dist-build'
}
4. 打包优化配置
- 压缩配置
 在生产构建时,可以配置代码压缩。Vite默认使用terser进行JavaScript压缩。以下是开启压缩并设置一些压缩选项的示例:
build: {minify: 'terser',terserOptions: {compress: {drop_console: true,drop_debugger: true}}
}
- 静态资源处理优化
 对于静态资源(如图片、字体等),可以配置优化选项。例如,设置图片的最大尺寸,超过该尺寸的图片将被压缩:
build: {assetsInlineLimit: 4096 // 单位为字节,这里表示4KB
}
- Vue3项目打包优化相关配置(结合Vite) - Tree - Shaking
 Vue3项目在Vite中可以很好地利用Tree - Shaking来去除未使用的代码。确保在package.json中正确配置依赖,Vite会自动处理。例如,如果只使用了Vue3的部分功能,未使用的模块不会被打包。
- 模块分割优化
 对于Vue3的大型应用,可以配置Vite进行更精细的模块分割。比如,将不同路由对应的组件拆分成单独的模块,在路由切换时按需加载。以下是一个简单的路由级代码分割示例(假设使用Vue Router):
 在const Home = () => import('./views/Home.vue'); const About = () => import('./views/About.vue'); const routes = [{ path: '/', component: Home },{ path: '/about', component: About } ];vite.config.js中,可以进一步优化这种分割:build: {rollupOptions: {output: {manualChunks: {'home - chunk': [ './views/Home.vue' ],'about - chunk': [ './views/About.vue' ]}}} }
 
- Tree - Shaking
这些配置可以根据项目的实际需求进行调整和扩展,以达到最佳的开发和生产构建效果。
项目构建
一、项目初始化
- 创建项目目录 - 首先,创建一个新的项目文件夹,例如my-vite-project。
- 在命令行中可以使用mkdir my-vite-project(在类Unix系统中)来创建目录。
 
- 首先,创建一个新的项目文件夹,例如
- 安装Vite - 进入项目目录后,通过npm init vite@latest命令来初始化一个Vite项目。
- 执行该命令后,会提示你输入项目名称、选择框架(如Vue、React、Preact等)和变体(如JavaScript或TypeScript)。
- 例如,如果你选择Vue和JavaScript,Vite会自动为你创建一个基本的Vue项目结构,其中包含package.json文件(用于管理项目依赖)、index.html(HTML入口文件)、src文件夹(包含主要的JavaScript/TypeScript和CSS等源文件)等。
 
- 进入项目目录后,通过
- 安装依赖并启动项目 - 完成项目初始化后,在项目目录下运行npm install来安装所有必要的依赖。
- 然后使用npm run dev命令启动开发服务器。Vite会在本地启动一个开发服务器,通常默认端口是5173,你可以在浏览器中访问http://localhost:5173来查看项目。
 
- 完成项目初始化后,在项目目录下运行
二、项目结构理解
- index.html文件- 这是项目的HTML入口文件。与传统的构建工具不同,Vite直接使用这个HTML文件作为入口,而不是通过JavaScript入口文件来隐式引用HTML。
- 在index.html中,你会看到类似<script type="module" src="/src/main.js"></script>的代码。这里的type="module"表示这是一个JavaScript模块,Vite利用浏览器原生的ES模块支持来加载和处理这些模块。
 
- src文件夹- src/main.js(如果是Vue项目)或者- src/index.js(如果是其他框架或纯JavaScript项目)通常是项目的主要JavaScript入口文件。
- 这个文件可能会导入其他组件、样式或工具函数等。例如,在Vue项目中,它会创建一个Vue应用并挂载到id为app的DOM元素上,代码可能如下:
 - import { createApp } from 'vue'; import App from './App.vue'; const app = createApp(App); app.mount('#app');- src文件夹还可能包含其他组件文件(如- .vue文件用于Vue项目)、样式文件(- .css、- .scss等)和其他辅助的JavaScript文件。
 
三、CSS处理
- 导入CSS文件 - 在JavaScript文件中,可以很方便地导入CSS文件。例如,在main.js中可以这样导入一个styles.css文件:
 import './styles.css';- 当Vite处理这个导入时,它会将CSS文件的内容以适当的方式注入到HTML文件中,确保样式能够正确应用。
 
- 在JavaScript文件中,可以很方便地导入CSS文件。例如,在
- CSS预处理器支持 - Vite支持CSS预处理器,如Sass(.scss)和Less(.less)。
- 要使用Sass,首先需要安装sass依赖(npm install - - save - dev sass)。
- 然后就可以在项目中创建.scss文件,并像导入普通CSS文件一样在JavaScript文件中导入它们。例如,import './styles.scss';。
 
- Vite支持CSS预处理器,如Sass(
四、静态资源处理
- 导入图片等资源 - 在Vite项目中,可以直接在JavaScript或CSS文件中导入图片、字体等静态资源。
- 例如,在一个Vue组件中导入一张图片:
 <template><img :src="imageUrl" alt="My Image"> </template> <script> import myImage from './my - image.png'; export default {data() {return {imageUrl: myImage};} }; </script>- Vite会自动处理这些资源的路径,并将它们正确地复制到构建后的输出目录中。
 
- 公共文件夹(public)- 项目中的public文件夹用于存放一些不需要经过Vite处理的静态资源。
- 这些资源可以通过相对于index.html的路径直接访问。例如,如果你在public文件夹中有一个logo.png文件,你可以在index.html中通过<img src="/logo.png" alt="Logo">来访问它。
 
- 项目中的
五、构建项目用于生产环境
- 构建命令 - 当项目开发完成后,需要将项目构建为可以在生产环境部署的版本。在Vite中,可以使用npm run build命令来进行构建。
- Vite会将项目中的代码进行优化,包括压缩JavaScript和CSS文件、处理静态资源的路径等操作。
 
- 当项目开发完成后,需要将项目构建为可以在生产环境部署的版本。在Vite中,可以使用
- 构建输出目录 - 构建后的文件会存放在dist目录(默认情况下)。这个目录中的文件可以直接部署到Web服务器上,供用户访问。
- 例如,index.html文件会被更新,其中的脚本和样式引用会指向构建后的JavaScript和CSS文件,并且这些文件会被压缩和优化以提高性能。
 
- 构建后的文件会存放在
相关文章:
Vite 基础理解及应用
文章目录 概要Vite基础知识点1. 快速启动和热更新热更新原理 2. 基于ES模块的构建3. 对不同前端框架的支持 vite.config.js配置实例1. 基本结构2. 服务器相关配置3. 输入输出路径配置4. 打包优化配置 项目构建一、项目初始化二、项目结构理解三、CSS处理四、静态资源处理五、构…...
 
[JAVA]用MyBatis框架实现一个简单的数据查询操作
基于在前面几章我们已经学习了对MyBatis进行环境配置,并利用SqlSessionFactory核心接口生成了sqlSession对象对数据库进行交互,执行增删改查操作。这里我们就先来学习如何对数据进行查询的操作,具体查询操作有以下几个步骤 创建实体类创建Ma…...
CSS 样式的优先级?
在CSS中,样式的优先级决定了当多个样式规则应用于同一个元素时,哪个样式会被最终使用。以下是一些决定CSS样式优先级的规则: 就近原则: 最后应用在元素上的样式具有最高优先级。这意味着如果两个选择器都应用了相同的样式…...
 
Linux驱动开发快速入门——字符设备驱动(直接操作寄存器设备树版)
Linux驱动开发快速入门——字符设备驱动 前言 笔者使用开发板型号:正点原子的IMX6ULL-alpha开发板。ubuntu版本为:20.04。写此文也是以备忘为目的。 字符设备驱动 本小结将以直接操作寄存器的方式控制一个LED灯,可以通过read系统调用可以…...
 
数据结构《栈和队列》
文章目录 一、什么是栈?1.1 栈的模拟实现1.2 关于栈的例题 二、什么是队列?2.2 队列的模拟实现2.2 关于队列的例题 总结 提示:关于栈和队列的实现其实很简单,基本上是对之前的顺序表和链表的一种应用,代码部分也不难。…...
 
C# 超链接控件LinkLabel无法触发Alt快捷键
在C#中,为控件添加快捷键的方式有两种,其中一种就是Windows中较为常见的Alt快捷键,比如运行对话框,记事本菜单等。只需要按下 Alt 框号中带下划线的字母即可触发该控件的点击操作。如图所示 在C#开发中,实现类似的操作…...
 
JVM类加载过程-Loading
一、Class对象的生命周期 .class文件是如何加载到内存中:.class文件是ClassLoader通过IO将文件读到内存,再通过双亲委派的模式进行Loading,再Linking、以及Initializing,代码调用等一系列操作后,进行GC,组成完整的生命周期; 二、双亲委派模式(Loading的过程): 1、类…...
2024年11月19日Github流行趋势
项目名称:build-your-own-x 项目维护者:danistefanovic, rohitpaulk, sarupbanskota 等项目介绍:通过从零开始重新创建你最喜欢的技术来掌握编程。项目star数:312,081项目fork数:29,004 项目名称:freqtrad…...
 
详细描述一下Elasticsearch索引文档的过程?
大家好,我是锋哥。今天分享关于【详细描述一下Elasticsearch索引文档的过程?】面试题。希望对大家有帮助; 详细描述一下Elasticsearch索引文档的过程? Elasticsearch的索引文档过程是其核心功能之一,涉及将数据存储到…...
 
基于css的Grid布局和vue实现点击左移右移轮播过渡动画效果
直接上代码,以下代码基于vue2,需要Vue3或者react可以使用国内直连GPT/Claude来帮你转换下 代码如下: // ScrollCardsGrid.vue <template><div class"scroll-cards-container"><!-- 左箭头 --><div v-show"showLef…...
 
HarmonyOS NEXT应用元服务开发Intents Kit(意图框架服务)习惯推荐方案概述
一、习惯推荐是HarmonyOS学习用户的行为习惯后做出的主动预测推荐。 1.开发者将用户在应用/元服务内的使用行为向HarmonyOS共享,使得HarmonyOS可以基于共享的数据学习用户的行为习惯。 2.在HarmonyOS学习到用户的行为习惯后,会给用户推荐相应功能&#x…...
【AtCoder】Beginner Contest 380-F.Exchange Game
题目链接 Problem Statement Takahashi and Aoki will play a game using cards with numbers written on them. Initially, Takahashi has N N N cards with numbers A 1 , … , A N A_1, \ldots, A_N A1,…,AN in his hand, Aoki has M M M cards with numbers B …...
 
30. 并发编程
一、什么是多任务 如果一个操作系统上同时运行了多个程序,那么称这个操作系统就是 多任务的操作系统,例如:Windows、Mac、Android、IOS、Harmony 等。如果是一个程序,它可以同时执行多个事情,那么就称为 多任务的程序。…...
 
【包教包会】CocosCreator3.x框架——带翻页特效的场景切换
一、效果演示 二、如何获取 1、https://gitee.com/szrpf/TurnPage 2、解压,导入cocos creator(版本3.8.2),可以直接运行Demo演示 三、算法思路 1、单场景 页面预制体 通过loadScene来切换页面,无法实现页面特效。…...
k8s上面的Redis集群链接不上master的解决办法
问题描述 之前在k8s上面部署了一台node,然后创建了6个redis的pod,构建了一个redis的集群,正常运行。 最近添加了一台slave node,然后把其中的几个redis的pod调度到了slave node上面,结果集群就起不来了,…...
 
<项目代码>YOLOv8 瞳孔识别<目标检测>
YOLOv8是一种单阶段(one-stage)检测算法,它将目标检测问题转化为一个回归问题,能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法(如Faster R-CNN),YOLOv8具有更高的…...
 
网络编程-002-UDP通信
1.UDP通信的简单介绍 1.1不需要通信握手,无需维持连接,网络带宽需求较小,而实时性要求高 1.2 包大小有限制,不发大于路径MTU的数据包 1.3容易丢包 1.4 可以实现一对多,多对多 2.客户端与服务端=发送端与接收端 代码框架 收数据方一般都是客户端/接收端 3.头文件 #i…...
 
MySQL更换瀚高语法更换
MySQL更换瀚高语法更换 一、前言二、语句 一、前言 水一篇,mysql更换瀚高之后,一些需要更换的语法介绍 > 二、语句 MySQL瀚高MySQL用法瀚高用法说明ifnull(x,y)coalesce(x,y)相同相同用于检查两个表达式并返回第一个非空表达式。如果第一个表达式不是 NULL&…...
Object.prototype.hasOwnProperty.call(item, key) 作用与用途
在 JavaScript 中,Object.prototype.hasOwnProperty.call(item, key) 是一种检查对象 item 是否具有特定属性 key 作为自身的属性(而不是继承自原型链)的方法。这种调用方式是安全的,特别是在处理可能被修改过原型链的对象时。 解…...
DNS的10种资源记录
前言 在DNS(域名系统)中,常见的资源记录(Resource Records, RR)用于存储域名与IP地址、邮件服务器等网络资源之间的映射关系。以下是几种常见的DNS资源记录: 1. A记录(Address Record…...
 
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
 
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
 
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
 
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
 
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
 
并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
