我在浏览器里写了三年代码,然后删掉了本地一半的开发环境
先说结论,免得有人看到一半想来评论区骂我:在线 IDE 不能替代本地开发环境,但它能替代你本地环境里的一半。至于哪一半,取决于你怕不怕丢东西、以及你有没有被 npm registry 折磨过。
我现在的工作流是这样:主力机是一台 M1 Pro 16G 的 MacBook Pro,本地跑 Docker Desktop + Postgres + Redis + 一个 8 万文件的 monorepo,风扇起飞是常态。同时我常年开着 GitHub Codespaces 的一个 4 核 8G 实例,专门用来跑那些「装完就不想再装第二遍」的东西——比如某个绑死了 Python 3.8 的老项目、某个要编译 node-gyp 的包、某个必须拉起 Chromium 才能跑的端到端测试。
起因很蠢。2023 年 3 月我在客户现场,他们的内网把 npm registry 挡了一半,我为了装一个 canvas 包折腾了两个半小时,最后是靠手机开热点 + 一个临时开的 Codespaces 实例搞定的。那天下班之后我开始认真测这玩意儿,到现在笔记本里存了大概 40 组测速记录。下面这些都是我自己的数,不是抄官网的。
一、冷启动:同一个项目,我掐着秒表测的五组数据
测试条件写清楚:同一个 1.2GB 的 Next.js 项目,lock 文件里 1487 个包,网络是上海电信千兆有线,浏览器 Chrome 121,每个平台测三次取中间值。时间是 2024 年 3 月,政策这种东西说变就变,你自己测出来不一样很正常。
| 平台 | 首次冷启动 | 二次启动(有缓存) | 默认配置 |
|---|---|---|---|
| GitHub Codespaces | 1 分 52 秒 | 12 秒(配了 prebuild) | 2 核 8G / 32GB 磁盘 |
| Gitpod(Standard) | 2 分 40 秒 | 18 秒 | 4 核 8G / 30GB |
| StackBlitz(WebContainers) | 8 秒 | 3 秒 | 跑在你自己浏览器里 |
| 腾讯 Cloud Studio | 3 分 05 秒 | 40 秒 | 2 核 4G 免费空间 |
| 本地 M1 Pro(node_modules 已就位) | — | 1.8 秒 | — |
这里有个反直觉的地方:StackBlitz 那个 8 秒,是因为它根本没在云端跑。WebContainers 是把 Node 编译成 WASM 塞进你的浏览器进程里跑,所以它没有任何网络往返,代价是吃你自己的内存。我开两个 StackBlitz 标签页,Chrome 任务管理器显示单标签占 1.4GB;16G 的机器开到第三个就开始 swap,键盘开始掉字。
Codespaces 那个从 1 分 52 秒到 12 秒的落差,100% 来自 prebuild。要在 devcontainer.json 里配 hooks,配完之后第一次触发构建大概要等 20 分钟才跑完。如果你不配 prebuild,Codespaces 的二次启动大概是 45 到 60 秒,不是 12 秒。 我见过不少测评把这两个数字混着讲,我怀疑他们压根没自己配过 prebuild。
二、真正卡死你的从来不是编辑器,是出口带宽和磁盘 IO
Monaco 编辑器(就是 VS Code 网页版那个内核)在浏览器里的表现其实很能打。我开着 5000 行的 TypeScript 单文件,输入延迟基本感觉不到,补全也跟得上。真正让我摔键盘的是下面这三件事。
第一件,npm install 的出口带宽。 大部分云 IDE 的免费档出口是共享的,而且是国外的源。同一个项目、同一份 lock 文件,在 Codespaces 的 2 核机器上跑 npm ci 花了 4 分 12 秒;在我本地的 M1 上跑,38 秒。差的不是 CPU 算力,是镜像源和出口。解法是在 devcontainer 里直接换源,我自己的配置里加了一行 RUN npm config set registry https://registry.npmmirror.com,4 分 12 秒直接掉到 1 分 20 秒左右。这一步不做,你的云开发体验会一直很差,而且你会误以为是机器太弱。
第二件,文件监听额度。 Linux 默认 fs.inotify.max_user_watches 是 8192,一个中型前端项目轻轻松松就超了。本地你是 root,sysctl 一改就完事;云 IDE 里你多半是个普通用户,改不了,很多平台连 sudo 都不给。症状特别有迷惑性:webpack 或者 vite 的热更新随机失灵,你改了代码,浏览器没反应,你开始怀疑自己变量名写错了、怀疑路由配错了,其实是监听被系统丢了。这个坑我踩过两次,第一次在里头排查了整整四十分钟,最后是靠 lsof 看文件句柄才反应过来。
第三件,磁盘 IOPS。 云上的磁盘本质是网络块存储,随机读写性能跟本地 NVMe 硬盘不是一个量级。在一个 8 万文件的仓库里跑 git status,云端要 6 到 9 秒,我本地大约 0.6 秒。所以在大仓库上我从来不在线跑全量 git 操作,只做单文件改动和局部 lint,全量 rebase 一定拉回本地做。
三、算笔真实账:免费额度够你写几天?
这部分是我觉得最多人算错的地方,所以单独拎出来说。
GitHub 免费账户每月 120 core-hours + 15 GB-month 存储。注意单位是 core-hours 不是 hours。 你开一台 4 核机器,每小时扣 4 core-hours,120 除以 4 等于 30 小时。每天写一小时,一个月刚好用完,一点冗余都没有。存储是另算的:15 GB-month 意味着你如果一直挂着一块 15GB 的磁盘,一个月刚好烧完,挂两块就超额。超额之后按 GB-month 单独计费,具体单价会调整,用之前去官网确认一遍。
Gitpod 的免费档这几年一直在动,我印象里最早是 100 小时/月,后来降到 50 小时,再后来收得更紧。我现在不太敢写具体数字,因为政策变太快了,你看到这篇的时候大概率又不一样了,建议自己开一次控制台看。Replit 免费档现在是 0.5 vCPU / 512MB 内存这个量级,跑个 Python 脚本、写个算法题没问题,跑 Vite 会直接 OOM 被杀进程;要 2 vCPU 得上付费档,二十多美元一个月。
我自己的真实用量:一个月大概 34 小时在线 IDE 时间,其中六成是 Codespaces,三成是 StackBlitz,剩下一成给某个国内的免费工作空间。总花费 0 元,代价是我得盯着额度面板,因为超了不会提醒你,是直接从卡里扣。
四、在线 IDE 到现在也干不了的事(2024 年版)
- Docker-in-Docker 别抱太大期望。 Codespaces 支持,但要在 devcontainer 里挂 docker-in-docker 那个 feature,而且容器里跑 Docker 的性能大概只有本地的三到四成,镜像拉取还特别慢。做一次性的容器测试能忍,做日常开发很难受。
- GPU 基本没有。 你要写 CUDA 或者跑本地推理,云 IDE 这条路是断的。少数平台提供付费 GPU 实例,按小时计费,便宜的每小时几毛美元,贵的几美元,而且经常排不到。
- 访问本地硬件没戏。 串口、USB 加密狗、本地打印机、公司内网数据库、你办公桌上那台只能局域网访问的测试机,全都不行。WebUSB 理论上能做一点点,实际驱动生态约等于零。
- 超大仓库是灾难。 超过 5GB 的 git 历史,clone 一次能等到你怀疑人生,而且免费档的磁盘一般给不到这么大。
- 离线全废。 飞机上、高铁隧道里、酒店 wifi 要认证的时候,你什么都干不了。这一点是我最不满意的,比前面几条加起来都让我难受。
五、我真正会推荐在线 IDE 的五个场景
- 面试和技术考核。 别让候选人折腾环境了,发个临时链接,三十秒进状态,省下的时间够多聊一轮项目经历。
- 临时复现一个 bug。 尤其是老版本 Node 或 Python 的兼容问题,用干净容器隔离掉你自己机器上那堆全局包带来的变量,比在本地反复切 nvm 快得多。
- 教别人写代码。 共享终端加共享编辑器,比远程控制对方屏幕舒服十倍,对方也不用装任何东西。
- iPad 上写代码。 我知道这听起来离谱,但配个键盘,Codespaces 加 iPad 是我出差路上唯一能干活的方案。短板是 Safari 会劫持一部分快捷键,
Cmd+W直接关标签页,改不掉。 - 给非技术同事演示。 一键甩过去一个跑起来的地址,比让对方装 Node、装 pnpm、装依赖再问你「为什么报错」要省心一万倍。
六、我自己的配置,和几个小而烦的坑
先给一个我用了很久的 devcontainer 配置片段,就三件事:换 npm 源、装我常用的 CLI、把超时改长。别的都别加,加多了冷启动会变慢,prebuild 也会更久。
几个文档里基本不会写、但一定会遇到的坑:
中文输入法光标漂移。 在 Monaco 里用微软拼音,快速输入时偶尔会出现候选框位置偏移或者字符重复,频率大概是每输入两三百字遇到一次。macOS 的 Safari 下比 Chrome 明显。我的规避办法有点怂——长段落的中文注释先在本地写,再整块粘进去。
Ctrl+S / Cmd+S 被浏览器截胡。 大部分平台做了处理,但偶尔还是会弹「保存网页」的对话框。养成了坏习惯之后回本地开发还会手抖按一下。
Ctrl+W 是死穴。 直接关标签页,没有任何挽救余地。写代码写嗨了手快就没了。我后来养成的习惯是随手 Cmd+Shift+P 打开命令面板确认还在连接状态,断了就重连,损失比丢一整个工作区小。
休眠和计费。 免费实例一般 30 分钟无操作就停,Codespaces 默认也是 30 分钟,可以在设置里改到最多 4 小时——但注意,待机状态下 core-hours 是照样扣的。我有一次周五忘了关,周一回来发现这个月额度少了一大半。
端口转发默认是私有的,别随便改 public。 改了之后任何人拿到那个 URL 都能访问,而且很多平台的转发地址是猜得到的。别在上头跑任何带真实数据的东西。
最后说一个可能有点跑偏的观点
大家讨论在线 IDE 的时候,总在比「功能全不全」「能不能替代本地」。我觉得这个框架本身就是歪的。
在线 IDE 卖的根本不是「免安装」,是可丢弃性。你本地那套环境,用了两年,里面藏着 47 个你根本不知道为什么会存在的全局包、3 个改了又忘了改回来的 shell 配置、一个只有你的机器上跑得起来的启动脚本。它早就腐化了,但你不敢删,因为删了要花两天重建。云环境每次重建都是干净的,坏了就扔一个,成本接近零。
所以我现在的判断标准特别简单:这个环境你三天后还会用吗? 会,就在本地老老实实建一套,配好 dotfiles,慢慢养。不会,就在线开一个,用完就删,别心疼。把一次性任务交给云,把长期资产留在本地。
最后一句真心话:所有云 IDE 的免费额度这几年都在缩水,我眼看着好几家从「基本够用」砍到「只能跑个 hello world」。别把你的工作流建立在免费额度上,也别信任何一篇没写测试日期的测评,包括我这篇。