关键在于用“局部物理映射流”替代全局状态绑定:为每个文本片段生成唯一ID(如chunk-2a7f-bold-03),解耦样式策略与文本内容,由策略注册中心动态管理类型规则,按需激活映射并安全隔离渲染。

关键在于用“局部物理映射流”替代全局状态绑定——即不把样式逻辑硬塞进文本模型,也不让渲染器被动等待数据就绪,而是建立文本片段与样式规则之间可追溯、可中断、可复用的轻量级映射关系。
用唯一键标识文本片段,实现精准映射
每个流式到达的文本 chunk(如一段 Markdown 行、一个加粗词、一个代码块)生成一个稳定、不可变的局部 ID(例如基于内容哈希 + 序号的组合:chunk-2a7f-bold-03)。这个 ID 不依赖全局索引或服务端序号,只反映该片段在当前会话中的语义位置。
- ID 用于关联样式配置(如 color: #2563eb; font-weight: 700)、解析状态(是否已转为 HTML)、渲染进度(已渲染 0/5 字符)
- 渲染器通过 ID 主动查表获取样式策略,而非接收带样式的混合 payload
- 中断重连后,仅需按 ID 恢复未完成片段的映射状态,无需重放整条流
样式策略与文本片段解耦,交由独立策略注册中心管理
定义一个轻量策略注册中心(非单例类,可实例化),负责维护「片段类型 → 样式规则」的映射。例如:
- inline-code → { bg: '#f1f5f9', padding: '2px 4px', fontFamily: 'ui-monospace' }
- link → { color: '#1d4ed8', textDecoration: 'underline' },并附加点击行为策略
- pending(未完成 chunk)→ { opacity: 0.7, cursor: 'wait' }
文本片段只携带类型标签(如 type="link"),不携带具体 CSS;渲染器根据类型向注册中心查询实时策略,支持运行时热替换(比如夜间模式切换时,只需更新注册中心里的 link 规则)。
映射流按需激活,避免预占资源
映射关系本身不自动触发渲染,而是以“惰性流”形式存在:只有当某片段进入可视区域、或用户显式展开折叠内容、或完成 Markdown 解析时,才激活其映射并调度样式应用。
- 使用 IntersectionObserver 监听可见性,只对可见片段建立 DOM 节点与样式绑定
- 对折叠段落(如 <details>)延迟初始化映射,展开后再加载对应样式策略
- 每条映射自带生命周期钩子(onMount / onUnmount),便于清理事件监听或动画帧
安全插入与样式隔离同步落地
映射激活后,渲染器将样式策略转化为 scoped CSS 或 Shadow DOM 内联规则,并配合 HTML 插入动作原子执行:
- 用 element.attachShadow({ mode: 'closed' }) 创建隔离容器,确保样式不穿透
- 样式规则通过 CSSStyleSheet.insertRule() 动态注入,而非拼接 style 标签
- HTML 内容使用 insertAdjacentHTML('beforeend', safeHtml) 批量插入,避免 innerHTML 全量重绘
- 所有插入均走白名单过滤(禁用 script、onerror 等危险属性),由映射流统一校验入口


















