1.3 技术栈全景

生成模型:Claude Opus 4.6 (anthropic/claude-opus-4-6) Token 消耗:输入 ~130,000 tokens,输出 ~12,000 tokens(本章合计)


OpenClaw 是一个多技术栈项目,涵盖了从后端服务到原生移动应用的完整技术谱系。本节将系统地介绍其技术选型和工程基础设施。

1.3.1 TypeScript + Node.js 22+:语言与运行时选型

OpenClaw 的核心代码使用 TypeScript 编写,运行在 Node.js 22+ 环境上。

为什么选择 TypeScript?

TypeScript 是 JavaScript 的超集,添加了静态类型系统。对于一个像 OpenClaw 这样的大型项目(src/ 目录下 69 个子模块、数百个文件),类型系统提供了至关重要的安全保障。OpenClaw 使用了严格模式(strict: true),这意味着所有变量必须有明确的类型,不允许隐式 any

tsconfig.json 可以看到关键的编译器配置:

{
  "compilerOptions": {
    "strict": true,                    // 严格类型检查
    "target": "es2023",                // 编译目标:ES2023
    "module": "NodeNext",              // 模块系统:Node.js ESM
    "moduleResolution": "NodeNext",    // 模块解析策略
    "experimentalDecorators": true,    // 启用装饰器(UI 组件需要)
    "lib": ["DOM", "DOM.Iterable", "ES2023", "ScriptHost"],
    "noEmit": true                     // 不由 tsc 输出,由 tsdown 构建
  }
}

几个值得注意的选择:

  • module: "NodeNext":使用 Node.js 原生 ESM 模块系统。package.json 中的 "type": "module" 确认了这一点。这意味着所有导入都使用 .js 扩展名(即使源文件是 .ts),这是 Node.js ESM 的要求。

  • experimentalDecorators: true:这是为了支持 Lit Web Components 的装饰器语法(如 @state()@property())。

  • noEmit: true:TypeScript 编译器仅用于类型检查,实际的代码转换和打包由 tsdown 完成。

为什么要求 Node.js 22+?

OpenClaw 的 package.json 中明确声明了最低运行时要求:

Node.js 22 带来了几个对 OpenClaw 至关重要的特性:

  1. 原生 ESM 支持成熟:不再需要实验性标志

  2. node:test 改进:更好的原生测试支持

  3. 性能优化:V8 引擎更新带来的整体性能提升

  4. WebSocket 支持增强undici 的 WebSocket 实现更稳定

在开发时,OpenClaw 使用 tsx(TypeScript Execute)来直接运行 TypeScript 文件,避免了每次修改都需要重新编译的开发循环:

1.3.2 pnpm Monorepo 工程结构

OpenClaw 采用 pnpm Monorepo(单仓库多包)结构来组织代码。pnpm-workspace.yaml 定义了工作区的包边界:

衍生解释:Monorepo(单一仓库)是一种代码组织策略,将多个相关项目放在同一个 Git 仓库中管理。与之相对的是 Polyrepo(每个项目一个独立仓库)。Monorepo 的优点包括:代码共享方便、依赖版本统一、原子性提交(一个 commit 可以同时修改多个包)。缺点是仓库体积可能很大,需要专门的工具来管理。

这个 Monorepo 包含以下包:

路径
说明

openclaw

.

主包,包含 Gateway、Agent、CLI 等核心功能

openclaw-control-ui

ui/

Web 控制台 UI

clawdbot

packages/clawdbot/

内部共享包

moltbot

packages/moltbot/

内部共享包(兼容别名)

31 个扩展

