1. 基础概念
插件化手册
  • FH2 插件开发手册
    • 产品简介
    • 典型场景
    • 发版说明
    • 快速开始
      • 快速开始总览
      • 第一个插件
      • 后端插件
      • 全栈闭环
    • AI辅助开发
      • AI 开发 Skill
      • 安装与复验
      • 第一个工程
      • 真实需求示例:现场问题上报
      • 改造已有工程
      • 调试与交付
    • 开发指南
      • 开发指南
      • 基础概念
        • 基础概念总览
        • 什么是插件开发
        • 平台架构
        • 前端宿主、扩展点与能力
        • 后端运行时、入口与权限
        • 开发流程
        • 安全与隔离
        • 支持范围与问题反馈
      • 开发指南
        • 开发指南总览
        • 前端插件
          • 前端插件深度指南
          • 前端工程结构
          • 插件清单(fh2-plugin.json)
          • 入口与生命周期
          • 界面与状态
          • 多宿主插件
          • 跨宿主通信服务
          • HTTP、WebSocket 与事件
          • 存储、Blob 与定时器
          • 工具链与本地调试页面
        • 后端插件
          • 后端开发深度指南
          • 后端插件的结构
          • 后端源清单 fh2-plugin.json
          • HTTP 接口处理函数
          • 消息订阅与事件处理函数
          • ctx 与能力注入
          • 数据存储与缓存
          • 流程编排
          • 触发方式
          • 连接外部系统
          • 流程编排练习(DAG)
        • 前后端协作
          • 前后端协作总览
          • 前后端共享契约
          • 端到端幂等
          • 事件、通知与状态
          • 统一错误模型
          • 链路标识与诊断日志
        • 完整练习
          • 环境准备
          • 第一个前端插件
          • 第一个后端插件
          • 第一个全栈插件
      • 能力总览
        • 能力地图
        • 能力可用性矩阵
        • 前端能力
          • 平台通用能力
            • 平台通用能力总览
            • 基础运行时:HTTP、事件、WebSocket 与存储
            • 导航、位置与通知
            • 弹窗、音频与剪贴板
            • 地图能力
            • 项目设备能力
            • WPMZ 与航线预览
            • 受控对象上传
          • 项目宿主
            • 项目宿主总览
            • 项目上下文
            • 项目侧边栏入口
            • 项目插件路由
            • 项目工作区
          • 消息宿主
            • 消息宿主总览
            • 消息告警弹层
            • 消息导航与通知
          • 计划库宿主
            • 计划库宿主总览
            • 计划库表单上下文
            • 计划库表单扩展
            • 校验、提交与 `biz_ext`
          • 驾驶舱
            • 驾驶舱插件能力总览
            • 驾驶舱扩展点
            • 上下文与遥测
            • 相机、检测与 AI
            • 场景几何与直播指针
            • 飞控、云台与任务
            • 驾驶舱平台事件
        • 后端能力
          • 后端能力地图
          • 后端能力总览
          • 配置、受管出网与集成连接
          • 事件与流程
          • 飞行任务与违停巡逻
          • 数据存储
          • 媒体与前端通知
          • 资源租约
          • 作业、目标轨迹与视频处理
      • 调试与测试
        • 调试与测试总览
        • 快速入门排错
        • 本地开发
        • Web IDE:打开工程与保存改动
        • 工作流编辑器:节点、接线与交付
        • 知识与 MCP:先判断需要哪一层事实
        • 前端本地调试
        • 后端运行时与流程调试
        • 模拟数据与测试数据
        • 集成测试与 E2E
        • 日志与链路追踪
        • 常见问题排查
      • 完整示例
        • 示例与案例总览
        • 项目侧边栏与工作区
        • 消息告警卡片
        • 计划表单任务清单
        • 驾驶舱动作与左侧面板
        • 最小后端插件
        • 最小全栈插件
        • 多宿主插件实战
        • 事故快处
        • 交通抓拍
        • 违停巡逻完整案例
      • 构建发布与安全
        • 构建、发布与安全
        • 质量门禁
        • 行业包构建与打包
        • 能力版本发布
        • 安装、升级与回滚
        • 安全基线
      • API参考
        • API 参考总览
        • 前端
          • 前端 API 参考
          • 前端插件清单结构
          • 前端 SDK API
          • 前端扩展点目录
          • 前端能力目录
          • 前端平台事件目录
          • 跨宿主通信服务 API
          • 工具链命令行参考(`fh2-plugin`)
        • 后端
          • 后端 API 参考
          • 后端插件源清单
          • 后端 HTTP 接口参考
          • 后端事件消费参考
          • 后端脚本上下文(`ctx`)
          • 后端数据存储
          • 流程编排语言
          • 流程触发器参考
          • 后端能力目录
          • 后端 HTTP API
        • 共享契约
          • 共享契约参考
          • 类型与契约目录
          • 错误模型
          • 版本兼容性
      • 附录
        • 错误码
        • 术语表
        • 常见问题
  1. 基础概念

