Onlook 中文文档

Onlook 架构

Onlook 采用 monorepo 结构,包含多个相互关联的应用和包,主要使用 Next.js、Supabase、TailwindCSS 和 Drizzle 构建。

完整架构

目录结构

onlook/
|
├── apps/
│   ├── web/                       # Web 应用组件
│   │   ├── client/                # 客户端应用(Next.js)
│   │   ├── preload/               # 预加载脚本(TypeScript)
│   │   └── server/                # 服务器端代码(Fastify.js - 目前未使用)
│   │
│   └── backend/                   # 后端(Supabase)

├── packages/
│   ├── models/                    # 共享数据模型和类型
│   ├── ui/                        # 可复用 UI 组件和主题(ShadCN + TailwindCSS)
│   ├── ai/                        # AI 集成工具(AI SDK)
│   └── schema/                    # 应用共享模式(Drizzle ORM)

└── docs/                          # 文档(Fumadocs + Nextjs)

高层概述

可视化编辑

Onlook 本质上是一个指向本地运行应用的浏览器。它可以像 Chrome Devtool 一样操作 DOM,所有这些更改通过 CSS 样式表或 DOM 操作注入到页面中。这些更改在写入代码之前是非持久化的。

写入代码

为了将更改转换为代码,我们在构建时向 DOM 元素注入一个属性,类似 sourcemap,指向代码位置。该属性提供代码块的位置和组件作用域。随后我们找到对应代码,解析成 AST,注入样式,然后写回代码。

框架支持

此技术与框架无关,因我们可以为其他框架替换不同的编译器。它可以应用于任何代码库,因为仅使用了不需自定义代码的开放标准。生成的代码直接写入你的本地代码库,因此你可以随时使用输出,不会被工具锁定。

操作(Actions)

所有更改以操作的形式存储,使其可序列化、存储和重现。这样做的目的是未来可以支持在线协作或让智能代理生成操作。要实现这一点,我们只需服务本地运行的页面并解析传入的操作。

画布工作原理

画布架构

编辑工作原理

编辑操作如何在 DOM 与写入代码间协作

讲解视频:https://youtu.be/aGUD9xS1XvA

时间点:

编辑循环

参考资料

旧的 electron 架构文档。仍然适用,将 webview 替换为 iframe:https://github.com/onlook-dev/desktop/wiki/Architecture