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.mzph.cn/web/60118.shtml

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

相关文章

概念解读|K8s/容器云/裸金属/云原生...这些都有什么区别?

随着容器技术的日渐成熟&#xff0c;不少企业用户都对应用系统开展了容器化改造。而在容器基础架构层面&#xff0c;很多运维人员都更熟悉虚拟化环境&#xff0c;对“容器圈”的各种概念容易混淆&#xff1a;容器就是 Kubernetes 吗&#xff1f;容器云又是什么&#xff1f;容器…

【Android】线程池的解析

引言 在Android当中根据用途分为主线程与子线程&#xff0c;主线程当中主要处理与界面相关的操作&#xff0c;子线程主要进行耗时操作。除了Thread本身以外&#xff0c;在Android当中还有很多扮演者线程的角色&#xff0c;比如AsyncTask&#xff08; 底层为线程池&#xff0c;…

本地音乐服务器(三)

6. 删除音乐模块设计 6.1 删除单个音乐 1. 请求响应设计 2. 开始实现 首先在musicmapper新增操作 Music findMusicById(int id);int deleteMusicById(int musicId); 其次新增相对应的.xml代码&#xff1a; <select id"findMusicById" resultType"com.exa…

Spring Boot图书馆管理系统:疫情中的管理利器

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了疫情下图书馆管理系统的开发全过程。通过分析疫情下图书馆管理系统管理的不足&#xff0c;创建了一个计算机管理疫情下图书馆管理系统的方案。文章介绍了疫情下图…

集群聊天服务器(7)数据模块

目录 Mysql数据库代码封装头文件与源文件 Mysql数据库代码封装 业务层代码不要直接写数据库&#xff0c;因为业务层和数据层的代码逻辑也想完全区分开。万一不想存储mysql&#xff0c;想存redis的话&#xff0c;就要改动大量业务代码。解耦合就是改起来很方便。 首先需要安装m…

Linux第93步_Linux内核的LED灯驱动

Linux内核的LED灯驱动采用platfomm框架&#xff0c;因此我们只需要按照要求在“设备树文件”中添加相应的LED节点即可。 1 、通过“linux内核图形化配置界面”令“CONFIG_LEDS_GPIOy” 1)、打开终端&#xff0c;输入“cd linux/atk-mp1/linux/my_linux/linux-5.4.31/回车”&a…

Zmap+python脚本+burp实现自动化Fuzzing测试

声明 学习视频来自 B 站UP主泷羽sec&#xff0c;如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识&#xff0c;以下网站只涉及学习内容&#xff0c;其他的都与本人无关&#xff0c;切莫逾越法律红线&#xff0c;否则后果自负。 ✍&#x1f3fb;作者简介&#xff1a;致…

红外相机和RGB相机外参标定 - 无需标定板方案

1. 动机 在之前的文章中红外相机和RGB相机标定&#xff1a;实现两种模态数据融合_红外相机标定-CSDN博客 &#xff0c;介绍了如何利用标定板实现外参标定&#xff1b;但实测下来发现2个问题&#xff1a; &#xff08;1&#xff09;红外标定板尺寸问题&#xff0c;由于标定板小…

android:taskAffinity 对Activity退出时跳转的影响

android:taskAffinity 对Activity跳转的影响 概述taskAffinity 的工作机制taskAffinity对 Activity 跳转的影响一个实际的开发问题总结参考 概述 在 Android 开发中&#xff0c;任务栈&#xff08;Task&#xff09;是一个核心概念。它决定了应用程序的 Activity 如何相互交互以…

Ubuntu常见命令

关于export LD_LIBRARY_PATHcmake默认地址CMakelists.txt知识扩充/home&#xff1a;挂载新磁盘到 /home 子目录 关于export LD_LIBRARY_PATH 程序运行时默认的依赖库的位置包括lib, /usr/lib ,/usr/local/lib 通过命令export LD_LIBRARY_PATHdesired_path:$LD_LIBRARY_PATH追加…

时间类的实现