前端宿主、扩展点与能力

这一页解释前端插件的三个核心概念:宿主(插件跑在哪个页面)、扩展点(插件能占据页面的哪些位置)、宿主能力(插件能调用前端的哪些功能)。后端的能力注入、allowlist 和脚本沙箱见后端运行时、入口与权限。

宿主#

宿主就是承载插件的页面。司空里有四个宿主:
宿主页面提供的扩展点
cockpit驾驶舱8 个(工具栏按钮、菜单栏、直播覆盖层、左下角面板、左面板、子直播页签、飞控操作、右键菜单)
project项目项目侧边栏入口 + 自定义页面
plan计划飞行计划表单扩展
message消息告警弹层
写入口代码时用 ctx.host.id 判断当前在哪个宿主里,各宿主各写各的逻辑:
fh2-plugin-sdk 是插件开发 SDK 的文档逻辑模块名;实际导入路径保留生成工程的配置,见环境准备。
import { definePlugin } from 'fh2-plugin-sdk'

export default definePlugin({
  async activate(ctx) {
    if (ctx.host.id === 'cockpit') {
      // 驾驶舱的逻辑
    } else if (ctx.host.id === 'project') {
      // 项目页的逻辑
    }
  },
})

扩展点#

扩展点是宿主在页面上预留的位置。插件声明"我要在这个位置放一个东西",宿主负责把它挂上去。你不能往扩展点以外的地方放界面。
以项目侧边栏为例,清单里这样声明:
{
  "extensions": [
    { "id": "project-entry", "point": "project.sidebar-actions", "path": "/plugin-demo", "position": 50 }
  ]
}
然后在入口代码里提交这个扩展的具体内容:
await ctx.extensions.contribute('project-entry', {
  icon: 'plugin',
  label: '插件示例',
  disabled: false,
  showBadge: false,
  render: () => demoView.get(ctx),   // demoView 是 definePluginView 契约对象,见「界面与状态」一页
})
注意分工:path、position 这类安装时就确定的配置写在清单里;label、disabled、render 这类运行时会变的状态和回调在代码里提交。把后者写进清单会被校验拒绝。
每个扩展点的完整字段说明见扩展点目录。

能力#

能力是宿主提供给插件调用的功能,比如地图打点、打开弹窗、读取当前项目信息。完整目录见能力目录。用能力分三步:
第 1 步:清单里声明权限。
{
  "permissions": ["project:context", "platform:map"]
}
第 2 步:代码里获取能力调用方。
const project = await ctx.capabilities.get('project:context')
第 3 步:判空再使用。
if (!project) {
  // 当前宿主没提供这个能力(比如插件没装在项目页),走降级逻辑
  ctx.logger.warn('project:context 在当前宿主不可用')
  return
}
const state = await project.getState()
const { projectId } = state
undefined 是正常情况,不是报错——同一个插件可能被装到多个页面,某个页面没有这个能力很常见。每次获取后都必须判空。
四个基础能力不经过 capabilities.get(),直接用 ctx 上的对应成员:
能力用法
platform:httpctx.apiCall(...)
platform:eventsctx.events.on(...)
platform:websocketctx.ws.onBizCode(...)
platform:storagectx.storage / ctx.blobs

验证#

改完清单记得生成类型并校验:
校验会把"清单里写了运行时字段""viewId 指向不存在的界面"这类问题当场报出来。

后端不是这一套#

后端插件不通过 ctx.capabilities.get() 获取能力,也没有 extensions。它用 handlers/、events/、adapters/ 声明入口,用 allowlist 申报能力,平台把能力作为全局对象注入。不要把前端权限、后端权限和业务能力扩展混为一谈。
修改于 2026-10-22 03:39:48
上一页
平台架构
下一页
后端运行时、入口与权限
Built with