从零构建可扩展的 Angular 问答渲染器 SDK
条评论在开发类似豆包、通义千问的问答产品时,前端经常需要处理大模型返回的多样化内容 —— 表格、图表、参考文档、工具调用等,甚至未来可能出现视频、音频等新类型。如果将所有渲染逻辑耦合在一起,不仅代码臃肿难维护,后续扩展新类型更是举步维艰。
本文将带你从零设计并实现一个可扩展的 Angular 问答渲染器 SDK,它默认集成表格和图表渲染能力,开发者无需额外配置即可使用;同时支持自定义渲染器注册,完美适配业务的持续迭代需求。
一、需求与设计目标
在动手前,我们先明确 SDK 的核心需求与设计目标,确保架构方向不跑偏:
核心需求
- 默认能力:SDK 内置 Table 和 Chart 两种渲染器,开发者导入即可用,无需手动配置;
- 灵活扩展:支持开发者自定义渲染器(如参考文档、工具调用),通过简单方式注册到 SDK;
- 易用性:提供两种导入方式 —— 无自定义渲染器时直接导入模块,有自定义需求时用 forRoot 配置;
- 组件化:基于 Angular 组件封装渲染逻辑,而非原生 DOM 操作,符合 Angular 最佳实践。
设计目标
- 遵循开闭原则:新增渲染类型无需修改 SDK 核心代码,只需扩展新组件;
- 遵循单一职责:每种渲染器只负责对应类型的内容渲染,职责清晰;
- 低耦合:渲染逻辑与核心框架解耦,便于独立开发、测试和维护;
- 兼容性:默认渲染器与自定义渲染器无缝协作,支持优先级覆盖(可选)。
二、整体架构设计
基于需求,我们采用 “接口定义 + 默认实现 + 注册中心 + 动态加载” 的架构模式,整体分为 5 大核心模块:
- 接口层:定义统一的渲染器接口,保证所有渲染器实现一致性;
- 默认渲染器:SDK 内置 Table 和 Chart 渲染器,基于 Angular 组件实现;
- 注册中心:通过服务管理所有渲染器(默认 + 自定义),提供注册、查询能力;
- 核心渲染容器:根据内容类型(flag)从注册中心匹配渲染器,动态加载并渲染;
- 模块封装:对外提供统一的模块入口,支持基础导入和带配置导入两种方式。
三、SDK 核心实现
代码地址:https://github.com/doautumn/chat-renderer
1 | . |
四、使用方式
1. 安装依赖
1 | npm install @tui/chat |
2. 自定义渲染器
1 | import { Component, OnInit } from '@angular/core'; |
3. 引入模块并注册自定义渲染器
1 | import { RendererModule } from '@tui/chat'; |
4. 使用组件
1 | import { RendererModel } from '@tui/chat'; |
1 | <t-renderer |