React + Vite 插件开发教程
针对有 UI 的正式插件,推荐使用 React 19 + Vite 7 + TypeScript + Tailwind 的工程化开发方式,并配合启动器内置组件库@qomicex/plugin-ui。相比纯 HTML 手写,你能获得组件复用、类型检查、HMR 与按需打包等能力。
推荐用 qomicex create 脚手架生成工程(自动配好全部配置),本教程讲解脚手架产物与各配置的作用,方便按需调整。
一、为什么用 Vite
- 类型安全:TS 严格模式,构建前
tsc --noEmit拦截错误 - 组件复用:直接用启动器同款
@qomicex/plugin-ui组件(Card / Button / Dialog / Select 等),样式自动跟随主题 - 产物纯净:仅打包用到的组件,CSS 按需生成(Tree-shaking + Tailwind JIT)
二、用 CLI 生成工程(推荐)
@qomicex/plugin-ui,manifest.json/package.json 已替换 id):
qomicex create 内置模板(packages/qomicex-cli/templates/)。不满足需求时可在此基础上增删。
不用 CLI 的手动初始化(替代方案)
@qomicex/plugin-ui 是启动器仓库内的 workspace 包,用 file:../../packages/plugin-ui 引用即可,无需发布到 npm。
package.json
vite.config.ts — 关键:相对 base
tailwind.config.js — 引用 preset
content 默认只扫 ./src。而 @qomicex/plugin-ui 组件的样式类(bg-card、bg-muted、text-foreground)写在组件源码里,不在你的 src 下。不把 ../../packages/plugin-ui/src/**/*.{ts,tsx} 加进 content,构建出的 CSS 会缺少这些类,插件页面没有样式(产物 CSS 只有几 KB 是典型症状)。
postcss.config.js
tsconfig.json
src/index.css
三、插件 API 的类型化封装
插件脚本通过window.__PLUGIN_API__ 与启动器交互。建议封装为类型化模块,并处理独立 npm run dev(浏览器直开)时无 API 桥的情况:
src/api.ts:
四、编写插件页面
src/main.tsx:
./App.tsx、./api.ts)。Vite 的路径解析存在 bug,省略扩展名会报错。已在 tsconfig 开启 allowImportingTsExtensions。
src/App.tsx 中使用组件库:
@qomicex/plugin-ui 导出:Button / Badge / Card(Header/Title/Description/Content/Footer) / Checkbox / Combobox / Dialog / Input / Label / Select(+SelectOption/SelectDivider) / Separator / Table / Tabs / Textarea / Tooltip / useMessageBox(+MessageBoxProvider) / Icon / Glyph / ICON_NAMES / hasIcon / cn。图标另有单图标子路径 @qomicex/plugin-ui/icons/<name>(详见 图标)。完整用法见 plugin-ui 组件库。
五、悬浮窗与主题文件
overlay.html 和 theme.css 不属于 Vite 构建产物,需在打包时手动拷贝到 dist/:
overlay.html→dist/overlay.html(manifestcontributes.overlay.file指向)theme.css→dist/theme.css(manifestentry.theme指向)
__PLUGIN_API__ 桥脚本由启动器追加在页面 <body> 末尾。因此不要在页面加载时同步捕获 window.__PLUGIN_API__(此时桥还没注入),应在事件回调里延迟读取:
六、打包 .qplugin
用 CLI 打包(推荐)
qomicex pack 自动处理:构建前端、拷贝根目录的 overlay.html / theme.css 到 dist/、组装 zip(manifest.json 在根 + dist/**)。entry.theme / contributes.overlay.file 若引用 dist/ 下文件但源码在根目录,会自动拷入。
不用 CLI 的手动打包(替代方案)
打包脚本(scripts/build.sh)
打包后的包结构
plugins/{id}/{path} 解析文件,entry.frontend: "dist/index.html" 会去取 plugins/{id}/dist/index.html。dist/ 子目录必须保留在 zip 里——如果把 dist 内的文件提升到 zip 根目录,安装后 dist/index.html、dist/theme.css、dist/overlay.html 全部 404(页面空白、无样式、悬浮窗打不开)。
七、安装测试
qomicex pack(或手动bash scripts/build.sh 0.1.0,Windows:pwsh ./scripts/build.ps1 0.1.0)- 启动器 → 插件 → 上传
release/my-plugin-0.1.0.qplugin - 启用插件 → 重启启动器 → 侧边栏进入插件页
qomicex dev 走调试 harness——浏览器热重载,无需启动 Tauri/后端(详见 调试与热重载)。
常见问题
下一步
- 完整 API 参考:插件 API 完整参考
- 组件库:UI 组件库(.p-* 样式)
- 悬浮窗:悬浮窗开发
- CLI 命令参考:CLI 工具参考
- 调试与热重载:调试与热重载
- 发布规范:发布规范