1.2 技术栈与运行环境

章节目标:了解 Claude Code 的技术选型,理解每个技术选择背后的原因。


运行时:为什么选 Bun?

Claude Code 运行在 Bun ≥ 1.3.5(同时兼容 Node.js ≥ 24)。

bun install    # 安装依赖
bun run dev    # 启动

选择 Bun 而非 Node.js 的原因:

特性优势
原生 TypeScript 执行无需编译步骤,直接运行 .ts 文件
bun:bundle 特性feature() 编译时开关直接集成于打包器
更快的启动速度CLI 工具启动延迟更低
内置测试运行器统一工具链

最关键的是 import { feature } from 'bun:bundle'——这个 API 允许在构建时做死代码消除(DCE),让不同版本的功能开关能从二进制层面彻底隔离。


UI 层:React + Ink

这是整个技术栈里最"反直觉"的选择:在终端里用 React 渲染 UI

// src/components/某个组件.tsx

function StatusBar({ model, cost }: Props) {
  return (
    <Box borderStyle="round">
      <Text color="green">{model}</Text>
      <Text> ${cost.toFixed(4)}</Text>
    </Box>
  )
}

Ink 是一个把 React 渲染到终端的库。Claude Code 用它实现了:

源码中有 148 个终端 UI 组件(src/components/)和 87 个自定义 Hooks(src/hooks/),规模堪比一个中型 Web 前端项目。


AI 通信层:多云支持

// 三种 AI 后端,同一套接口
// 或
process.env.CLAUDE_CODE_USE_BEDROCK     // AWS Bedrock
// 或
process.env.CLAUDE_CODE_USE_VERTEX      // Google Cloud Vertex AI

这种设计让企业用户可以在自己的云环境中部署,无需流量经过 Anthropic 服务器。


完整依赖技术栈

核心 AI 相关

用途
@anthropic-ai/sdkAnthropic API 客户端
@anthropic-ai/claude-agent-sdkAgent SDK(headless 模式)
@modelcontextprotocol/sdkMCP 协议支持

网络通信

用途
axiosHTTP 请求
undici高性能 HTTP(Node.js 内置)
wsWebSocket(Bridge 远程控制)
Server-Sent Events流式响应接收

UI & 交互

用途
ink终端 React 渲染器
reactUI 组件框架
fuse.js模糊搜索(命令补全)

文件系统 & 进程

用途
chokidar文件监听(热更新)
execa进程执行(替代 child_process)
tree-kill进程树终止

数据解析

用途
yamlYAML 配置解析
jsonc-parser带注释的 JSON 解析
zod运行时类型验证

可观测性

用途
@opentelemetry/*全套 OpenTelemetry 遥测

语言:TypeScript + ESM

所有源码使用 TypeScript + ES Modules(ESM)

// 典型的源文件头部

值得注意的约定:


原生模块(Native Modules)

shims/            # 原生模块的 JS 替代实现
vendor/           # 原生绑定源码(C++/Rust)
image-processor.node  # 预编译的图片处理模块

Claude Code 包含少量原生 Node.js 模块(.node 文件),用于图片处理等性能敏感场景。shims/ 目录提供了跨平台兼容的 JavaScript 替代实现。


下一步