Skip to content

PageDocument

PageDocument 是页面结构快照。它只存结构,不存组件源码字典。

基本形态

ts
interface PageDocument {
  schemaVersion?: '1'
  layout: CanvasLayoutConfig
  instances: PageInstance[]
  bindings: PageBinding[]
  componentOverrides?: Record<string, PageComponentOverride>
}

instances

instances 是页面上的组件实例列表。

每个实例至少需要:

  • instanceId
  • componentId
  • componentVersionKey
  • layoutBox

嵌套容器场景还会用:

  • parentId
  • slot
  • placement
  • layoutItem
  • containerLayout

componentVersions 不在 PageDocument 内

组件源码由运行 payload 单独传:

ts
interface PageRenderPayload {
  document: PageDocument
  componentVersions: Record<string, ComponentVersionAsset>
}

这样做是为了避免 50 个实例重复携带同一份组件源码。

componentOverrides

页面级实例代码覆盖按 instanceId 存。

它解决的问题是:只改当前页面里某一个组件实例,不影响组件库正式版本,也不影响其它页面。

ts
componentOverrides: {
  timer_1: {
    instanceId: 'timer_1',
    baseVersionKey: 'timer@v3',
    source,
    contract,
  },
}

如果实例已经升级到 timer@v4,但 override 仍基于 timer@v3,它就是 stale override。运行时不消费 stale override,宿主应该提示用户处理。