Vite 基础理解及应用

文章目录

    • 概要
      • Vite基础知识点
        • 1. 快速启动和热更新
          • 热更新原理
        • 2. 基于ES模块的构建
        • 3. 对不同前端框架的支持
      • vite.config.js配置实例
        • 1. 基本结构
        • 2. 服务器相关配置
        • 3. 输入输出路径配置
        • 4. 打包优化配置
    • 项目构建
      • 一、项目初始化
      • 二、项目结构理解
      • 三、CSS处理
      • 四、静态资源处理
      • 五、构建项目用于生产环境

概要

Vite基础知识点

1. 快速启动和热更新
  • Vite利用浏览器原生ES模块的支持实现快速启动。在开发模式下,它不需要像传统构建工具那样进行完整的项目构建。当启动开发服务器时,Vite仅需启动一个轻量级的服务器,然后根据浏览器请求按需加载模块。
  • 热更新方面,Vite的HMR(热模块替换)非常高效。当修改代码时,它能准确地更新变化的模块,保持应用的当前状态,极大地提高了开发效率。例如,在修改一个Vue组件的样式或方法时,页面不会重新加载,组件会即时更新。
热更新原理
  1. 基于ES模块的依赖追踪
    • Vite利用了浏览器对ES模块的原生支持。在开发模式下,浏览器请求的每个模块都有一个对应的URL。例如,当浏览器加载一个JavaScript模块(如main.js)时,Vite的开发服务器会根据这个请求找到对应的文件并返回。
    • 每个ES模块都可以通过importexport语句来声明依赖关系。Vite会解析这些模块的依赖,构建一个依赖图。例如,main.js可能会导入componentA.jsutil.js,Vite会记录这种依赖关系。当componentA.jsutil.js发生变化时,Vite可以通过这个依赖图快速定位到哪些模块会受到影响。
  2. Websocket通信实现实时更新
    • Vite在开发服务器和浏览器之间建立了一个Websocket连接。当文件发生修改时,开发服务器会通过这个Websocket连接向浏览器发送更新消息。
    • 这个更新消息包含了修改的文件信息和更新类型(如样式更新、脚本更新等)。例如,当修改了一个CSS文件,服务器会发送消息告诉浏览器需要更新对应的样式,浏览器收到消息后,会根据消息内容采取相应的更新策略。
  3. 模块热替换(HMR)策略
    • 样式更新
      • 对于CSS样式的更新,Vite采用的策略相对简单直接。当CSS文件发生变化时,服务器发送更新消息给浏览器,浏览器会重新请求新的CSS文件内容,并将其应用到页面上,从而实现样式的即时更新。这种更新不会引起页面的重新加载,用户可以立即看到样式变化后的效果。
    • 脚本更新
      • 对于JavaScript模块的更新,Vite会根据模块的类型和更新内容采取不同的策略。如果是一个纯函数模块(如工具函数模块)更新,Vite会尝试用新的模块内容替换旧的模块内容,同时保持引用这个模块的其他模块的状态不变。
      • 如果是一个组件模块更新,Vite会重新执行更新后的组件模块代码,更新组件的渲染函数或生命周期函数等,然后将更新后的组件重新渲染到页面上。在这个过程中,会尽可能地保留组件的状态,例如,组件中的data属性值(如果是Vue组件)或useState钩子的值(如果是React组件)等会尽量保持不变,从而实现平滑的更新。
  4. 缓存机制辅助更新
    • Vite在开发过程中会对已经加载过的模块进行缓存。当收到更新消息时,它会先检查缓存中的模块信息。如果缓存中的模块与更新后的模块有关联,Vite会根据更新内容和缓存信息来优化更新过程。
    • 例如,一个被多个组件引用的工具模块发生了变化,Vite可以利用缓存信息快速确定哪些组件引用了这个模块,然后只对这些相关组件进行更新,而不是重新加载所有组件,提高了更新效率。
2. 基于ES模块的构建
  • Vite基于ES模块构建项目。这意味着在开发过程中,可以直接在浏览器中使用原生的importexport语法。这种方式使得代码的依赖关系更加清晰,同时也便于浏览器进行优化。在生产构建时,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' ]}}}
      }
      

