====== DivKit:Yandex 开源的 Server-Driven UI 框架 ======
DivKit 是 Yandex 开源的 Server-Driven UI(SDUI)框架,[[https://github.com/divkit/divkit|GitHub 8600+ Star]]。它允许服务端下发 UI 布局,客户端渲染,一套 JSON 同时覆盖 Android、iOS、Web 三端。
与 Nop 平台的思路一致——**UI 由结构化数据驱动,而非手写代码**。区别在于 Nop 的 JSON 由后端 Excel 模型自动生成,DivKit 的 JSON 由服务端直接下发。
===== 项目结构 =====
divkit/
client/ ← 客户端渲染引擎
android/ ← Android(Kotlin)
ios/ ← iOS(Swift)
web/divkit ← Web(TypeScript)
json-builder/ ← 服务端 JSON 生成库
typescript/
kotlin/
python/
schema/ ← JSON Schema 定义
api-generator/ ← 从 Schema 生成多端 API
test-data/ ← 示例和测试数据
===== 工作方式 =====
DivKit 的 JSON 描述页面结构。服务端返回 JSON,客户端直接渲染:
{
"card": {
"log_id": "hello_card",
"states": [
{
"state_id": 0,
"div": {
"type": "container",
"orientation": "vertical",
"items": [
{
"type": "text",
"text": "Hello, DivKit!",
"font_size": 24,
"font_weight": "bold",
"alignment_h": "center"
},
{
"type": "button",
"text": "Click Me",
"actions": [
{
"type": "url",
"url": "https://divkit.tech"
}
]
}
]
}
}
]
}
}
客户端 SDK 解析这个 JSON,映射到原生组件渲染。不需要 WebView,性能接近原生。
===== 三端覆盖 =====
^ 平台 ^ 语言 ^ 集成方式 ^
| Android | Kotlin | 作为 View 嵌入现有应用 |
| iOS | Swift | 作为 UIView 嵌入 |
| Web | TypeScript/React | 独立组件 |
DivKit 的核心理念是"嵌入式"——它不是一个独立的应用框架,而是一个可以嵌入到现有 App 任意页面的 UI 组件。这意味着可以渐进式采用,不需要重写整个应用。
===== 组件系统 =====
DivKit 内置丰富的 UI 组件:
* **布局** — container、grid、column、row、overlay
* **文本** — text(支持富文本和表达式)
* **图片** — image(支持网络图、占位图)
* **输入** — input(文本输入框)
* **交互** — button、slider、switcher
* **容器** — tabs、pager、gallery
* **自定义** — custom 容器可以嵌入原生自定义组件
每个组件支持完整的状态管理:visibility、alpha、transition、transform。
===== 表达式系统 =====
DivKit 的 JSON 支持表达式,用于动态数据绑定:
{
"type": "text",
"text": "@{getString('greeting')}, @{userName}!"
}
表达式在客户端求值,支持:
* 变量引用 @{variable}
* 函数调用 @{formatDate(date, 'dd.MM.yyyy')}
* 条件 @{isVisible ? 'shown' : 'hidden'}
* 本地化 @{localize('key')}
* 算术运算 @{price * 1.2}
===== 与 Nop 前端的对比 =====
^ 对比维度 ^ DivKit ^ Nop 前端 ^
| 驱动方式 | 服务端下发 JSON | 后端模型生成 JSON |
| 跨平台 | Android + iOS + Web | 当前以 Web 为主 |
| 集成方式 | 嵌入原生 View | AMIS/Flux 框架渲染 |
| JSON 生成 | 手动或服务端代码生成 | 由 Delta 管线自动生成 |
| 表达式 | @{} 语法 | AMIS ${} / Flux expression |
| 开源协议 | Apache 2.0 | MIT |
共同点:都认为 UI 应该由结构化数据描述,而不是手写平台特定的代码。
===== 适用场景 =====
* **动态页面** — 服务端控制布局和内容,无需发版
* **A/B 测试** — 不同用户看到不同页面
* **跨平台一致性** — 同一 JSON 三端渲染
* **快速原型** — 在 Playground 中编辑 JSON 即可看到效果
===== 快速体验 =====
在线 Playground:[[https://divkit.tech/playground|divkit.tech/playground]]
# Web 端本地运行
cd client/web/divkit
npm install
npm start
===== 总结 =====
DivKit 和 Nop 平台代表了同一趋势的两条路径:DivKit 从客户端渲染出发,解决多端一致性问题;Nop 从后端模型出发,解决全栈自动化问题。两者都认为**结构化的 UI 描述**是下一代前端开发的基础。
===== 进一步阅读 =====
* [[https://divkit.tech/doc|DivKit 官方文档]]
* [[https://divkit.tech/playground|在线 Playground]]
* 对比 Nop 前端的 [[../practical_guide/frontend/overview|前端项目总览]]