extensions/*/

各通道扩展包

为什么选择 pnpm?

pnpm 相比 npm 和 yarn 有几个关键优势:

  1. 硬链接存储:所有包的依赖存储在全局 .pnpm-store 中,通过硬链接复用。对于 OpenClaw 这样的大型项目,这能节省大量磁盘空间。

  2. 严格的依赖隔离:pnpm 默认不允许"幽灵依赖"(Phantom Dependencies)——即不在 package.json 中声明但通过其他包间接可用的依赖。这确保了依赖关系的显式性。

  3. Monorepo 原生支持:pnpm 内置了 Workspace 协议,不需要额外的 Monorepo 工具(如 Lerna、Nx)。

OpenClaw 使用了 pnpm 的 overrides 功能来统一依赖版本,确保安全性和一致性:

1.3.3 构建工具链:tsdown / oxlint / oxfmt / vitest

OpenClaw 的工具链选择体现了现代 JavaScript 生态中"Rust 化"的趋势——使用 Rust 编写的高性能工具替代传统的 JavaScript 工具。

构建:tsdown

tsdown 是 OpenClaw 的打包工具,基于 Rolldown(Rollup 的 Rust 实现)。tsdown.config.ts 定义了四个构建入口:

为什么有两个主入口?

  • src/index.ts:库入口,导出公共 API,可被外部代码 import

  • src/entry.ts:CLI 入口,处理进程初始化、实验性警告抑制,然后委托给 Commander.js 程序

Lint:oxlint

oxlint 是一个用 Rust 编写的 JavaScript/TypeScript Linter,比 ESLint 快数十倍。OpenClaw 使用 oxlint 并启用了**类型感知(type-aware)**规则:

配置文件 .oxlintrc.json 定义了具体的规则集。

格式化:oxfmt

oxfmt(Oxidized Formatter)是 Rust 编写的代码格式化工具:

测试:vitest

vitest 是基于 Vite 的测试框架。OpenClaw 有多个测试配置文件,对应不同的测试类型:

配置文件
用途

vitest.config.ts

单元测试(src/**/*.test.ts

vitest.e2e.config.ts

端到端测试(*.e2e.test.ts

vitest.live.config.ts

实时测试(需要真实 API Key)

vitest.gateway.config.ts

Gateway 集成测试

vitest.extensions.config.ts

扩展测试

vitest.unit.config.ts

纯单元测试

单元测试的配置值得关注:

测试覆盖率要求 70% 的行覆盖和函数覆盖——对于一个这样规模的项目来说是合理的基线。

完整的质量保证流水线

1.3.4 原生应用:Swift(macOS/iOS)、Kotlin(Android)

OpenClaw 不仅是一个 Node.js 后端——它还提供了原生客户端应用:

macOS 应用(Swift + SwiftUI)

macOS 应用运行在系统菜单栏,提供:

  • Gateway 健康监控

  • Voice Wake(语音唤醒)+ Push-to-Talk

  • Talk Mode 覆盖层

  • WebChat 内嵌

  • 远程 Gateway 控制

iOS 应用(Swift)

iOS 应用作为**节点(Node)**运行,通过 Bonjour/mDNS 发现并配对 Gateway。提供 Canvas 表面、语音触发、摄像头等能力。

Android 应用(Kotlin)

Android 应用同样作为节点运行,提供 Canvas、摄像头、屏幕录制等设备能力。

跨平台共享代码

macOS 和 iOS 应用共享一个 Swift Package(OpenClawKit),包含 Gateway 协议实现、WebSocket 客户端等公共逻辑。

协议类型的跨语言一致性

OpenClaw 使用了一个精巧的机制来保证 TypeScript、JSON Schema 和 Swift 之间的协议一致性:

CI 流水线通过 pnpm protocol:check 确保任何协议变更都同步反映到所有语言的实现中。

Web UI(Lit + Vite)

Web 控制台 UI 使用 Lit Web Components 框架和 Vite 构建工具:

衍生解释:Lit 是 Google 开发的轻量级 Web Components 库。Web Components 是一组浏览器原生 API,包括 Custom Elements(自定义元素)、Shadow DOM(影子 DOM,实现样式隔离)、HTML Templates(HTML 模板)。Lit 在此基础上添加了声明式模板语法和响应式属性系统,使得创建高性能 Web 组件变得简洁。相比 React 或 Vue,Lit 的优势在于零运行时开销(直接使用浏览器原生能力)和极小的包体积。


综上所述,OpenClaw 的技术栈可以总结为:

层次
技术

语言

TypeScript(核心)、Swift(macOS/iOS)、Kotlin(Android)

运行时

Node.js 22+、macOS/iOS/Android 原生

包管理

pnpm Monorepo

构建

tsdown(Rolldown)、Vite(UI)

测试

vitest(单元/E2E/Live/Docker)

Lint/Format

oxlint + oxfmt(Rust 驱动)

Web 框架

Lit(UI)、Hono/Express(HTTP)

WebSocket

ws 库

数据库

SQLite(记忆存储)

容器化

Docker(沙箱/部署)

CI/CD

GitHub Actions

Last updated