很多人第一次拿到 OpenClaw 的时候,都会被它那个“把 AI 接进本地工具链”的概念吸引,但真正动手部署,最先遇到的拦路虎反而不是模型配置,也不是 API Key,而是 Node 环境。我在 Windows、Ubuntu 甚至安卓 Termux 上都折腾过 OpenClaw,前前后后因为 npm、pnpm、cnpm 这几个包管理器踩了不少坑,有些问题看着是环境报错,本质上是没搞明白这三个东西到底在干什么。这篇就把我自己踩过的坑、验证过的方案、以及这三者之间的核心区别一次说清楚,给正准备部署或者已经被报错折磨的朋友做个参考。
1. OpenClaw 部署为何绕不开 Node 环境
1.1 OpenClaw 为什么依赖 Node,而不是 Python 或其他运行时
先说一个很多人没想明白的问题:OpenClaw 明明是一个 AI Agent 框架,核心逻辑应该跟大模型调用、工具调度有关,为什么部署文档里第一步永远是安装 Node?
因为这个项目的前端界面、命令行交互层、以及一部分工具链插件,都是基于 JavaScript/TypeScript 生态构建的。换句话说,OpenClaw 的“躯干”跑在 Node 环境里,AI 能力通过 API 接入,而控制这个躯干的“遥控器”就是 Node 生态里那一堆 npm 包。
这里面最典型的就是全局安装 Claude Code CLI。OpenClaw 在运行的时候需要拉起 Claude Code 作为底层执行引擎,而这个 CLI 恰恰是通过 npm install -g 命令全局安装的。如果你机器上没有 Node,或者 Node 版本太老,CLI 根本装不上,OpenClaw 的启动脚本就会在中途直接挂掉。我自己第一次在 Windows 上部署时就是卡在这一步——Node 装了,但版本是 14.x,结果一堆依赖包编译报错,后来换了 Node 20 才顺畅。
所以你在网上看到“OpenClaw 安装教程”几乎都会先让你装 Node,这不是教程作者的习惯问题,而是项目本身的硬依赖。理解了这一点,你就能明白为什么后面各种报错都跟 Node 环境相关,因为所有前端构建、依赖安装、CLI 调用,全在这套生态里跑。
1.2 不同平台上部署 OpenClaw 的 Node 环境差异
OpenClaw 最近很火,一个重要原因是它的部署方式比早期灵活了很多,不再局限于单一平台。我实测下来,目前主流的有三条路:Windows 原生部署、Linux 服务器部署、以及安卓 Termux 部署。这三条路的 Node 环境配置思路完全不同,踩坑点也各有侧重。
Windows 上最典型的坑是 PowerShell 执行策略限制。你全局安装完 npm 包之后,输入命令会提示“无法加载文件 npm.ps1,因为在此系统上禁止运行脚本”,这是 Windows 默认的脚本执行策略在拦截,跟 Node 本身没关系,但足以让新手卡上半天。Ubuntu 上则是 apt 源里的 Node 版本往往太旧,直接 apt install nodejs 装出来的可能是 12.x 或 14.x,跑 OpenClaw 根本不够用,需要从 nodesource 仓库拉新版。安卓 Termux 部署相对独立,包管理器用 pkg install nodejs,但 Termux 的 Node 版本跟着仓库走,有时候也会遇到版本偏低的问题。
还有一个容易忽略的点:OpenClaw 官方推荐用 Docker Compose 跑整套服务,里面有个 keep-frontend-dev 容器需要拉 docker.io/library/node 作为基础镜像。如果国内网络环境下镜像拉取失败,你会看到一段很长的“error load metadata for docker.io/library/node”报错。这不是项目有问题,而是 Docker Hub 的访问问题,需要配置镜像加速器。后面我会专门说这个。
2. NPM、PNPM、CNPM 的区别到底在哪
2.1 三者的出身和定位
先聊 npm。npm 是 Node 官方自带的包管理器,你只要装了 Node,npm 就跟着有了,不需要额外安装。它最大的特点就是“默认”,生态里几乎所有包都以 npm 仓库为分发中心,绝大多数教程写的安装命令也都是 npm install。因为门槛低、兼容性好,npm 成了最多人用的包管理器,但它的依赖解析速度和磁盘占用一直被人吐槽。
pnpm 是后来出现的替代者,设计目标很明确:比 npm 更快、更省磁盘空间。它用了一个叫“内容寻址存储”的机制,所有包都放在一个统一的全局存储里,各个项目通过硬链接共享这些文件。这意味着同一个版本的依赖,不管在多少个项目里出现,磁盘上只存一份。对于 OpenClaw 这种包体积动辄几百 MB 的项目,pnpm 的优势非常明显。
cnpm 跟前面两个不是一个赛道的东西。它本质上是 npm 的镜像源,由淘宝团队维护,域名是 registry.npmmirror.com。cnpm 这个名字既指那个镜像源,也可以指基于它定制的 cnpm 命令行工具。它的出现主要是为了解决国内访问 npm 官方源速度慢的问题。注意,cnpm 不是独立的依赖管理逻辑,它底层解析依赖的方式和 npm 旧版本类似,所以很多人用 cnpm 装完依赖后会遇到软链接结构问题,后续再用 pnpm 或 npm 会报错。
2.2 三者核心差异:依赖结构、锁文件、安装速度
我在给 OpenClaw 部署环境时把三个工具都试过一遍,总结下来的核心差异有四个维度:安装速度、依赖结构、锁文件机制、磁盘占用。
安装速度方面,在没有缓存的情况下,pnpm 通常最快,因为它利用了全局存储的硬链接,省去了大量重复解压和复制过程。npm 比 pnpm 慢一些,但比 cnpm 稳定。cnpm 在下载阶段因为走国内镜像,网络耗时少,但如果包里有需要执行 postinstall 脚本的二进制依赖,它的处理效率反而不高。
依赖结构是三者区别最大的地方。npm 默认是嵌套安装,早期版本会把每个包自己的依赖也铺在 node_modules 里,形成很深的层级,项目大了之后文件夹深得吓人。npm v3 之后改成了扁平化结构,尽量把依赖提升到顶层,但这样又会带来“幽灵依赖”问题——你没在 package.json 里声明的包,因为别的前置依赖装了,也能直接 require 到。pnpm 则用了严格隔离的符号链接结构,每个项目只有 node_modules/.pnpm 里存真实文件,项目根目录下只暴露 directly declared 的依赖,这样一来依赖关系非常清晰,也不会有幽灵依赖。cnpm 沿用了旧 npm 的结构逻辑,装出来的 node_modules 跟扁平化后的 npm 有差异,如果在 cnpm 装完依赖后直接跑 pnpm,经常会碰到依赖找不到的诡异报错。
锁文件方面,npm 生成 package-lock.json,pnpm 生成 pnpm-lock.yaml,两者都能锁定依赖版本保证可复现。cnpm 默认不生成锁文件,这意味着两次安装可能装出不同版本,在 OpenClaw 这种快速迭代的项目上很容易触发版本兼容问题。
磁盘占用是最直观的差距。同样一个 OpenClaw 前端依赖,npm 装完大概占用 400 到 500 MB,pnpm 因为有全局存储加硬链接,项目内 node_modules 只有一两百 MB。我自己的 Windows 机器上同时维护了三个 OpenClaw 项目副本,用 npm 装时 C 盘空间肉眼可见地往下掉,改用 pnpm 之后明显轻松了很多。
2.3 实际使用中怎么选:我的建议
我的最终选择是:项目安装依赖统一用 pnpm,全局 CLI 工具用 npm,特定情况下才临时用 cnpm 换源。理由也很简单:OpenClaw 项目本身对 pnpm 的兼容性是最好的,官方文档里很多命令也是 pnpm 开头;而全局安装 CLI 工具用 npm 最省心,因为它直接挂到全局 bin 目录,不会出现 pnpm 全局命令有时候需要额外配置 PATH 的问题;cnpm 我只是在拉取大依赖时作为镜像候选,不太用它的命令行工具。
如果你只在 OpenClaw 和 npm 之间二选一,那直接用 npm 也完全可行,但前提是配好国内镜像源,否则初次 install 可能会等到怀疑人生。同时要保证 Node 版本不要太老,因为 npm 自身的新特性在老 Node 上跑不了,OpenClaw 的依赖树在 npm 10 以下的解析逻辑会有差异。
3. 实操:从零配置环境到跑通 OpenClaw 前端
3.1 第一步:用 NVM 装一个可控的 Node 版本
OpenClaw 这类项目对 Node 版本有要求,我自己实测下来 20.x 以上最稳,18.x 也能跑,但个别依赖会有 warning。我建议直接用 NVM(Node Version Manager)来管理 Node,而不是去官网下载安装包。
Windows 上用 nvm-windows,注意它跟 Linux 上的 nvm 不是一个项目,但使用逻辑差不多。下载安装之后管理员身份打开终端,执行:
nvm install 20.18.0 nvm use 20.18.0 node -vUbuntu 上我更推荐从 nodesource 仓库装,因为官方 apt 源版本太老了:
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt-get install -y nodejs装完以后验证一下 npm 版本,用 npm -v。如果 npm 版本不是 10 以上,大概率是 Node 老版本带来的问题,建议直接换 Node 版本而不是单独升级 npm。
我个人的经验是:千万别在这个环节追求“最新版本”,比如 Node 23 这种刚发布的版本,OpenClaw 的依赖未必全部适配,反而用 LTS 版本最保险。
3.2 第二步:配置镜像源
这一步在国内网络环境下几乎是必然要做的。不配置的话,npm install 拉取依赖时很有可能会卡在某个包上,或者超时失败。你先查一下当前源:
npm config get registry默认输出是 https://registry.npmjs.org/。速度慢的话就改成国内镜像:
npm config set registry https://registry.npmmirror.com/这是淘宝镜像的官方地址,也是目前国内最稳定的 npm 镜像。pnpm 也有独立的镜像配置,在 .npmrc 文件里写入:
registry=https://registry.npmmirror.com/如果你用的是 pnpm,还可以单独设置:
pnpm config set registry https://registry.npmmirror.com/注意一个细节:不同工具的镜像配置是独立的。你改了 npm 的 registry,pnpm 不一定跟着改,需要分别设置。很多人在 Ubuntu 上部署 OpenClaw 时明明 npm 已经装上了,但 pnpm install 还是慢得离谱,就是因为没设置 pnpm 的 registry。
3.3 第三步:安装依赖并启动前端
镜像源配好之后,进入 OpenClaw 项目目录,先看一眼 package.json 里的包管理工具字段,确认项目用的是 npm 还是 pnpm。我见过的 OpenClaw 版本里,前端部分推荐用 pnpm,你可以在命令行里执行:
corepack enable pnpm installWindows 上如果提示“pnpm 不是内部或外部命令”,说明 pnpm 没装上或者没加到 PATH 里。用 npm 装全局 pnpm(其实我更推荐用 corepack 的方式):
npm install -g pnpm装好后 pnpm install,整个过程明显比 npm 快,而且 node_modules 体积小很多。安装完成之后启动前端:
pnpm dev如果一切正常,终端会输出一个本地地址,浏览器打开就能看到 OpenClaw 的控制界面。这里要注意:前端的启动依赖 Docker Compose 里面的 keep-frontend-dev 服务,如果 Docker 环境没有正常工作,pnpm dev 启动后访问页面会一直转圈。需要先确认 Docker Desktop 或者 Linux 上的 Docker 服务是运行状态。
我踩过的另一个坑是:在 Windows 上用 git bash 跑 pnpm dev,终端一直报路径格式错误,换成 PowerShell 或者 CMD 就好了。这听起来很玄学,但 Git Bash 对 Windows 长路径和符号链接的处理确实跟微软原生终端不太一致,遇到怪问题先换终端试试。
4. OpenClaw 部署中的高频报错与排查实录
4.1 npm install 报错集合:依赖下载失败、权限错误、版本冲突
OpenClaw 的依赖数量不少,初次安装时最容易出现的就是某个包下载失败。我这里整理一下常见的情形。
第一种是单个包下载失败,报错信息里带 ETIMEDOUT 或者 ECONNRESET,大概率是网络问题,也就是 npm 默认源访问不稳定。解决方法是先确认镜像源是否已经切换(前文有具体命令),然后清缓存重试:
npm cache clean --force npm install第二种是权限错误,Windows 上报 EPERM 或 EACCES,Linux 上报 permission denied。Windows 上是文件被占用或者权限不够,可以试试以管理员身份打开终端;Linux 上是因为全局安装需要 root 权限,要么 sudo,要么用 nvm 安装 Node 让包落在用户目录下。
第三种是版本冲突,报 ERESOLVE 错误。这种通常不是 OpenClaw 的问题,而是 npm 版本太老或者太新跟某个依赖的 peerDependencies 对不上。我遇到过一次 OpenClaw 依赖里要求 react 版本范围狭窄,但 lock 文件来自新版本,导致 npm install 解析失败。换成 pnpm 就能自动处理 peer 依赖的冲突,这也是我推荐 pnpm 的一个原因。
第四种是 OpenClaw 特有的,报错提示 missing optional dependency @openai/codex-win32-x64。这个属于可选依赖拉取失败,一般情况下不影响主流程,如果你确定要使用 codex 功能,可以单独重新安装对应平台的二进制包。不用的场景下可以直接忽略,不用死磕。
4.2 Windows 上 PowerShell“禁止运行脚本”的坑
这应该是 Windows 部署 OpenClaw 时被问得最多的一个报错。报错原文:
npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本本质原因是 PowerShell 的执行策略默认是 Restricted,不允许在当前用户上下文运行 .ps1 脚本,而 npm、pnpm 等命令行工具在 PowerShell 里的入口文件本身就是 .ps1。解决方案有两种。
第一种临时解决方案,在当前终端里执行:
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSignedRemoteSigned 表示本地创建的脚本可以直接运行,从网络下载的脚本需要有签名。对于 npm.ps1 这种安装时生成的本地脚本,RemoteSigned 已经完全够用。执行完这条命令后重新打开终端,问题就消失了。
第二种更彻底的做法,是用 npx.cmd 而不是 npm.ps1。不修改策略,每次用命令时直接调用 .cmd 版本,但这种方式太麻烦,日常使用不推荐。我个人建议直接改成 RemoteSigned,这既不会显著降低系统安全性(因为本地脚本本来就可以运行),又解决了绝大多数 Node 工具的 PowerShell 报错。
另一个跟 PowerShell 相关的小坑是:在 PowerShell 里执行 npm install -g 安装全局包后,命令有时候不能马上生效,因为 PATH 环境变量虽然有变化,但当前会话没有刷新。重开终端就能解决,不是什么大问题。
4.3 pnpm 不是内部或外部命令,也不是可运行的程序或批处理文件
报错原文:
pnpm 不是内部或外部命令,也不是可运行的程序或批处理文件。这个报错有两种常见原因。
第一种是 pnpm 确实没装。确认方式:
npm root -g查看全局 node_modules 路径,然后去那个目录下找 pnpm 是否存在。如果不存在,直接执行:
npm install -g pnpm装完后再执行 pnpm -v 验证。如果你用了 Corepack,也可以:
corepack enable pnpm第二种是 pnpm 装了,但 PATH 环境变量没配置对。这种情况在 Windows 上尤其常见,因为 npm 的全局 bin 目录可能不在系统 PATH 里。用 npm config get prefix 可以查到全局安装路径,比如 C:\Users\Administrator\AppData\Roaming\npm,确认这个目录在 PATH 里。Windows 上修改 PATH 之后要重新打开终端才生效。
Ubuntu 上如果遇到 command not found,多半也是 PATH 问题。用 nvm 安装的 Node,全局 bin 在 ~/.nvm/versions/node/v20.18.0/bin,这个目录通常在 PATH 里;但如果你用 apt 装的 Node,再手动装 pnpm,全局 bin 在 /usr/local/bin,一般没问题。遇到问题先 which pnpm 看看能不能找到。
4.4 Docker 构建时的“load metadata for docker.io/library/node”报错
OpenClaw 的 compose 编排里,存放前端服务的镜像拉取如果失败,会出现类似这样的报错:
error [keep-frontend-dev internal] load metadata for docker.io/library/node:很多人在这一步骤卡住,以为是 Node 环境出了问题,其实是 Docker 拉取镜像被卡住。原因是 Docker Hub 在国内访问不稳定,需要给 Docker 配置镜像加速器。
Windows 的 Docker Desktop 在设置里找到 Docker Engine,修改配置:
{ "registry-mirrors": [ "https://docker.m.daocloud.io" ] }然后重启 Docker Desktop。Ubuntu 上修改 /etc/docker/daemon.json,同样加上 registry-mirrors 字段,保存后执行:
sudo systemctl restart docker这里要提醒一句:镜像加速器也不是百分百稳定,如果你在某个时间段依然拉取失败,可以多换几个地址试试,或者在网络比较顺畅的时段重试。这个问题本质上跟 Node 生态无关,但因为它跟 OpenClaw 的构建流程绑定在一起,很多人误以为是自己 Node 装错了,白白浪费了一晚上排查时间。
4.5 其他值得留意的坑:termux、全局包卸载、版本升级
在安卓 Termux 上部署 OpenClaw 也是一个热门话题,毕竟能在手机上跑 AI 代理确实很有吸引力。Termux 上注意不要直接用 apt,而是用 pkg:
pkg update pkg install nodejs-lts npm install -g pnpmTermux 的文件系统跟标准 Linux 有差异,有些依赖包需要编译原生模块,可能要额外装 build-essential 或者 clang,如果你遇到 node-gyp 报错,大概率是这个原因。
另外,很多人在折腾过程中反复安装卸载全局包,比如 claude-code、codex 等,清理的时候要搞清楚命令。卸载 npm 全局包:
npm uninstall -g @anthropic-ai/claude-code卸载完只是想验证是否真的干掉:
npm ls -g --depth=0这个命令会列出所有全局安装的包。如果之前用 pnpm 装过全局包,需要单独用 pnpm 卸载,两边互不通。
关于 Node 版本升级,我强烈建议不要直接在现有环境上覆盖安装新版 Node,尤其是 Windows,旧版本残留的 npm 全局包很可能会导致 PATH 混乱。正确做法是先卸载 Node,再安装新版,或者直接用 nvm 切换到新版后再重新安装所有全局包。我踩过一次坑:从 Node 16 直接覆盖安装 20,结果 npm 命令报一堆模块找不到,最后全部卸载重装才恢复正常。
5. 一些经验总结
折腾 OpenClaw 这套环境下来,我最大的体会是:很多看似高深的部署报错,拆到根上都是环境管理的细节问题。OpenClaw 本身并不难跑,难的是它依赖的那套 Node 生态在不同平台上的差异性。只要你把 Node 版本管理、包管理器选择、镜像源配置这三件事做对了,后面基本一路畅通。
最后再分享一个小技巧:如果你准备长期部署 OpenClaw,建议把常用的初始化命令整理成一份脚本,遇到新机器时直接跑一遍,省得每次重复踩坑。比如在你的 .bashrc 或者 PowerShell profile 里把镜像源设置、Corepack 启用、pnpm 安装这些固定动作写成函数,换环境时一条命令搞定。这套环境配置做完之后,你再去碰 OpenClaw 的 API 接入、Skill 开发这些正事,就不会被底层环境问题分心了。