01 技术栈与环境要求 本节摘要:在动手之前,先把 OpenWork 对运行环境的要求理清楚——它不是「双击一个安装包就完事」的普通桌面应用,而是一个由工作区(pnpm workspace)与任务编排(Turborepo)管理的大型单体仓库,跑起来时桌面外壳、本地服务端、底层引擎会同时启动并彼此通信。本节把这些前提逐项讲清:为什么服务端用 Bun、桌面外壳用 Node + Electron、前端用 React、包管理为什么严格限定、依赖为什么用目录(catalog)锁定版本。把这一节读透,后面遇到任何启动问题你都能自己定位是哪一环出了岔。 一、它是什么形态:多包单体仓库 先建立一个关键认知:OpenWork 在源码层面是一个多包单体仓库(monorepo)。
本节摘要:在动手之前,先把 OpenWork 对运行环境的要求理清楚——它不是「双击一个安装包就完事」的普通桌面应用,而是一个由工作区(pnpm workspace)与任务编排(Turborepo)管理的大型单体仓库,跑起来时桌面外壳、本地服务端、底层引擎会同时启动并彼此通信。本节把这些前提逐项讲清:为什么服务端用 Bun、桌面外壳用 Node + Electron、前端用 React、包管理为什么严格限定、依赖为什么用目录(catalog)锁定版本。把这一节读透,后面遇到任何启动问题你都能自己定位是哪一环出了岔。
先建立一个关键认知:OpenWork 在源码层面是一个多包单体仓库(monorepo)。这意味着它不是一个仓库一个包,而是一个仓库里有几十个包(桌面应用、服务端、前端、共享类型库、企业版各组件......),这些包通过工作区机制互相引用、协同构建。
这种结构带来两个直接的环境要求:
💡 为什么必须 pnpm:OpenWork 的工程文档明确禁用 npm 和 yarn。用错包管理器,依赖会装不全或装错,后面一堆「找不到模块」的怪问题。装 pnpm 是第一步,别跳过。
OpenWork 一个有意思的设计是不同组件用不同运行时:
| 组件 | 运行时 | 为什么 |
|---|---|---|
| 服务端(Server) | Bun | 快、原生 TS、单文件打包基础 |
| 桌面外壳(Electron 主进程) | Node | Electron 本身基于 Node |
| 前端(渲染进程) | 浏览器/Electron 渲染 | React 单页应用 |
这意味着你本地要同时有 Bun 和 Node。服务端那部分(整个产品的中枢)跑在 Bun 上,桌面外壳跑在 Node 上,两者通过 HTTP/IPC 通信。
⚠️ 常见坑:只装了 Node 没装 Bun,启动时服务端起不来或报错。两个运行时都要装,版本都要达标。
前端是 React 19 单页应用,用了一整套现代工具:
你不需要现在精通这些(第 10 章会讲前端架构),但要知道前端栈比较重,首次装依赖会比较慢——这是正常的,不是卡住了。
桌面外壳是 Electron,带了一些原生依赖(需要编译的 Node 模块):
原生依赖意味着你的机器上要有编译工具链(Python、C++ 编译器等)。大多数情况下安装脚本会自动处理,但在某些环境(如 Windows 缺 VS Build Tools)会失败。
💡 Windows 用户注意:如果装依赖时报「node-gyp 失败」「找不到编译器」,多半是缺 Visual Studio Build Tools。装一个带 C++ 桌面开发的 Build Tools 通常能解决。
OpenWork 用两种机制管理依赖版本,都值得知道:
pnpm 的 catalog 功能让你在一个地方声明所有包的依赖版本,各包引用这个目录。好处是版本统一——同一种依赖在所有包里版本一致,避免「A 包用了 React 18、B 包用了 React 19」的版本漂移。
有些第三方依赖有 bug 但等不及上游修,OpenWork 会对它们打补丁。这意味着装依赖时,这些补丁会自动应用。如果你看到 patches 目录里有若干补丁文件,那是正常的——不是你的环境问题。
除了上述,还有几个会偶尔回来的依赖:
动手前,对照这张表逐项确认:
| 检查项 | 命令(概念性) | 期望 |
|---|---|---|
| pnpm 已安装 | pnpm --version |
正常返回 |
| Node 已安装 | node --version |
版本达标 |
| Bun 已安装 | bun --version |
版本达标 |
| Docker(跑 Den 用) | docker --version |
正常返回 |
| Git 可用 | git --version |
正常返回 |
| 编译工具链(原生依赖) | — | Windows 装 VS Build Tools |
| Agent 或模型凭据 | — | 至少一个可用 |
环境清楚了,下一步就是把它装上、双形态启动起来——这正是下一节的主题。