这些配置可以根据项目的实际需求进行调整和扩展,以达到最佳的开发和生产构建效果。

项目构建

一、项目初始化

  1. 创建项目目录
    • 首先,创建一个新的项目文件夹,例如my-vite-project
    • 在命令行中可以使用mkdir my-vite-project(在类Unix系统中)来创建目录。
  2. 安装Vite
    • 进入项目目录后,通过npm init vite@latest命令来初始化一个Vite项目。
    • 执行该命令后,会提示你输入项目名称、选择框架(如Vue、React、Preact等)和变体(如JavaScript或TypeScript)。
    • 例如,如果你选择Vue和JavaScript,Vite会自动为你创建一个基本的Vue项目结构,其中包含package.json文件(用于管理项目依赖)、index.html(HTML入口文件)、src文件夹(包含主要的JavaScript/TypeScript和CSS等源文件)等。
  3. 安装依赖并启动项目
    • 完成项目初始化后,在项目目录下运行npm install来安装所有必要的依赖。
    • 然后使用npm run dev命令启动开发服务器。Vite会在本地启动一个开发服务器,通常默认端口是5173,你可以在浏览器中访问http://localhost:5173来查看项目。

二、项目结构理解

  1. index.html文件
    • 这是项目的HTML入口文件。与传统的构建工具不同,Vite直接使用这个HTML文件作为入口,而不是通过JavaScript入口文件来隐式引用HTML。
    • index.html中,你会看到类似<script type="module" src="/src/main.js"></script>的代码。这里的type="module"表示这是一个JavaScript模块,Vite利用浏览器原生的ES模块支持来加载和处理这些模块。
  2. src文件夹
    • src/main.js(如果是Vue项目)或者src/index.js(如果是其他框架或纯JavaScript项目)通常是项目的主要JavaScript入口文件。
    • 这个文件可能会导入其他组件、样式或工具函数等。例如,在Vue项目中,它会创建一个Vue应用并挂载到idapp的DOM元素上,代码可能如下:
    import { createApp } from 'vue';
    import App from './App.vue';
    const app = createApp(App);
    app.mount('#app');
    
    • src文件夹还可能包含其他组件文件(如.vue文件用于Vue项目)、样式文件(.css.scss等)和其他辅助的JavaScript文件。

三、CSS处理

  1. 导入CSS文件
    • 在JavaScript文件中,可以很方便地导入CSS文件。例如,在main.js中可以这样导入一个styles.css文件:
    import './styles.css';
    
    • 当Vite处理这个导入时,它会将CSS文件的内容以适当的方式注入到HTML文件中,确保样式能够正确应用。
  2. CSS预处理器支持
    • Vite支持CSS预处理器,如Sass(.scss)和Less(.less)。
    • 要使用Sass,首先需要安装sass依赖(npm install - - save - dev sass)。
    • 然后就可以在项目中创建.scss文件,并像导入普通CSS文件一样在JavaScript文件中导入它们。例如,import './styles.scss';

