跳转到主要内容

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 生成工程(推荐)

生成的项目结构(Vite + React 19 + TS + Tailwind + @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

Tailwind 的 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:
仓库 TS 约定必须写文件扩展名(./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(manifest contributes.overlay.file 指向)
  • theme.css → dist/theme.css(manifest entry.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/后端(详见 调试与热重载)。

常见问题

下一步