「AI + 低代码引擎」的设计器框架核心

7 阅读8分钟

设计器框架核心

引言

本技术文档面向设计器框架核心,系统性阐述其整体架构、核心模型与协议、Provider 模式实现、初始化与生命周期、事件系统、与 Vue3 生态的集成方式、Composition API 使用模式、响应式数据管理、扩展点与插件体系、性能优化与内存管理、错误处理策略,并提供可直接参考的代码片段路径,帮助开发者快速理解并高效扩展框架。

项目结构

框架采用多包分层组织,核心能力分布在 core、designer、renderer、base、utils 等包中;应用侧通过 apps/app 展示如何以 Provider 模式集成到 Vue3 应用。

graph TB
subgraph "应用层"
APP["apps/app/src/main.ts"]
end
subgraph "渲染层"
RENDER_INDEX["packages/renderer/src/index.ts"]
PROVIDER["packages/renderer/src/provider/provider.ts"]
end
subgraph "设计器层"
DESIGNER_INDEX["packages/designer/src/index.ts"]
FRAMEWORK["packages/designer/src/framework/index.ts"]
MANAGERS["packages/designer/src/managers/index.ts"]
end
subgraph "核心层"
CORE_INDEX["packages/core/src/index.ts"]
MODELS["packages/core/src/models/index.ts"]
NODE["packages/core/src/models/node.ts"]
PROJECT["packages/core/src/models/project.ts"]
PROTOCOLS["packages/core/src/protocols/index.ts"]
end
subgraph "基础与工具"
BASE_INDEX["packages/base/src/index.ts"]
UTILS_INDEX["packages/utils/src/index.ts"]
end
subgraph "平台与UI"
H5_AUTOUPDATE["platforms/h5/src/utils/auto-update.ts"]
UI_AUTOUPDATE["packages/ui/src/utils/auto-update.ts"]
end
APP --> RENDER_INDEX
RENDER_INDEX --> PROVIDER
DESIGNER_INDEX --> FRAMEWORK
DESIGNER_INDEX --> MANAGERS
CORE_INDEX --> MODELS
MODELS --> NODE
MODELS --> PROJECT
CORE_INDEX --> PROTOCOLS
PROVIDER --> CORE_INDEX
PROVIDER --> UTILS_INDEX
FRAMEWORK --> CORE_INDEX
MANAGERS --> CORE_INDEX
BASE_INDEX --> UTILS_INDEX
H5_AUTOUPDATE --> UI_AUTOUPDATE

核心组件

  • 核心模型与协议
    • NodeModel:节点模型,封装属性、事件、指令、插槽、父子关系、可见性与锁定等,支持 DSL 序列化与销毁。
    • ProjectModel:项目模型,维护页面/区块树、依赖、元数据、环境变量、国际化等,提供页面/区块的增删改查与激活/失活。
    • 协议层:统一的 Schema、Service、Assets、Plugins 等协议定义,确保跨模块契约稳定。
  • Provider 模式
    • Provider:应用级提供者,负责项目加载、依赖与资源加载、路由初始化、API 注册、Mock 初始化、全局配置与国际化、错误处理、渲染器创建等。
    • createProvider/useProvider:工厂与注入钩子,提供 onReady 生命周期回调与运行时版本校验。
  • 渲染与设计器
    • renderer:导出常量、工具、Provider、渲染器、服务、Hook、插件等。
    • designer:导出常量、组件、框架、管理器、包装器、工具等。
  • 基础与工具
    • base:通用工具集(加密、正则、数值、日期、数据处理、mitt 事件、队列等)。
    • utils:请求、下载、日志、浏览器补丁、客户端检测等。
  • 自动更新与刷新机制
    • 平台自动更新:H5 平台提供定时检查脚本变化并触发刷新的机制。
    • UI 组件自动更新:UI 组件库提供可配置的自动更新功能,支持自定义检查间隔。

架构总览

