# plugin-vite
**Repository Path**: vitarx/plugin-vite
## Basic Information
- **Project Name**: plugin-vite
- **Description**: The official plugin for Vitarx support in Vite.
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-02-28
- **Last Updated**: 2026-03-01
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# @vitarx/plugin-vite
Vitarx 的 Vite 编译插件,提供 JSX 到 `createView` 的编译转换、指令支持和 HMR 热更新功能。
## 特性
- 🚀 **JSX 编译** - 将 JSX 语法编译为高效的 `createView` 调用
- 📦 **编译宏指令** - 支持 `v-if`、`v-else-if`、`v-else`、`v-model`、`v-show` 等指令
- 🧩 **编译宏组件** - 内置 `Switch`、`Match`、`IfBlock` 纯编译组件
- 🔥 **HMR 支持** - 开发模式下自动注入热更新代码,支持组件状态保留
- 📝 **TypeScript** - 完整的 TypeScript 类型支持
## 安装
```bash
npm install @vitarx/plugin-vite
# 或
pnpm add @vitarx/plugin-vite
# 或
yarn add @vitarx/plugin-vite
```
## 使用方法
### 配置 Vite
在 `vite.config.ts` 中配置插件:
```typescript
import { defineConfig } from 'vite'
import vitarx from '@vitarx/plugin-vite'
export default defineConfig({
plugins: [vitarx()]
})
```
### JSX 编译
插件会自动将 JSX 语法编译为 `createView` 调用:
```jsx
// 编译前
const App = () =>
Hello World
// 编译后
import { createView } from 'vitarx'
const App = () => /* @__PURE__ */createView('div', {
className: 'container',
children: 'Hello World'
})
```
## 编译宏指令
### v-if / v-else-if / v-else
条件渲染指令,编译为高效的 `branch` 调用:
```jsx
<>
显示内容
其他内容
默认内容
>
```
编译后:
```javascript
branch(
() => unref(show) ? 0 : unref(other) ? 1 : 2,
[
() => createView('div', { children: '显示内容' }),
() => createView('span', { children: '其他内容' }),
() => createView('p', { children: '默认内容' })
]
)
```
### v-model
双向绑定指令,自动生成 `modelValue` 和 `onUpdate:modelValue`:
```jsx
```
编译后:
```javascript
createView(Input, {
get modelValue() { return unref(value) },
'onUpdate:modelValue': v => { value.value = v }
})
```
### v-show
显示/隐藏指令:
```jsx
内容
```
编译后:
```javascript
withDirectives(
createView('div', { children: '内容' }),
[['show', { get value() { return unref(visible) } }]]
)
```
## 编译宏组件
### Switch / Match
条件分支组件,类似于 JavaScript 的 switch 语句:
```jsx
默认}>
加载中...
出错了
加载成功
```
编译后:
```javascript
branch(
() => status === 'loading' ? 0 : status === 'error' ? 1 : status === 'success' ? 2 : 3,
[
() => '加载中...',
() => '出错了',
() => '加载成功',
() => createView('div', { children: '默认' })
]
)
```
### IfBlock
用于包裹 v-if 链,确保类型正确:
```jsx
A
B
C
```
## Props 处理
### 响应式 Props
插件会自动处理响应式属性:
```jsx
// ref 变量自动使用 .value
const count = ref(0);
// 编译为: get count() { return count.value }
// 普通变量自动使用 unref
// 编译为: get className() { return unref(className) }
// 成员表达式直接访问
// 编译为: get value() { return props.value }
```
### v-bind 批量绑定
```jsx
// 或
```
## HMR 热更新
开发模式下,插件会自动为导出的组件注入 HMR 支持:
```jsx
// 编译前
export const App = () => {
const count = ref(0)
return {count}
}
// 编译后(HMR 模式)
import __$VITARX_HMR$__ from '@vitarx/plugin-vite/hmr-client'
import { createView as jsxDEV, getInstance } from 'vitarx'
export const App = () => {
const __$VITARX_HMR_VIEW_NODE$__ = getInstance()
__$VITARX_HMR$__.instance.register(__$VITARX_HMR_VIEW_NODE$__)
__$VITARX_HMR_VIEW_NODE$__ && Promise.resolve().then(() => {
__$VITARX_HMR_VIEW_NODE$__._$_VITARX_HMR_VIEW_STATE_$_ = {
get count() { return count }
}
})
const count = ref(0)
return jsxDEV('div', { children: count }, { fileName: '...', lineNumber: 5, columnNumber: 10 })
}
__$VITARX_HMR$__.instance.bindId(App, 'abc123')
import.meta.hot.accept(mod => {
__$VITARX_HMR$__.instance.update(mod)
})
```
### HMR 组件识别规则
只有满足以下条件的函数才会被注入 HMR 支持:
1. **函数名大写字母开头** - 符合组件命名规范
2. **被导出** - 使用 `export` 导出
3. **包含 JSX** - 函数体内包含 JSX 语法或返回编译宏组件
## 子元素处理
### 响应式子元素
```jsx
// 标识符保持原样
{value}
// 成员表达式使用 access
{props.value}
// 编译为: access(props, 'value')
// 条件表达式使用 branch
{show ? 'yes' : 'no'}
// 编译为: branch(() => unref(show) ? 0 : 1, [...])
// 逻辑表达式使用 dynamic
{a && b}
// 编译为: dynamic(() => a && b)
```
## API 参考
### 插件选项
```typescript
interface VitePluginVitarxOptions {
// 暂无配置选项
}
```
## 目录结构
```
src/
├── constants/ # 常量定义
├── hmr-client/ # HMR 客户端运行时
├── passes/ # 编译转换处理
│ ├── components/ # 编译宏组件
│ ├── directives/ # 指令处理
│ ├── hmr/ # HMR 注入
│ ├── imports/ # 导入处理
│ ├── jsx/ # JSX 转换
│ └── props/ # 属性处理
├── utils/ # 公共工具函数
├── context.ts # 转换上下文
├── error.ts # 错误处理
├── transform.ts # 主转换入口
└── index.ts # 插件入口
```
## 错误码
| 错误码 | 描述 |
|------|-----------------------------|
| E001 | 无效的 JSX 属性值 |
| E002 | 无效的 v-model 值 |
| E003 | v-else 没有前置的 v-if |
| E004 | v-else-if 没有前置的 v-if |
| E005 | 无效的 v-if 值 |
| E006 | Switch 子元素必须是 Match 组件 |
| E007 | Match 组件缺少 when 属性 |
| E008 | IfBlock 子元素必须包含 v-if 指令 |
| E009 | v-model 与 modelValue 冲突 |
| E010 | v-model 值必须是标识符或成员表达式 |
| E011 | v-model Identifier 必须是 ref |
| E012 | Match 组件必须位于 Switch 组件内部 |
| E013 | Match 组件必须包含子元素 |
| E014 | IfBlock 组件必须包含子元素 |
| E015 | Switch 组件必须包含至少一个 Match 子元素 |
## License
MIT