在现实生活中&#xff0c;我们常常需要计算某一天的前/后xx天是哪一天&#xff0c;算起来十分麻烦&#xff0c;为此我们不妨写一个程序&#xff0c;来减少我们的思考时间。 1.基本实现过程 为了实现时间类&#xff0c;我们需要将代码写在3个文件中&#xff0c;以增强可读性&a…

php交友源码交友系统源码相亲交友系统源码php社交系统php婚恋源码php社区交友源码vue 仿交友社交语聊技术栈

关于PHP交友、相亲、婚恋、社区交友系统的源码以及Vue仿交友社交语聊技术栈&#xff0c;以下是一些详细信息和建议&#xff1a; 一、PHP交友系统源码 系统架构设计 前端展示层&#xff1a;负责向用户提供直观友好的界面&#xff0c;包括注册登录页面、个人资料页面、匹配页面、…

Java小技艺

使用bat文件启动jar包 平时在工作中运行jar包一般是导出后命令行窗口运行 jar -jar xxx.jar 这个其实是很不方便的。可以在win上编写bat脚本去运行jar包的。 1 编写bat脚本 start jre8/bin/javaw -jar xxxx.jar2 将jre和待执行的jar包存放到一个目录下(和bat文件在同一目录…

蓝桥杯第22场小白入门赛2~5题

这场比赛开打第二题就理解错意思了&#xff0c;还以为只能用3个消除和5个消除其中一种呢&#xff0c;结果就是死活a不过去&#xff0c;第三题根本读不懂题意&#xff0c;这蓝桥杯的题面我只能说出的是一言难尽啊。。第四题写出来一点但是后来知道是错了&#xff0c;不会正解&am…

‘视’不可挡:OAK相机助力无人机智控飞行!

南京邮电大学通达学院的刘同学用我们的oak-d-lite实现精确打击无人机的避障和目标识别定位功能&#xff0c;取得了比赛冠军。我们盼望着更多的朋友们能够加入到我们OAK的队伍中来&#xff0c;参与到各式各样的比赛中去。我们相信&#xff0c;有了我们相机的助力&#xff0c;大家…

最小生成树——Kruskal、Prim算法

图的存储&#xff1a; 高阶数据结构——图 文章目录 目录 文章目录 一、kruskal算法 二、Prim算法 前言 连通图中的每一棵生成树&#xff0c;都是原图的一个极大无环子图&#xff0c;即&#xff1a;从其中删去任何一条边&#xff0c;生成树 就不在连通&#xff1b;反之&#xf…

集群聊天服务器(9)一对一聊天功能

目录 一对一聊天离线消息服务器异常处理 一对一聊天 先新添一个消息码 在业务层增加该业务 没有绑定事件处理器的话消息会派发不出去 聊天其实是服务器做一个中转 现在同时登录两个账号 收到了聊天信息 再回复一下 离线消息 声明中提供接口和方法 张三对离线的李…

华为再掀技术革新!超薄膜天线设计路由器首发!

随着Wi-Fi技术的不断进步&#xff0c;新一代的Wi-Fi 7路由器凭借其高速率、低延迟、更稳定的性能受到了广泛关注。它能够更好地满足现代家庭对网络性能的高要求&#xff0c;带来更加流畅、高效的网络体验。9月24日&#xff0c;华为在其秋季全场景新品发布会上推出了全新Wi-Fi 7…

【阅读记录-章节2】Build a Large Language Model (From Scratch)

目录 2.Working with text data2.1 Understanding word embeddings2.2 Tokenizing text通过一个简单的实验来理解文本的词元化概念关键概念 2.3 Converting tokens into token IDs实现分词器类&#xff08;Tokenizer Class&#xff09;应用分词器测试文本的编码与解码通过分词器…

SDF,一个从1978年运行至今的公共Unix Shell

关于SDF 最近发现了一个很古老的公共Unix Shell服务器&#xff0c;这个项目从1978年运行至今&#xff0c;如果对操作系统&#xff0c;对Unix感兴趣&#xff0c;可以进去玩一玩体验一下 SDF Public Access UNIX System - Free Shell Account and Shell Access 注册方式 我一…