框架围绕"Provider + 模型 + 协议 + 渲染器"的架构展开。应用通过 createProvider 创建 Provider,注入到 Vue3 应用,按运行模式加载项目、依赖与资源,注册路由与 API,最终通过渲染器将 DSL 渲染为真实组件。设计器层提供可视化编辑、资产与工具链能力,核心模型与协议保证数据结构与行为的一致性。平台层提供自动更新机制,确保应用在部署后能够及时检测到新版本并提示用户刷新。

graph TB
APP["应用(main.ts)"] --> CP["createProvider(...)"]
CP --> P["Provider.install(...)"]
P --> LOAD["load(Project)"]
LOAD --> DEPS["loadDependencies/loadAssets"]
LOAD --> MOCK["initMock + mockApis"]
LOAD --> ROUTER["initRouter"]
P --> READY["triggerReady/onReady"]
P --> RENDER["createDslRenderer/getRenderComponent"]
RENDER --> DSL["DSL -> 渲染器(renderer)"]
subgraph "自动更新机制"
AUTO["autoUpdate()"] --> CHECK["定时检查脚本变化"]
CHECK --> COMPARE["比较脚本列表"]
COMPARE --> NEED["需要更新?"]
NEED --> |是| CONFIRM["显示确认对话框"]
CONFIRM --> RELOAD["window.location.reload()"]
NEED --> |否| SCHEDULE["等待下次检查"]
END AUTO

详细组件分析

Provider 初始化与生命周期

  • 初始化流程
    • 创建适配器与服务,构建 Provider,传入模块、路由、增强函数、依赖与项目配置。
    • 非设计模式下执行 load,按模式加载依赖或资源,初始化 Mock 与 API,创建路由,触发就绪。
  • 生命周期
    • onReady:Provider 内部 ready 回调,外部通过 createProvider 返回的 onReady 注册。
    • 错误处理:设计模式下设置全局错误处理器,过滤特定噪音,通知适配器。
sequenceDiagram
participant App as "应用(main.ts)"
participant Factory as "createProvider"
participant Prov as "Provider"
participant Router as "Router"
participant Adapter as "Adapter"
App->>Factory : "传入配置(服务/模块/路由/增强/依赖/项目)"
Factory-->>App : "{provider,onReady}"
App->>Prov : "onReady(cb)"
Prov->>Prov : "load(Project)"
Prov->>Adapter : "initMock + mockApis"
Prov->>Prov : "loadDependencies/loadAssets"
Prov->>Router : "initRouter"
Prov-->>App : "triggerReady()"
App->>App : "app.use(provider)"

事件系统设计

  • 核心事件
    • 节点变更:NODE_CHANGE,节点更新/移动/锁/显隐等操作触发。
    • 项目变更:PROJECT_CHANGE、PROJECT_ACTIVED、PROJECT_DEPS_CHANGE、PROJECT_PAGES_CHANGE、PROJECT_BLOCKS_CHANGE、PROJECT_APIS_CHANGE、PROJECT_META_CHANGE、PROJECT_PUBLISH、PROJECT_FILE_PUBLISH、PROJECT_GEN_SOURCE。
  • 触发与监听
    • NodeModel.update/setProp/removeProp 等内部通过 emitter.emit 触发事件。
    • ProjectModel.update/createPage/updatePage/removePage 等内部通过 emitter.emit 触发事件。
  • 事件模型
    • 事件名常量集中定义,便于跨模块统一监听。
flowchart TD
Start(["节点/项目变更入口"]) --> CheckType{"变更类型"}
CheckType --> |节点| EmitNode["emitter.emit(EVENT_NODE_CHANGE)"]
CheckType --> |项目| EmitProj["emitter.emit(各类PROJECT_事件)"]
EmitNode --> Listener["订阅方接收并处理"]
EmitProj --> Listener
Listener --> End(["完成"])

