Skip to content

功能请求: 支持扩展自定义窗口 #366

@xiaowumin-mark

Description

@xiaowumin-mark

描述

目前扩展系统主要支持在主页面中注入 React 组件或执行逻辑,但无法清晰地区分「扩展的逻辑部分」和「扩展的窗口 UI」。
这带来了一些限制:

  • 扩展逻辑和 UI 混在一起,管理困难
  • 弹出窗口或独立面板无法良好支持
  • 如果在多个窗口中复用扩展,会导致逻辑重复执行或副作用

需求

希望扩展系统能支持扩展入口文件同时导出两个函数,用于区分逻辑和 UI:

  1. activate(context)

    • 用于注册扩展的逻辑,如命令、事件监听、状态管理等
    • 只在主窗口加载时执行一次
  2. getWindows()

    • 返回一个对象,声明扩展定义的窗口组件
    • 例如配置窗口、工具面板等
    • 每个窗口有唯一 ID,可以通过主应用 API 打开

示例:

export function activate(context) {
  context.registerCommand("sayHello", () => {
    console.log("Hello from extension!");
  });
}

export function getWindows() {
  return {
    config: MyConfigComponent,
    panel: MyPanelComponent,
  };
}

主应用实现思路

  1. 主应用加载扩展时调用 activate() 执行逻辑部分。
  2. 调用 getWindows() 注册扩展窗口组件到一个全局 ExtensionRegistry
  3. 提供 openExtensionWindow(id, options) API,用 Tauri WebviewWindow 打开专用路由 /extension-window/:id
  4. 在该路由中,根据 idExtensionRegistry 查找对应的 React 组件并渲染。

通信

  • 主窗口与扩展窗口之间通过 Tauri 的事件系统 (emit / listen) 或自定义消息总线通信。
  • 确保逻辑只在主窗口运行,UI 可以在任意弹窗中独立渲染。

价值

  • 扩展开发体验更清晰:逻辑和 UI 解耦
  • 避免逻辑在多个窗口重复执行
  • 扩展可以方便地声明和使用自定义窗口
  • 更接近 VSCode 等插件系统的设计模式,生态可扩展性更强

Metadata

Metadata

Assignees

No one assigned

    Labels

    新功能好耶,是新功能建议

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions