code-server 是把 VS Code 搬到浏览器里的服务端程序。装在一台机器上,用浏览器打开地址就能编辑那台机器上的代码,本地不用装编辑器。它把 Node 运行时、编辑器源码和扩展宿主一起打进包里,解压就能跑。

装完 630 MB,解压出 5980 个文件

官方给的 Windows 包是 tar.gz 不是 exe。压缩包与解压后的体积差得挺远,下载前先看清哪个数字。

code-server-4.141.0-windows-amd64.tar.gz   218,475,701 字节  (208.4 MB)
解压后目录                                  661,053,994 字节  (630.4 MB)
文件数                                      5980 个
其中 lib\node.exe                           93,580,104 字节  (89.2 MB)
      out\node\entry.js                     3,618 字节
      package.json                          1,361 字节

89 MB 的 node.exe 就是它自带的运行时,所以目标机器不用预装 Node。630 MB 里绝大部分是编辑器前端与内置扩展。这部分删不掉也压不动。

冷启动 1.52 秒,进工作台再花 2.43 秒

计时分两段:进程起来到端口能连,和输完密码到编辑器界面渲染完。

进程启动 → 端口 8089 可连          1.52 秒
输密码 → 编辑器工作台出现           2.43 秒
进程数(含子进程)                  3 个
内存占用合计                       134 MB
内嵌 Node 版本                     v22.22.2
打包的 VS Code 版本                1.141.0
commit                            8b41915d25547e2edd553bab03ea4cbd621f98c5

三进程里有一个是扩展宿主,一个是文件监听。134 MB 是空载状态,真打开大工程会涨,这一项没有压测过。

第一次进要密码,密码在 config.yaml 里

默认走密码鉴权,那个密码不是固定的,第一次启动时随机生成 16 位,写进配置文件,控制台也会提示一句。

配置文件位置   %APPDATA%\code-server\Config\config.yaml
内容           bind-addr: 127.0.0.1:8080
               auth: password
               password: e2ef428bd82712cf72ca3ae9
               cert: false

不想让用户去翻文件,可以在启动前设环境变量 PASSWORD。实测把 PASSWORD 设成 8 位字符串再带 --auth password 启动,登录页输那一串就能进工作台,配置文件里那行会被忽略。绑地址默认只听 127.0.0.1,别人从局域网访问不到。

登录页只有一个密码框,没有用户名。它的提示写着 “Check the config file for the password”,第一次用的人多半会愣一下。

编辑器 / 终端 / 扩展市场都能用

进去以后跟桌面版 VS Code 差不多:左侧资源管理器,中间编辑区,底部面板,右侧还有一个 Chat 侧栏。新建文件敲一段 TypeScript,行号、类型着色和自动缩进都正常,状态栏显示 UTF-8 与 CRLF,光标位置精确到行与列。

终端面板默认起的是系统命令行,输入的 node -v 返回 v22.22.2,也就是包内那个运行时。命令执行在跑服务的那台机器上,浏览器只负责显示,这一点跟本地终端有本质区别。

扩展市场也能打开,列表带下载量和评分:Python 97.1M 次、Claude Code 60.2M 次、Ruby LSP 44.3M 次、Go 42.8M 次。侧栏显示两个来源,127.0.0.1:8089 - Installed 和 Browser - Installed,说明它把「装在服务器上」和「跑在浏览器里」的扩展分成两栏。

面板实测表现说明
编辑器TypeScript 高亮、行号与缩进正常状态栏 UTF-8 / CRLF
终端node -v 返回 v22.22.2命令在服务端执行
扩展市场能列出市场结果与装机量分服务器端与浏览器端两组
Chat 侧栏默认展开,提示需要账号不使用可以点 X 收起

healthz 那个接口是给探针用的

访问 /healthz 会返回一段 JSON,五次请求的延迟是 26.9 / 1.9 / 1.3 / 1.3 / 2.5 毫秒,中位 1.9 毫秒。第一次偏高是因为要走一次连接建立。

GET /healthz  →  {"status":"expired","lastHeartbeat":0}
延迟            26.9 / 1.9 / 1.3 / 1.3 / 2.5 毫秒
中位            1.9 毫秒
GET /           200,返回 2621 字节的登录页 HTML

返回里那个 expired 不是报错。它统计的是「上次心跳时间」,刚启动还没打过心跳,所以是 0。它是给反向代理和 Kubernetes 的探针用的,用来判断进程还在不在,不表示编辑器能不能用。

这台机器上文件树没起来,原因在环境

实测环境里,资源管理器只显示一个根节点,子文件不展开,快速打开也搜不到工作区里的文件。日志里有一条线索:启动过程尝试调用被安全策略禁止的程序,随即出现 IPC 管道警告。

日志警告   Could not create socket at \\.\pipe\code-server-ipc-65456f721fc19d99
被拦程序   wsl.exe(安全策略黑名单)
影响面     资源管理器不展开、Ctrl+P 搜不到工作区文件、另存为对话框起点不在工作区
不受影响   编辑器输入与高亮 / 终端 / 扩展市场 / 登录鉴权

这一条要分清楚归因:拦住 wsl.exe 的是这台机器的策略,不是 code-server 自己的缺陷。普通 Windows 机器上不会遇到这种情况。Linux 与 macOS 上也走不到这条路径。所以文件读写这块在本文记为未验证,不能算它的失败。

要绕开也有办法:直接在里面开终端改文件,或者把工作区放到 WSL 里再启动,路径会变成 \\wsl$\... 这种形式。

什么人适合用

三类场景比较合适:临时借用别人的电脑改几行代码、把编译环境放在服务器上只把界面露出来、以及几个人轮流看同一台机器上的工程。它不需要客户端,浏览器就是客户端。

反过来,如果只是自己一台电脑写代码,装桌面版更省事。630 MB 的包、每次启动 1.5 秒,再加一层浏览器,收益不明显。要做公网访问,记得配 HTTPS 与反向代理。这两项本文没有验证。