Provider 模式与渲染器

  • Provider 职责
    • 项目加载与状态管理:load、getFile、getPage、getDsl、getDslByUrl。
    • 资源与依赖:loadDependencies、loadAssets、initGlobals、initI18n、initEnv。
    • 路由与页面容器:initRouter、createStaticRoutes、PageContainer/StartupContainer。
    • 渲染器创建:createDslRenderer、getRenderComponent、defineUrlSchemaComponent、definePluginComponent。
  • 渲染器
    • 接收 DSL,结合 library/components/apis/window 等上下文创建渲染器,支持动态加载依赖的 DSL。
classDiagram
class Provider {
+mode
+globals
+modules
+adapter
+apis
+dependencies
+materials
+service
+project
+components
+nodeEnv
+env
+load(project)
+getDsl(id)
+getRenderComponent(id,output?)
+createDslRenderer(dsl,opts?)
+initRouter()
}
class NodeModel {
+id
+name
+from
+props
+events
+directives
+children
+slot
+update(schema,silent?)
+setProp(name,val,def?,silent?)
+setEvent(...)
+setDirective(...)
+appendChild(...)
+insertBefore/After(...)
+toDsl()
+dispose()
}
class ProjectModel {
+id
+platform
+name
+pages
+blocks
+apis
+meta
+dependencies
+i18n
+env
+update(schema,silent?)
+active(file,silent?)
+deactivate(silent?)
+createPage(...)
+updatePage(...)
+removePage(...)
+createBlock(...)
+updateBlock(...)
+removeBlock(...)
+setApi(...)
+removeApi(...)
}
Provider --> NodeModel : "渲染/编辑"
Provider --> ProjectModel : "项目数据"

与 Vue3 生态的集成与 Composition API 使用

  • 应用集成
    • main.ts 中通过 createAdapter、LocalService、createProvider 构建 Provider,随后 app.use(router).use(provider).use(IconsPlugin) 完成安装。
  • Composition API 使用模式
    • 在组件中通过 useProvider 注入 Provider,读取项目、页面、DSL、渲染器等能力。
    • 通过 app.config.globalProperties 暴露 provider/provider/request,便于组合式逻辑复用。
  • 适配器与插件
    • adapter.access/connect 提供访问控制;adapter.notify/loading/Startup/useTitle 等用于 UI 与交互。
    • Provider.install 期间安装第三方库插件、国际化与增强函数。

设计器框架与扩展点

  • 设计器导出
    • framework:引擎、资产、模拟器、渲染器、设计器、OpenAPI、状态、更新器、工具注册表等。
    • managers:内置、部件、依赖、Setter 等管理器。
  • 扩展点
    • 自定义 Provider:通过 materials/modules/dependencies/globals 等扩展资源与组件。
    • 插件系统:definePluginComponent/from 支持基于插件来源的异步组件定义。
    • 增强函数:enhance(app, provider) 提供应用启动后扩展能力。

自动更新与刷新机制

  • H5 平台自动更新
    • 定时检查机制:每 10 秒检查一次脚本变化。
    • 脚本提取:从 HTML 中提取所有 script 标签的 src 属性。
    • 变化检测:比较当前脚本列表与上次记录的脚本列表。
    • 刷新触发:当检测到脚本变化时,弹出确认对话框,用户确认后执行页面刷新。
  • UI 组件自动更新
    • 可配置间隔:默认检查间隔为 60 秒,可通过参数自定义。
    • Element Plus 对话框:使用 ElMessageBox.confirm 实现确认对话框。
    • 刷新逻辑:确认后通过 window.location.reload() 刷新页面。
  • 时间同步修复
    • 在刷新工具执行流程中增加了额外的 1 秒延迟,解决了模拟器刷新过程中的竞态条件问题,确保异步操作在刷新前正确完成。
sequenceDiagram
participant Timer as "定时器"
participant Extract as "提取脚本"
participant Compare as "比较脚本"
participant Dialog as "确认对话框"
participant Reload as "页面刷新"
Timer->>Extract : "定时检查脚本变化"
Extract->>Compare : "获取新的脚本列表"
Compare->>Compare : "比较与上次记录的差异"
Compare-->>Timer : "需要更新?"
Timer->>Dialog : "显示确认对话框"
Dialog->>Reload : "用户确认"
Reload->>Reload : "执行刷新"

