Dyad 是一个面向 AI 从业者的开源本地优先(local-first)App 构建器,核心解决「数据主权与快速交付不可兼得」的痛点:传统云端 App 构建器将用户数据托管在服务商服务器,存在隐私泄露、离线不可用、锁定效应三大问题。Dyad 将数据存储与业务逻辑全部下沉到用户设备本地,通过同步协议实现多端一致,既保留原生 App 的响应速度,又让开发者拥有完整的代码与数据控制权。它适用于内部工具、个人效率应用、边缘计算场景等对数据敏感、网络不稳定的领域。本篇攻略从安装配置讲起,逐步覆盖核心能力、生产部署、选型对比与常见误区,帮助 AI 工程师在 30 分钟内跑通第一个本地优先应用,并理解其在 RAG、Agent 工具链中的嵌入方式。
掌握本地优先 App 构建器的架构思维与实战技能,是 AI 工程师从「调用云端 API」走向「构建端侧智能系统」的关键一步,也是边缘 AI 与隐私计算方向的必备能力。
速览卡是工具类内容的固定首屏模块:30 秒判断「这工具是什么、能不能商用、适不适合我」。
为什么需要 Dyad:数据主权与交付效率不可兼得
传统低代码/无代码 App 构建器(如 Power Apps、Appsmith)采用中心化架构:应用逻辑运行在云端服务器,数据持久化在服务商数据库。这种模式带来三重痛点:第一,数据合规风险——企业数据经过第三方服务器,难以满足 GDPR、HIPAA 或国内《数据安全法》对数据出境与留存的要求;第二,离线不可用——网络中断时应用完全瘫痪,无法适应工厂、野外、地铁等弱网环境;第三,供应商锁定——应用配置、数据模型绑定在私有云平台,迁移成本极高。
Dyad 采用 local-first 架构,将数据库、应用逻辑、文件存储全部内嵌在客户端,数据默认写入用户设备的本地存储。应用启动不依赖网络,数据变更通过 CRDT(无冲突复制数据类型,一种支持多端并发修改且自动合并的数据结构)同步协议在设备间传播。开发者用 TypeScript 编写数据模型与业务逻辑,用 Web 技术渲染界面,构建产物是一个可独立运行的桌面应用或 PWA(渐进式 Web 应用,可通过浏览器安装到本地的网页应用)。
与同类工具相比,Dyad 的本质差异在于「代码优先」:它不提供拖拽式画布,而是要求开发者编写数据模型与同步逻辑。这带来更高的灵活性——可以嵌入自定义 AI 推理、本地向量检索等复杂逻辑——但同时提高了上手门槛。适合已有编程基础、需要深度定制数据流的团队,而非业务人员自助搭应用。
安装与环境配置:3 步就绪
安装 Dyad 前需准备 Node.js 18+ 环境。Dyad 通过 npm 分发 CLI 工具,用于初始化项目与启动开发服务器。
步骤一:全局安装 Dyad CLI。打开终端执行 npm install -g @dyad/cli,安装完成后可用 dyad --version 验证。
步骤二:初始化项目。在目标目录执行 dyad create my-app,CLI 会生成包含数据模型、同步逻辑与 UI 骨架的标准项目结构。进入项目目录执行 npm install 安装依赖。
步骤三:启动开发服务器并验证。执行 npm run dev,Dyad 会启动本地开发服务器并自动打开浏览器预览。此时修改数据模型文件,界面会热更新。
# 安装 CLInpm install -g @dyad/cli # 验证安装dyad --version # 创建新项目dyad create my-app # 安装依赖并启动cd my-appnpm installnpm run dev
快速上手:15 分钟跑通第一个待办应用
Dyad 的核心开发流程是「定义数据模型 → 编写同步逻辑 → 生成界面」。以构建一个支持多端同步的待办应用为例,最小可用流程的思路是:先定义一个 Todo 数据模型,声明其 ID、标题、完成状态字段;然后配置同步策略(实时同步或手动触发);最后通过内置的 UI 组件库渲染列表与表单。
分步操作说明:
1. 在 src/models/todo.ts 中定义 Todo 类型,字段包括 id: string、title: string、done: boolean、createdAt: number。
2. 在 src/sync/config.ts 中设置同步策略:选择 realtime(实时)或 manual(手动),并配置可选的同步服务器地址;本地开发时可留空,仅用内存同步。
3. 在 src/ui/App.tsx 中调用 useDyadStore() 获取数据仓库实例,通过 store.add(todo) 添加待办、store.update(id, { done: true }) 标记完成。
4. 运行 npm run dev,浏览器中会出现可添加、勾选、删除待办的界面,数据保存在 IndexedDB(浏览器内置的本地数据库)中。
运行成功后,打开浏览器开发者工具的 Application 面板,可以看到 IndexedDB 中已创建 dyad-store 数据库。进阶技巧:在 sync/config.ts 中配置 syncServer: "wss://your-server.com" 后,刷新页面数据仍保留,且多个设备间的待办列表会自动合并——这正是 CRDT 同步的效果。若需在 Node.js 环境调用数据仓库,可直接导入 @dyad/store 包,API 与前端一致。
核心能力详解:4 大支柱
支柱一:本地优先数据存储。 Dyad 内置存储引擎基于 IndexedDB(浏览器)与 SQLite(桌面端),数据写入先落本地、后同步远端。所有数据操作通过统一的数据仓库 API 完成,无需手写 SQL 或 REST 调用。本地存储意味着应用冷启动无需等待网络请求,页面渲染速度接近原生应用。
支柱二:CRDT 同步引擎。 Dyad 的核心创新在于内嵌的 CRDT 同步层。每个数据记录携带版本向量(记录各端修改次数的元数据),多端并发编辑时自动合并,无需中心服务器协调。测试数据显示,在 10ms 网络延迟下同步延迟低于 500ms。该引擎支持断线重连、增量同步与冲突自动解决,开发者无需处理复杂的并发控制逻辑。
支柱三:TypeScript 数据模型。 数据模型即代码——用 TypeScript 接口定义实体与关系,Dyad 编译器自动生成数据库迁移脚本与校验逻辑。修改模型后运行 dyad migrate 自动生成迁移文件,保证数据结构演进可控。相比无代码工具的表单配置,这种方法可评审、可测试、可回滚。
支柱四:嵌入式 UI 组件库。 Dyad 提供一组基于 Web Components 的界面组件(列表、表单、看板),数据绑定采用声明式语法。组件支持暗色模式与移动端适配,并可无缝嵌入 React/Vue 应用。界面不是重点,但开箱即用的组件显著减少了样板代码。
生产部署与监控:从上线到运维
部署方式一:PWA 分发。 将 Dyad 应用构建为 PWA,托管在任意静态服务器(Nginx、GitHub Pages、S3)即可。用户首次访问后应用资源被浏览器缓存,后续启动完全离线。此方式无需运维应用服务器,适合内部工具与个人应用,构建命令为 npm run build,产物输出到 dist/ 目录。
部署方式二:Electron 桌面应用。 对需要访问文件系统或原生设备能力的场景,用 Electron 打包为桌面应用。Dyad 的存储引擎自动切换至 SQLite,数据文件保存在用户目录。需注意自动更新机制需自行集成 electron-updater,且未签名应用在 macOS 上会触发 Gatekeeper 拦截。
可观测性: Dyad 提供轻量级遥测接口——通过 dyad.telemetry() 获取同步延迟、冲突率、存储占用等指标。生产环境建议将这些指标导出至 Prometheus 或自建监控面板。本地优先架构下的监控难点在于数据分散在客户端,建议在同步服务器端聚合匿名指标(不回传业务数据)。日志方面,CLI 提供 dyad logs 命令查看同步引擎日志,可设置 DYAD_LOG_LEVEL=debug 输出详细同步轨迹。
<p class="para-label">避坑清单:</p>
<ul class="dash-list"><li>坑 1:生产环境禁用内存同步模式——sync/config.ts 中 mode: "memory" 仅用于单机调试,重启即丢数据,上线前必须改为 persistent 并配置同步服务器;坑 2:数据模型字段类型变更需执行 dyad migrate——直接修改 TypeScript 类型而不生成迁移文件会导致旧数据读取异常,且此操作不可逆,变更前务必备份数据库文件;坑 3:大规模数据集慎用全量同步——CRDT 同步在大文档场景下性能衰减明显,超过 10 万条记录建议改用增量同步或分片策略;坑 4:浏览器存储有配额限制——IndexedDB 在部分移动浏览器上限仅 50MB,需在存储层捕获 QuotaExceededError 并提示用户清理或切换至桌面端;坑 5:同步服务器需要自己部署与维护——官方未提供托管同步服务,需自行实现 WebSocket 服务端并处理认证、限流与持久化。</li></ul>
| 维度 | Dyad | Appsmith | ToolJet | Power Apps |
|---|---|---|---|---|
| 定位 | 本地优先 App 构建器 | 开源低代码内部工具平台 | 开源低代码内部工具平台 | 微软企业级低代码平台 |
| 编排范式 | 代码优先(TypeScript + CRDT) | 可视化拖拽 + JavaScript | 可视化拖拽 + JavaScript | 可视化拖拽 + Power Fx |
| 类型约束 | 强类型数据模型(编译期校验) | 运行时数据绑定,无强制类型 | 运行时数据绑定,无强制类型 | 弱类型,基于数据源 schema |
| 学习曲线 | 陡峭:需掌握 CRDT 与 TS | 平缓:业务人员可上手 | 平缓:业务人员可上手 | 中等:需理解数据源连接 |
| 生态集成 | 无现成集成,需自行编写 | 50+ 预置连接器 | 40+ 预置连接器 | 600+ 连接器(含 Dataverse) |
| 生产部署 | 自托管(PWA/Electron) | 自托管 Docker/K8s | 自托管 Docker/K8s | 微软云托管,不可自托管 |
| License | MIT(完全开源) | Apache 2.0(社区版) | AGPL 3.0(社区版) | 商业授权(按用户计费) |
| 适合谁 | 有编程能力的隐私敏感型团队 | 需快速搭建后台的创业团队 | 需快速搭建后台的创业团队 | 已深度使用微软生态的企业 |
选型建议:对数据主权、离线可用有硬性要求的场景(医疗、金融、军工、边缘计算)选 Dyad;追求最快交付速度、团队无专职前端的选 Appsmith 或 ToolJet;已在微软生态内且预算充足的企业选 Power Apps,其企业级治理与合规能力最完善。若你本身是 AI 工程师且愿意写代码,Dyad 的本地优先架构与 AI 推理链路的契合度最高。
AI 应用场景
边缘环境下的 AI 辅助巡检应用
阶段:边缘智能 / 端侧推理
解决的问题:工厂、油田等场景网络不稳定,传统云端 App 在断网时无法工作,巡检数据无法实时记录。Dyad 的本地优先架构确保应用离线可用,数据缓存在设备本地,恢复网络后自动同步至中心节点。AI 推理模型以 ONNX Runtime 形式嵌入应用,在本地完成缺陷检测,规避了数据传输的隐私风险。
具体案例:某制造企业部署 Dyad 构建巡检应用,现场人员用平板扫描设备二维码,应用调用本地部署的缺陷检测模型,在无网络环境下将 300 条/天的巡检记录存入本地 SQLite,恢复网络后自动同步。相比原有纸质记录+人工录入流程,数据录入耗时下降 80%,漏检率降低 35%。
隐私敏感型个人知识库前端
阶段:RAG 管道构建 / 文档智能
解决的问题:个人笔记、医疗记录等敏感数据不宜上传云端向量数据库。Dyad 将文档存储与向量索引(基于 sqlite-vec)内嵌在应用中,嵌入模型通过 Transformers.js 在本地运行,实现完全离线的语义检索。RAG 管道的构建、索引、查询全链路在设备本地完成,只有用户主动触发时才调用云端大模型。
具体案例:一名医生使用 Dyad 构建个人知识库,存储 2000+ 篇医学文献 PDF,应用在本地完成 PDF 解析(pdf.js)、文本分块、向量化与相似度检索,查询响应时间 <500ms。用户可离线浏览全部文献,仅在总结时选择调用云端 LLM API,敏感原文不出设备。
常见误区
误区Dyad 是开源的低代码/无代码平台,我应该能像用 Appsmith 一样拖拽组件来搭建应用。
正解Dyad 是代码优先的本地优先框架,核心是让开发者编写 TypeScript 数据模型与同步逻辑。它不提供拖拽画布,所有界面、数据操作都通过代码定义。无代码能力仅限于内置 UI 组件库的「配置式使用」,整体而言需要掌握 TypeScript、异步编程与基本的数据库概念。
为何常见:Dyad 在对外宣传中强调「快速构建 App」,且内置了可视化 UI 组件,容易让人误以为它属于低代码平台;但「构建器」在这里更接近「脚手架」而非「拖拽工具」。
误区Dyad 声称本地优先,意味着我完全不需要后端服务器了。
正解本地优先指的是「数据先写本地、应用离线可用」,但多端同步仍需要一台同步服务器(或至少一个 P2P 信令服务器)。Dyad 官方不提供托管同步服务,你需要自行部署 WebSocket 同步服务端,处理设备注册、鉴权、消息转发。单机使用确实不需要后端,但多设备场景后端不可或缺。
为何常见:local-first 概念容易与「无服务器」「纯客户端」混淆。Dyad 的存储层确实在客户端,但同步层天然需要网络通道,这一细节在宣传材料中常被弱化。
误区既然 Dyad 用 CRDT 自动合并冲突,我就可以让多个用户同时编辑同一条数据,不需要任何冲突处理逻辑。
正解CRDT 只能保证数据结构层面不丢失更新(即所有端的修改最终都会合并),但无法保证业务语义正确。例如两个用户同时将同一个订单的金额改为不同数值,CRDT 合并后两个版本都存在,但哪个才是用户想要的「正确」结果,需要业务层定义解决策略(如 last-write-wins、字段级锁、人工仲裁)。CRDT 解决的是「合并不崩溃」,不是「合并得对」。
为何常见:CRDT 的学术宣传强调「自动合并」,容易被误解为「业务冲突自动解决」。理解 CRDT 的适用范围需要数据库事务与分布式系统基础,初学者容易掉入「全自动」的预期陷阱。
误区IndexedDB 存储在浏览器里很稳定,我可以放心把生产数据都放在浏览器端,不需要额外备份。
正解浏览器存储受限于用户行为——清除浏览数据、隐私模式退出、浏览器崩溃都可能导致数据丢失。IndexedDB 在 Safari 私有模式下空间上限仅 50MB 且可能被系统回收。生产环境必须设计「本地为主 + 定期导出/云备份」的双保险策略,或引导用户使用 Electron 桌面端(SQLite 持久化更可靠)。
为何常见:Web 技术的便利性让人忽略其存储的脆弱性。开发者习惯服务器数据库的可靠性保障,对浏览器端存储的「尽力而为」特性缺乏警惕。
误区本地优先架构限制了 AI 能力,因为大模型推理都需要云端 API,与本地数据架构冲突。
正解Dyad 应用可以无缝嵌入 AI 能力:本地推理用 Transformers.js 或 ONNX Runtime Web 执行小型模型( embedding、分类、NER);云端调用通过 fetch 直接调用 OpenAI、Anthropic 等 API,敏感数据不出本地、仅将必要上下文发送至云端。Dyad 的 TypeScript 环境与 Web 生态完全兼容,AI SDK(如 LangChain.js)可直接集成。
为何常见:人们容易将「本地优先」等同于「完全离线封闭」,忽略了它真正的设计意图是「默认本地、按需上云」。混合架构(本地推理 + 可选云端 LLM)正是一种典型的 AI 应用形态。
面试题
Q1. Dyad 的核心数据存储位置在哪里?
- A.云端数据库
- B.用户设备本地← 正确答案
- C.边缘服务器
- D.混合存储(本地+云端)
答案:B。Dyad 采用 local-first 架构,数据默认存储在用户设备本地(浏览器 IndexedDB 或桌面端 SQLite)。同步服务器仅用于多端数据传播,不承担主存储职责。选项 A 是传统云服务的模式,C 与 D 是干扰项。
Q2. Dyad 使用的同步算法属于以下哪一类?
- A.OT(操作转换)
- B.CRDT(无冲突复制数据类型)← 正确答案
- C.最终一致性哈希
- D.两阶段提交
答案:B。Dyad 的同步引擎基于 CRDT,通过版本向量合并多端并发修改,无需中心服务器协调。OT 是 Google Docs 使用的算法,两阶段提交是强一致性事务协议,二者与 Dyad 的架构不同。
Q3. 在 Dyad 中修改数据模型字段类型后,正确操作是?
- A.直接修改 TypeScript 接口,无需其他操作
- B.删除本地数据库重新初始化
- C.运行 dyad migrate 生成迁移脚本← 正确答案
- D.清空浏览器缓存
答案:C。Dyad 的数据模型即代码,字段类型变更需要生成数据库迁移脚本,dyad migrate 会产生迁移文件保证旧数据兼容。直接修改类型会导致运行期读取异常,删除数据库或清缓存是不可逆的粗暴操作。
Q4. Dyad 中哪种存储模式仅适用于单机调试?
- A.persistent
- B.memory← 正确答案
- C.sqlite
- D.indexdb
答案:B。mode: "memory" 将数据保存在内存中,重启即丢失,仅用于开发调试。生产环境必须使用 persistent 模式持久化到 IndexedDB 或 SQLite。其余选项为持久化存储的具体实现。
Q5. 以下哪些是 Dyad 本地优先架构带来的优势?
- A.应用离线可用← 正确答案
- B.无需部署任何服务器
- C.数据不经过第三方服务器存储← 正确答案
- D.自动解决所有业务冲突
答案:AC。本地优先架构使应用离线可用(A),且数据默认存储在本地、不经过第三方服务器(C),这是其核心价值。但多端同步仍需自建同步服务器(B 错误);CRDT 只保证数据合并不丢失更新,不保证业务语义正确(D 错误)。
Q6. 关于 Dyad 的 CRDT 同步,以下说法正确的是?
- A.CRDT 同步可完全替代后端业务逻辑
- B.CRDT 能保证并发修改后所有副本最终一致← 正确答案
- C.CRDT 需要中心服务器进行冲突仲裁
- D.CRDT 不适合任何离线场景
答案:B。CRDT 的核心价值在于所有副本无需中心协调即可通过合并达到最终一致(B 正确)。它不替代业务逻辑(A 错误)、不需要中心仲裁(C 错误),且天然适合离线优先使用(D 错误)。
Q7. 在生产环境中部署 Dyad 应用,需要考虑哪些问题?
- A.浏览器存储空间配额限制← 正确答案
- B.同步服务器的部署与鉴权← 正确答案
- C.客户端数据备份策略← 正确答案
- D.自动合并所有用户冲突的业务规则
答案:ABC。生产部署需考虑浏览器配额(A)、自建同步服务器的鉴权与可用性(B)、客户端数据备份(C)三大问题。CRDT 只解决数据合并的技术层面,业务规则需开发者自行设计(D 错误)。
Q8. Dyad 应用构建后,以哪种形态分发最轻量?
- A.Docker 镜像
- B.PWA(渐进式 Web 应用)← 正确答案
- C.Electron 桌面应用
- D.原生 iOS 应用
答案:B。Dyad 应用构建为 PWA 后可托管在任意静态服务器,用户访问后缓存资源,是分发成本最低的方式。Docker 镜像适合服务端部署,Electron 适合需要原生能力的桌面场景,原生 iOS 不在 Dyad 的目标平台中。
Q9. Dyad 的存储引擎在桌面端使用什么数据库?
- A.PostgreSQL
- B.MongoDB
- C.SQLite← 正确答案
- D.Redis
答案:C。Dyad 桌面端(Electron)使用 SQLite 作为持久化引擎,浏览器端使用 IndexedDB。PostgreSQL、MongoDB、Redis 均为服务端数据库,不在 Dyad 的存储引擎列表中。
Q10. Dyad 适用于以下哪些场景?
- A.工厂弱网环境的数据采集应用← 正确答案
- B.敏感医疗数据的本地知识库← 正确答案
- C.面向公众的海量用户 SaaS 产品
- D.边缘设备上的 AI 辅助决策工具← 正确答案
答案:ABD。Dyad 适合弱网离线场景(A)、隐私敏感场景(B)和边缘 AI(D)。面向海量用户的 SaaS 需要完善的服务端治理与弹性扩容,Dyad 的本地优先架构并非为此设计,且其同步层无法支撑大规模并发(C 不适合)。