引言
Vite 能成为各框架的「默认构建器」,靠的是框架插件把 Vite 的通用能力转译成框架语法——.vue 单文件、JSX/TSX、.svelte 组件、Solid 的响应式编译。本文系统讲框架集成:先说明框架插件做什么(语法转译 + HMR 注入 + 配置预设),再逐个拆解 React / Vue / Svelte / Solid 的集成要点与常见坑,最后给出「选框架插件 + 从零集成」的决策清单,让你能快速为任何框架搭好 Vite 工程。
前置:/vite-scaffold-engineering/(create-vite 起步)、/vite-plugin-development/(插件机制)。框架知识见 [[frontend]]。
目录
- 1. 框架插件在 Vite 中扮演什么角色
- 2. create-vite 框架预设:一分钟起项目
- 3. React 集成:@vitejs/plugin-react 与 Fast Refresh
- 4. Vue 集成:@vitejs/plugin-vue 与 SFC 支持
- 5. Svelte 与 Solid:响应式编译与细粒度更新
- 6. 手动集成:从零接入一个框架
- 7. 多框架共存与混合工程
- 8. 框架插件 vs 通用插件:如何选择
- 9. 框架集成常见坑
- 10. 速查表
- 延伸阅读
1. 框架插件在 Vite 中扮演什么角色
框架插件 = 语法转译 + HMR 注入 + 开发预设:
React:JSX/TSX → 浏览器可执行 + react-refresh(保留 Hook 状态)
Vue: .vue SFC(template/script/style)→ 编译为 JS + 组件级 HMR
Svelte:.svelte → 编译期响应式 JS(运行时零依赖)
Solid: JSX → 编译期细粒度响应式
插件做的三件事:
| 职责 | 说明 |
|---|---|
| 语法转译 | transform 钩子把框架语法转成 JS |
| HMR 注入 | 注入 import.meta.hot 边界(见 /vite-hmr-internals/) |
| 配置预设 | 预设 alias(@ → src)、loader、JSX 开关 |
心智:Vite 核心不认识任何框架——所有框架能力都是通过「插件」注入的,所以选对插件 = 框架体验的全部。
2. create-vite 框架预设:一分钟起项目
create-vite 自带框架模板:
# React
npm create vite@latest my-app -- --template react
npm create vite@latest my-app -- --template react-ts
# Vue
npm create vite@latest my-app -- --template vue
npm create vite@latest my-app -- --template vue-ts
# Svelte / Solid / Preact / Lit / vanilla
npm create vite@latest my-app -- --template svelte
npm create vite@latest my-app -- --template solid
常用模板速查:
| 模板 | 说明 |
|---|---|
vanilla | 无框架纯 JS |
react / react-ts | React + JSX |
vue / vue-ts | Vue SFC |
svelte / svelte-ts | Svelte |
solid / solid-ts | Solid |
preact | Preact(React 兼容) |
记忆:
--template xxx是官方最权威的起点——生产级配置已就绪,别自己手搓基础工程。
3. React 集成:@vitejs/plugin-react 与 Fast Refresh
配置:
// vite.config.ts
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
export default defineConfig({
plugins: [react()],
})
plugin-react 做了什么:
| 能力 | 说明 |
|---|---|
| JSX/TSX 转译 | esbuild 快速转换 |
| Fast Refresh | react-refresh 保留 Hook 状态 |
| 自动 JSX runtime | 无需手动 import React |
| Babel 管线 | 可选(如装饰器/插件) |
| HMR 边界 | 组件级热更新 |
React 集成注意点:
// ✅ 默认 JSX runtime(vite 自动处理)
export function App() { return <h1>Hi</h1> }
// Fast Refresh 限制
export const Comp = () => ... // 导出组件必须大写开头
export default App // 只导出组件(非组件导出会降级全量刷新)
TSX + tsconfig:
{
"compilerOptions": {
"jsx": "react-jsx",
"types": ["vite/client"]
}
}
记忆:React 集成的灵魂是 Fast Refresh——它能在不丢 Hook 状态的情况下重渲染组件,比全量刷新快一个量级。
4. Vue 集成:@vitejs/plugin-vue 与 SFC 支持
配置:
// vite.config.ts
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
export default defineConfig({
plugins: [vue()],
})
SFC 编译管线:
<template>…</template> → 编译为渲染函数
<script setup>…</script> → 编译为组件逻辑(setup 语法糖)
<style scoped>…</style> → scoped 样式 + CSS 热更
plugin-vue 能力:
| 能力 | 说明 |
|---|---|
| SFC 编译 | template/script/style 三块 |
| scoped 样式 | 编译期加 data-v-xxx |
| 组件 HMR | 模板级/组件级热更新 |
<script setup> | 语法糖支持 |
| CSS 预处理器 | scss/less 配合使用 |
额外可选插件:@vitejs/plugin-vue-jsx(在 Vue 里用 JSX)。
Vue 集成注意点:
// vue 插件已预设 @ → src
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
export default defineConfig({
plugins: [vue()],
// 需要 scss?
css: { preprocessorOptions: { scss: { additionalData: '@use "@/styles/vars" as *;' } } },
})
记忆:Vue 的 SFC 一站式(模板+脚本+样式)是最大优势——plugin-vue 全包,scoped 样式自动隔离。
5. Svelte 与 Solid:响应式编译与细粒度更新
Svelte 集成:
npm i -D @sveltejs/vite-plugin-svelte
// vite.config.ts
import { defineConfig } from 'vite'
import { svelte } from '@sveltejs/vite-plugin-svelte'
export default defineConfig({
plugins: [svelte()],
})
Svelte 特点:编译期响应式——let count = 0 + $: 依赖自动跟踪,运行时几乎无框架开销:
<script>
let count = 0
$: doubled = count * 2 // 响应式声明
function inc() { count++ }
</script>
<button on:click={inc}>count = {count}(翻倍 {doubled})</button>
Solid 集成:
npm i -D vite-plugin-solid
// vite.config.ts
import { defineConfig } from 'vite'
import solid from 'vite-plugin-solid'
export default defineConfig({
plugins: [solid()],
})
Solid 特点:JSX + 细粒度响应式——createSignal,更新只重渲染变化的 DOM 节点:
import { createSignal } from 'solid-js'
function Counter() {
const [count, setCount] = createSignal(0)
return <button onClick={() => setCount(c => c + 1)}>{count()}</button>
}
| 框架 | 更新粒度 | 运行时开销 | 心智 |
|---|---|---|---|
| Svelte | 编译期细分 | 极低 | $: 声明式 |
| Solid | DOM 节点级 | 极低 | Signal + JSX |
| React | 组件重渲染 | 中 | 不可变 + Hooks |
| Vue | 组件/模板 | 低 | 响应式 proxy |
记忆:Svelte/Solid 走「编译期响应式」——体积小、更新细,但生态相对小;React/Vue 生态更大、心智更主流。
6. 手动集成:从零接入一个框架
不依赖 create-vite,手写集成流程(以 React 为例):
# 1. 初始化
npm init -y
npm i -D vite @vitejs/plugin-react
npm i react react-dom
// 2. vite.config.ts
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
export default defineConfig({
plugins: [react()],
})
<!-- 3. index.html(Vite 入口) -->
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
// 4. src/main.tsx
import React from 'react'
import ReactDOM from 'react-dom/client'
import App from './App'
ReactDOM.createRoot(document.getElementById('root')!).render(
<React.StrictMode><App /></React.StrictMode>,
)
// 5. package.json scripts
{
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
}
}
心智:手动集成 = index.html 入口 + 框架插件 + src 目录——理解了这三步,任何框架都能接上。
7. 多框架共存与混合工程
大型项目可能同时用多个框架(如 React 主应用 + Vue 微件):
// vite.config.ts 多框架插件共存
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import vue from '@vitejs/plugin-vue'
export default defineConfig({
plugins: [react(), vue()],
})
混合注意事项:
| 要点 | 说明 |
|---|---|
| 插件顺序 | 一般无冲突,按需排列 |
| 目录隔离 | src/react/ 与 src/vue/ 分目录 |
| 共享依赖 | react/vue 各自唯一,别混 |
| HMR 边界 | 各自框架各自 accept |
微前端场景:用 Vite 的模块联邦能力把多框架应用组合(参考 /vite-monorepo-architecture/)。
记忆:多框架共存是插件叠加问题——各自编译各自语法,目录隔离 + 依赖唯一即可。
8. 框架插件 vs 通用插件:如何选择
框架插件(官方/社区):
| 插件 | 用途 |
|---|---|
| @vitejs/plugin-react | React JSX + Fast Refresh |
| @vitejs/plugin-vue | Vue SFC |
| @vitejs/plugin-vue-jsx | Vue 中的 JSX |
| @sveltejs/vite-plugin-svelte | Svelte |
| vite-plugin-solid | Solid |
通用插件(跨框架):
| 插件 | 用途 |
|---|---|
| @vitejs/plugin-legacy | 老浏览器兼容 |
| vite-plugin-pwa | PWA |
| vite-plugin-svgr | SVG 转组件 |
| vite-plugin-compression | gzip/brotli |
| vite-plugin-md | Markdown 渲染 |
选择原则:
框架语法(JSX/SFC/svelte)→ 必须框架插件
工程能力(压缩/PWA/旧浏览器)→ 通用插件即可
同名插件冲突 → 只装一个框架插件
记忆:「框架专属语法」用框架插件,「通用工程能力」用通用插件——别用通用插件假装支持某框架语法。
9. 框架集成常见坑
| 坑 | 原因 | 解法 |
|---|---|---|
| JSX 未定义 | 缺插件/JSX runtime | 装 @vitejs/plugin-react |
| .vue 无法加载 | 没装 plugin-vue | 装插件 |
| Svelte 报编译错 | 缺 svelte 插件 | 装 vite-plugin-svelte |
| Fast Refresh 失效 | 组件文件导出非组件 | 只导出组件 |
| 别名失效 | 框架插件未预设 alias | 手动配 resolve.alias |
| 两个 React | 依赖重复 | resolve.dedupe: [‘react’] |
| HMR 全量刷新 | 插件未注入 accept | 检查框架插件是否在 plugins 里 |
调试建议:改一个组件看终端「hmr update」粒度——如果全量 reload,基本是插件没注入 HMR。
记忆:框架集成的坑 80% 是「插件缺失或依赖重复」——先查 plugins 装齐了没,再查 dedupe。
10. 速查表
| 需求 | 插件 |
|---|---|
| React | @vitejs/plugin-react |
| Vue | @vitejs/plugin-vue |
| Vue + JSX | @vitejs/plugin-vue-jsx |
| Svelte | @sveltejs/vite-plugin-svelte |
| Solid | vite-plugin-solid |
| 老浏览器 | @vitejs/plugin-legacy |
| PWA | vite-plugin-pwa |
| 压缩 | vite-plugin-compression |
| 起项目 | npm create vite -- --template react-ts |
一句话记忆:框架插件是 Vite 认识框架的桥——React/Vue/Svelte/Solid 各有官方插件,负责语法转译 + HMR + 预设;起项目用 create-vite 模板、手动集成就是「入口 + 插件 + src」;多框架共存靠插件叠加与目录隔离;报错先查插件缺没缺、依赖重复没重复。
延伸阅读
- /vite-scaffold-engineering/ — 脚手架与工程规范
- /vite-hmr-internals/ — 框架 HMR 边界机制
- /vite-plugin-development/ — 插件开发原理
- [[frontend]] — 前端框架全景
- [[typescript]] — TSX 与类型配置
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。