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文件,并且这些文件会被压缩和优化以提高性能。
- 构建后的文件会存放在