生成模型: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 至关重要的特性:
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 包含以下包:
主包,包含 Gateway、Agent、CLI 等核心功能
为什么选择 pnpm?
pnpm 相比 npm 和 yarn 有几个关键优势:
硬链接存储:所有包的依赖存储在全局 .pnpm-store 中,通过硬链接复用。对于 OpenClaw 这样的大型项目,这能节省大量磁盘空间。
严格的依赖隔离:pnpm 默认不允许"幽灵依赖"(Phantom Dependencies)——即不在 package.json 中声明但通过其他包间接可用的依赖。这确保了依赖关系的显式性。
Monorepo 原生支持:pnpm 内置了 Workspace 协议,不需要额外的 Monorepo 工具(如 Lerna、Nx)。
OpenClaw 使用了 pnpm 的 overrides 功能来统一依赖版本,确保安全性和一致性:
1.3.3 构建工具链:tsdown / oxlint / oxfmt / vitest
OpenClaw 的工具链选择体现了现代 JavaScript 生态中"Rust 化"的趋势——使用 Rust 编写的高性能工具替代传统的 JavaScript 工具。
tsdown 是 OpenClaw 的打包工具,基于 Rolldown(Rollup 的 Rust 实现)。tsdown.config.ts 定义了四个构建入口:
为什么有两个主入口?
src/index.ts:库入口,导出公共 API,可被外部代码 import
src/entry.ts:CLI 入口,处理进程初始化、实验性警告抑制,然后委托给 Commander.js 程序
oxlint 是一个用 Rust 编写的 JavaScript/TypeScript Linter,比 ESLint 快数十倍。OpenClaw 使用 oxlint 并启用了**类型感知(type-aware)**规则:
配置文件 .oxlintrc.json 定义了具体的规则集。
oxfmt(Oxidized Formatter)是 Rust 编写的代码格式化工具:
vitest 是基于 Vite 的测试框架。OpenClaw 有多个测试配置文件,对应不同的测试类型:
vitest.extensions.config.ts
单元测试的配置值得关注:
测试覆盖率要求 70% 的行覆盖和函数覆盖——对于一个这样规模的项目来说是合理的基线。
1.3.4 原生应用:Swift(macOS/iOS)、Kotlin(Android)
OpenClaw 不仅是一个 Node.js 后端——它还提供了原生客户端应用:
macOS 应用(Swift + SwiftUI)
macOS 应用运行在系统菜单栏,提供:
Voice Wake(语音唤醒)+ Push-to-Talk
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 原生
tsdown(Rolldown)、Vite(UI)
vitest(单元/E2E/Live/Docker)
Lit(UI)、Hono/Express(HTTP)