四、静态资源处理

  1. 导入图片等资源
    • 在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会自动处理这些资源的路径,并将它们正确地复制到构建后的输出目录中。
  2. 公共文件夹(public
    • 项目中的public文件夹用于存放一些不需要经过Vite处理的静态资源。
    • 这些资源可以通过相对于index.html的路径直接访问。例如,如果你在public文件夹中有一个logo.png文件,你可以在index.html中通过<img src="/logo.png" alt="Logo">来访问它。

五、构建项目用于生产环境

  1. 构建命令
    • 当项目开发完成后,需要将项目构建为可以在生产环境部署的版本。在Vite中,可以使用npm run build命令来进行构建。
    • Vite会将项目中的代码进行优化,包括压缩JavaScript和CSS文件、处理静态资源的路径等操作。
  2. 构建输出目录
    • 构建后的文件会存放在dist目录(默认情况下)。这个目录中的文件可以直接部署到Web服务器上,供用户访问。
    • 例如,index.html文件会被更新,其中的脚本和样式引用会指向构建后的JavaScript和CSS文件,并且这些文件会被压缩和优化以提高性能。

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

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

相关文章

无人机航测技术算法概述!

一、核心技术 传感器技术&#xff1a; GPS/GLONASS&#xff1a;无人机通过卫星定位系统实现高精度的飞行控制和数据采集。 高清相机&#xff1a;用于拍摄地面图像&#xff0c;通过后续图像处理生成三维模型。 激光雷达&#xff08;LiDAR&#xff09;&#xff1a;通过激光扫…

uniapp 自定义加载组件,全屏加载,局部加载 (微信小程序)

效果图 全屏加载 页面加载使用 局部加载 列表加载里面使用 使用gif html <template><view><view class"" v-if"typeFullScreen"><view class"loading" v-if"show"><view class""><i…

【D3.js in Action 3 精译_040】4.4 D3 弧形图的绘制方法

当前内容所在位置&#xff1a; 第四章 直线、曲线与弧线的绘制 ✔️ 4.1 坐标轴的创建&#xff08;上篇&#xff09; 4.1.1 D3 中的边距约定&#xff08;中篇&#xff09;4.1.2 坐标轴的生成&#xff08;中篇&#xff09; 4.1.2.1 比例尺的声明&#xff08;中篇&#xff09;4.1…

element ui 走马灯一页展示多个数据实现

element ui 走马灯一页展示多个数据实现 element ui 走马灯一页展示多个数据实现 element ui 走马灯一页展示多个数据实现 主要是对走马灯的数据的操作&#xff0c;先看js处理 let list [{ i: 1, name: 1 },{ i: 2, name: 2 },{ i: 3, name: 3 },{ i: 4, name: 4 },]let newL…

使用MaxKB搭建知识库问答系统并接入个人网站(halo)

首发地址&#xff08;欢迎大家访问&#xff09;&#xff1a;使用MaxKB搭建知识库问答系统并接入个人网站 前言 从OpenAI推出ChatGPT到现在&#xff0c;大模型已经渗透到各行各业&#xff0c;大模型也逐渐趋于平民化&#xff1b;从最开始对其理解、生成、强大的知识积累的惊叹&…

Linux进阶:软件安装、网络操作、端口、进程等

软件安装 yum 和 apt 均需要root权限 CentOS系统使用&#xff1a; yum [install remove search] [-y] 软件名称 install 安装remove 卸载search 搜索-y&#xff0c;自动确认 Ubuntu系统使用 apt [install remove search] [-y] 软件名称 install 安装remove 卸载search 搜索-y&…

如何解决飞书网页文字无法复制的问题

如何解决网页文字无法复制的问题&#xff1f;特别推荐提词宝防复制文案功能&#xff01; 在日常工作和学习中&#xff0c;我们经常遇到一些网页文字无法复制的情况&#xff0c;无论是因为权限限制还是其他原因&#xff0c;手动输入内容不仅耗时费力&#xff0c;还容易出错。那…

STM32电源管理—实现低功耗

注&#xff1a; 本文是学习野火的指南针开发板过程的学习笔记&#xff0c;可能有误&#xff0c;详细请看B站野火官方配套视频教程&#xff08;这个教程真的讲的很详细&#xff0c;请给官方三连吧&#xff09; 在响应绿色发展的同时&#xff0c;在很多应用场合中都对电子设备的功…

Linux网络:守护进程

Linux网络&#xff1a;守护进程 会话进程组会话终端 守护进程setsiddaemon 在创建一个网络服务后&#xff0c;往往这个服务进程是一直运行的。但是对于大部分进程来说&#xff0c;如果退出终端&#xff0c;这个终端上创建的所有进程都会退出&#xff0c;这就导致进程的生命周期…

基于深度学习的文本信息提取方法研究(pytorch python textcnn框架)

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

Seatunnel解决Excel中无法将数字类型转换成字符串类型以及源码打包

需求 需要实现将Excel中的数字类型的单元格像数据库中字符串类型的字段中推送 问题原因 Seatunnel在读取字段类型的时候都是使用强转的形式去获取数据的 假如说数据类型不一样的话直接强转就会报错 修改位置 org/apache/seatunnel/api/table/type/SeaTunnelRow.java org…

AntFlow 0.11.0版发布,增加springboot starter模块,一款设计上借鉴钉钉工作流的免费企业级审批流平台

AntFlow 0.11.0版发布,增加springboot starter模块,一款设计上借鉴钉钉工作流的免费企业级审批流平台 传统老牌工作流引擎比如activiti,flowable或者camunda等虽然功能强大&#xff0c;也被企业广泛采用&#xff0c;然后也存着在诸如学习曲线陡峭&#xff0c;上手难度大&#x…

UniAPP快速入门教程(一)

一、下载HBuilder 首先需要下载HBuilder开发工具&#xff0c;下载地址:https://www.dcloud.io/hbuilderx.htmlhttps://www.dcloud.io/hbuilder.html 选择Windows正式版.zip文件下载。下载解压后直接运行解压目录里的HBuilderX.exe就可以启动HBuilder。 UniApp的插件市场网址…

计算机网络 (5)数据通信的基础知识

前言 数据通信是一种以信息处理技术和计算机技术为基础的通信方式&#xff0c;它通过数据通信系统将数据以某种信号方式从一处传送到另一处&#xff0c;为计算机网络的应用和发展提供了技术支持和可靠的通信环境&#xff0c;是现代通信技术的关键部分。 一、数据通信的基本概念…

K8s学习笔记之了解k8s的网络模型

文章目录 docker 网络模型容器与容器之间&#xff0c;容器与宿主机之间如何通信容器访问外部网络外部网络访问容器 k8s 网络模型CNIpod 网络配置流程 k8s 热门网络插件介绍Flannel 来源Calico 来源Cilium 来源 k8s 网络插件的工作模式Flannel 的工作模式Calico 的工作模式BGP 和…

Python 三种方式实现自动化任务

在这篇文章中&#xff0c;我们将介绍一些用Python实现机器人过程自动化的包。机器人流程自动化&#xff08;Robotic process automation&#xff0c;简称RPA&#xff09;是指将鼠标点击和键盘按压自动化的过程&#xff0c;即模拟人类用户的操作。RPA用于各种应用程序&#xff0…

时代变迁对传统机器人等方向课程的巨大撕裂

2020年之后&#xff0c;全面转型新质课程规划&#xff0c;传统课程规划全部转为经验。 农耕-代表性生产关系-封建分配制度主要生产力-人力工业-代表性生产关系-资本分配制度工业分为机械时代&#xff0c;电气时代&#xff0c;信息时代&#xff1b;主要生产力-人力转为人脑&…

流程图图解@RequestBody @RequestPart @RequestParam @ModelAttribute

RequestBody 只能用一次&#xff0c;因为只有一个请求体 #mermaid-svg-8WZfkzl0GPvOiNj3 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-8WZfkzl0GPvOiNj3 .error-icon{fill:#552222;}#mermaid-svg-8WZfkzl0GPvOiNj…

学习记录:js算法(九十九):冗余连接

文章目录 冗余连接思路一 冗余连接 树可以看成是一个连通且 无环 的 无向 图。 给定往一棵 n 个节点 (节点值 1&#xff5e;n) 的树中添加一条边后的图。添加的边的两个顶点包含在 1 到 n 中间&#xff0c;且这条附加的边不属于树中已存在的边。图的信息记录于长度为 n 的二维数…

ISUP协议视频平台EasyCVR私有化部署视频平台如何实现RTMP推流将大疆无人机的视频画面回传?

在现代视频监控和流媒体技术领域&#xff0c;EasyCVR视频融合云平台以其卓越的性能和灵活性&#xff0c;成为了跨区域、网络化视频监控综合管理的理想选择。作为TSINGSEE青犀视频“云边端”架构体系中的核心组件&#xff0c;私有化部署视频平台EasyCVR不仅能够实现视频数据的集…