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…...
【数据分享】1981-2024年我国逐日最低气温栅格数据(免费获取)
气象数据一直是一个价值很高的数据,它被广泛用于各个领域的研究当中。之前我们分享过来源于美国国家海洋和大气管理局(NOAA)下设的国家环境信息中心(NCEI)发布的1929-2024年全球站点的逐日最低气温数据(可查看之前的文章获悉详情&…...
Kafka进阶_1.生产消息
文章目录 一、Controller选举二、生产消息2.1、创建待发送数据2.2、创建生产者对象,发送数据2.3、发送回调2.3.1、异步发送2.3.2、同步发送 2.4、拦截器2.5、序列化器2.6、分区器2.7、消息可靠性2.7.1、acks 02.7.2、acks 1(默认)2.7.3、acks -1或all 2.8、部分重…...
百度世界2024:智能体引领AI应用新纪元
在近日盛大举行的百度世界2024大会上,百度创始人李彦宏以一场题为“文心一言”的精彩演讲,再次将全球科技界的目光聚焦于人工智能(AI)的无限可能。作为一名科技自媒体,我深感这场演讲不仅是对百度AI技术实力的一次全面…...
NIST 发布后量子密码学转型战略草案
美国国家标准与技术研究所 (NIST) 发布了其初步战略草案,即内部报告 (IR) 8547,标题为“向后量子密码标准过渡”。 该草案概述了 NIST 从当前易受量子计算攻击的加密算法迁移到抗量子替代算法的战略。该草案于 2024 年 11 月 12 日发布,开放…...
同向双指针
长度最小的子数组 力扣209 #define MIN(a, b) ((b) < (a) ? (b) : (a)) int minSubArrayLen(int target, int* nums, int numsSize) {int ans numsSize 1;int left 0;int right 0;int sum 0;for (right 0; right < numsSize; right){sum nums[right];while (su…...
小鹏汽车大数据面试题及参考答案
抽象类与接口的区别是什么? 抽象类是一种不能被实例化的类,它可以包含抽象方法和非抽象方法。抽象方法是没有具体实现的方法,必须在子类中被实现。抽象类主要用于为一组相关的类提供一个通用的模板,子类可以继承抽象类并实现其中的抽象方法,也可以使用抽象类中的非抽象方法…...
华为再掀技术革新!超薄膜天线设计路由器首发!
随着Wi-Fi技术的不断进步,新一代的Wi-Fi 7路由器凭借其高速率、低延迟、更稳定的性能受到了广泛关注。它能够更好地满足现代家庭对网络性能的高要求,带来更加流畅、高效的网络体验。9月24日,华为在其秋季全场景新品发布会上推出了全新Wi-Fi 7…...
CREO TOOLKIT二次开发学习之字符转换
在tk中,有很多都是可以直接强制转换的,本文章只列举字符相关的转换。 不建议使用tk官方手册的函数进行转换,因此下文均以原生c进行举例。 //double转wstring wstring a; double b; ato_wstring(b);//wstring转double wstring wstr L"…...
vmware虚拟机安装Windows11提示电脑不符合要求?
vmware虚拟机安装Win11提示电脑不符合要求? 安装问题能进入选择语言界面,请看这不能进入选择语言界面,请看这 安装问题 Vmware虚拟机安装Windows11时提示电脑不符合要求,如下: 修改了虚拟机的硬件配置还是不行&#x…...
【金融风控项目-08】:特征构造
文章目录 1.数据准备1.1 风控建模特征数据1.2 人行征信数据1.3 据之间的内在逻辑 2 样本设计和特征框架2.1 定义观察期样本2.2 数据EDA(Explore Data Analysis)2.3 梳理特征框架 3 特征构造3.1 静态信息和时间截面特征3.2 未来信息问题3.2.1 未来信息案例3.2.2 时间序列特征的未…...
网站图片不是本站的对seo有什么不好/上海做网站优化
用:target伪类实现Tab切换效果真的非常简单!简单到什么程度呢?它只需要下面这些代码。 style.css: .song-info {position: absolute;background: #fff; }#song-info:target, #song-lyricCN:target, #song-lyricEN:target {z-inde…...
网站开发用的开源系统/怎么seo关键词优化排名
下载了第五版:/Users/baidu/Documents/Data/Interview/算法与数据结构/《CareerCupTop150Questions5th.pdf》 参考这篇文章给出的分类: http://www.cnblogs.com/wei-li/p/3318929.html#Careercup 上面这篇文章相当不错 我是通过下面这篇文章找到上面这个…...
wordpress 标题空格/学生个人网页设计模板
当多线程并发访问一个方法(函数)时的线程安全问题 首先, 所有线程访问的是同一个方法吗? NO, 方法之于线程 就好像 程序之于进程一样,每一次执行都是独立的, 是在某一个数据集上的一次执行.这样来看: 方法是一段程序代码,在内存某个空间,假设是0000H到0100H,线程a执行到…...
ping wordpress/北京搜索关键词优化
#hadoop之shell命令 ##一、启动命令 启动hadoop:start-dfs.sh,start-yarn.sh 关闭hadoop:stop-dfs.sh,stop-yarn.sh 启动hdfs时可在任意节点,启动yarn得在相应yarn的主节点上执行 hadoop fs -命令(hado…...
如何渗透wordpress的网站/哪个app可以找培训班
文章目录一、rsync概述二、rsync优缺点1)优点2)缺点三、rsyncinotify配置与安装1)rsync安装2)rsync配置3)启动rsync服务4)测试验证5)编译安装 inotify-tools1、inotify-tools概述2、优化inotify…...
天津最好的网站建设/赣州seo顾问
需求 实现wan/lan自适应,当wan口接到上级路由的时候,自动切换为wan功能,当wan口接到PC电脑时,自动切换为LAN口 分析 如果只是实现wan、lan自适应,不考虑wan切换到lan之后,连接到lan和设备可以互通,则不需要做如下修改,如果需要实现wan切换到lan之后,需要连接到lan的设…...