依赖分析

  • 模块耦合
    • renderer/provider 依赖 core 的协议与模型,同时依赖 utils 的请求、日志、下载等工具。
    • designer 导出框架与管理器,内部依赖 core 的模型与协议。
    • base 提供通用工具,被 utils 间接使用。
    • 平台层的自动更新机制相互独立,分别服务于不同的 UI 框架。
  • 外部依赖
    • Vue、VueRouter、Pinia、VueI18n 通过 Provider 的 dependencies 动态加载。
    • 第三方库通过 library/dependencies/materials 注入,支持 CSS/JS 资源加载与国际化语言包。
graph LR
Renderer["renderer/provider"] --> Core["core/protocols & models"]
Renderer --> Utils["utils/*"]
Designer["designer/*"] --> Core
Base["base/*"] --> Utils
Renderer --> Vue["Vue生态(动态加载)"]
H5Auto["H5自动更新"] --> UIAuto["UI自动更新"]

性能考虑

  • 资源加载策略
    • 源码模式仅加载原生依赖,其他模式加载完整资源与物料,减少不必要的资源消耗。
    • 依赖解析与缓存:parseDeps、loadCss/loadScript、url 缓存版本号,避免重复加载。
  • 渲染器与组件
    • createDslRenderer 结合 loader 动态加载依赖的 DSL,降低首屏压力。
    • defineAsyncComponent 与 getRenderComponent 支持懒加载与缓存。
  • 错误处理与降级
    • 设计模式下设置全局错误处理器,过滤常见噪音,避免频繁告警。
    • 未找到文件/DSL 时记录警告并返回空,避免阻塞主流程。
  • 内存管理
    • NodeModel.dispose 递归销毁子节点、解除父子关系、清理静态索引,防止内存泄漏。
    • ProjectModel.removePage/removeBlock/deactivate 清理当前文件与首页引用。
  • 自动更新性能优化
    • H5 平台默认 10 秒检查间隔,UI 组件库默认 60 秒检查间隔,避免过于频繁的网络请求。
    • 脚本列表比较采用数组逐项对比,时间复杂度 O(n),适合大多数场景。
    • 刷新前的 1 秒延迟确保异步操作完成,避免竞态条件导致的数据不一致。

故障排查指南

  • 常见问题
    • 找不到 Provider:useProvider 未在 Provider.install 后使用,或未正确 app.use(provider)。
    • 未找到文件/DSL:getFile/getDsl 返回 null,检查项目 pages/blocks 与 ID 是否匹配。
    • 组件版本不一致:开发模式下 useProvider 对组件版本进行校验并通知。
    • 路由未生效:检查 initRouter 与 enableStaticRoute 配置,确认路由是否已添加。
    • 自动更新不工作:检查定时器是否正常运行,确认网络请求是否成功,验证脚本提取正则表达式。
  • 定位手段
    • 查看 Provider.initRouter 与 createStaticRoutes 的路由生成逻辑。
    • 检查 Provider.load 的依赖与资源加载顺序。
    • 利用 adapter.notify 与日志定位错误。
    • 检查自动更新机制中的脚本提取和比较逻辑。
  • 时间同步修复验证
    • 确认刷新工具中 1 秒延迟的存在和正确实现。
    • 验证异步操作完成后才执行刷新的逻辑。
    • 测试竞态条件场景下的稳定性。

结论

该框架以 Provider 为核心,结合 core 的模型与协议、renderer 的渲染与路由、designer 的可视化与管理器,形成一套可扩展、可维护的设计器基础设施。通过清晰的事件系统、完善的生命周期与错误处理、对 Vue3 生态的深度集成,开发者可以快速构建复杂页面与区块的可视化编辑与渲染体验。新增的自动更新机制进一步增强了应用的可维护性,通过合理的检查间隔和竞态条件处理,确保用户能够及时获得最新版本。建议在扩展时遵循协议契约、利用 Provider 的扩展点与渲染器能力,确保性能与稳定性。

开源仓库gitee.com/newgateway/…