一、缘起:为什么我要给 DialogBox 加上 resizable 能力?
作为一名在企业级应用开发一线摸爬滚打多年的前端,DialogBox 这个组件我用了不下百次。但每次用的时候,总觉得差点意思——用户想自己调整弹窗大小?不支持。
在 OpenTiny 前端智能化技术分享中,听到关于 AI Agent 和 WebMCP 的讨论时,我意识到这是一个契机。传统的组件开发模式是开发者定义好所有功能,用户被动接受。但在 AI 时代,组件应该是'可对话'的——用户说'我想把这个弹窗调大一点',AI 就能理解意图并调用相应的 API。
要实现这个愿景,首先得让组件具备足够的能力。所以,我决定从最基础的开始:为 TinyVue 的 DialogBox 组件实现真正的 resizable 功能。这不仅是功能增强,更是为未来的 WebAgent 交互打下基础。
二、实战:深度解析 Renderless 架构的开发体验
2.1 第一次扫描源码的震撼
刚开始看 TinyVue 源码时,被它的架构设计惊艳到了。
以前接触过的组件库(比如 Element、Ant Design Vue),都是把逻辑和视图混在一起的。但 TinyVue 采用了 Renderless 架构——核心思想就是逻辑和视图彻底分离。
怎么理解这个架构?
- 传统架构就像一个厨师,既要负责炒菜(业务逻辑),又要负责摆盘(UI 渲染)。结果就是换个盘子(比如从 PC 端换到移动端)就得重新学一遍炒菜。
- Renderless 架构则把厨师分成两个角色:
- 逻辑厨师:只负责炒菜,不管摆盘(对应
vue.ts文件) - 摆盘师傅:只负责摆盘,不会炒菜(对应
pc.vue、mobile.vue文件)
- 逻辑厨师:只负责炒菜,不管摆盘(对应
这样做的好处是什么?AI 友好的秘密就在这里!AI 最擅长的是生成纯逻辑代码,但不太理解复杂的 HTML/CSS。Renderless 架构正好让 AI 专注于它擅长的部分,提高了 AI 生成代码的准确性。
2.2 实现 resizable 的核心思路
第一步:理解 OpenTiny 的组件结构
通过查看源码,发现 DialogBox 的文件结构是这样的:
dialog-box/
├── src/
│ ├── pc.vue # PC 端的 UI 表现
│ └── mobile.vue # 移动端的 UI 表现
├── vue.ts # 核心逻辑层(所有平台共用)
└── types.ts # 类型定义
这意味着只需要在 vue.ts 中添加逻辑,然后在 pc.vue 和 mobile.vue 中添加对应的 UI 句柄,就能实现跨平台的 resizable 功能。
操作如下:
环境搭建 安装 Node.js 18+ 安装 pnpm 9+
npm install -g pnpm
使用 CLI 创建低代码平台
npx @opentiny/tiny-engine-cli@latest create-platform
cd <project-name>
pnpm install
第二步:设计 resizable 的数据流
要实现拖拽缩放,需要设计一套完整的数据流。
基于这个流程,设计了以下几个关键状态:
// 在 vue.ts 中添加的状态
resizing: ,
: ,
: ,
: ,
: ,
: ,
: ,
:


