上周三晚上十一点,我一个在国企做数据的老同学发微信过来,说他想在办公电脑上学 Python,结果装 Node.js 装不了——公司内网机器没管理员权限,MSI 安装包双击直接被拦。他问我,有没有那种打开网页就能写代码的东西。
我当时随口回了句「多了去了」,然后在打字的过程中发现,自己根本说不清楚。因为「在线编程」这四个字下面塞的东西压根不是一类玩意儿。JSFiddle 是个玩具,GitHub Codespaces 基本等于一台云主机,Google Colab 能白送你 15G 显存的 GPU,而你打开它们的动作是一模一样的:浏览器,输入网址,回车。
所以这篇我按一个比较笨但管用的思路写:先搞清楚你的代码到底跑在机器的哪一层,再谈选哪个平台。
先看代码跑在哪一层,这决定了 80% 的坑
我把主流平台按运行位置分成三层,这个分法你在别的对比文章里大概率看不到,因为它不按「功能多少」排,按「代码住在哪」排。
第一层是浏览器沙箱。StackBlitz 的 WebContainer 是典型代表,它把 Node.js 运行时用 WASM 塞进了浏览器(准确说是跑在 Service Worker 里),你在里面敲 npm install,包是真的下到浏览器内存里的。启动确实快,我掐过表,冷启动 80 到 100 毫秒那个量级,比远程容器快一个数量级。代价也很直接:内存天花板就是你浏览器标签页能给的 2 到 4GB,而且——这是重点——它跑不了原生二进制模块。
第二层是远程容器或者 microVM。GitHub Codespaces、CodeSandbox 的 Devbox、Replit 都属于这一挂,你的代码实际跑在别人机房的 Docker 容器或轻量虚拟机里。好处很直白:完整的 Linux,apt、gcc、ffmpeg 想装什么装什么。代价是网络延迟和按时长计费,你写代码的每一分钟都在花钱或者烧额度。
第三层是共享宿主机上的一个进程。老牌的 JDoodle、Programiz 在线编译器就是这个路子,你点运行,它在一个一次性沙箱进程里跑你的 main 函数,几秒后把 stdout 丢回来。这类东西只适合刷题和验证语法,别指望它能当开发环境用。
这个分类不用信我说的,你自己两分钟就能验证:在 StackBlitz 新建一个 Node 项目(我用的是 next.js 模板),然后执行 npm i sharp,会看到报错长这样:
Error: Could not load the "sharp" module using the linux-x64 runtime
sharp 依赖 libvips 的原生二进制,WebContainer 给不了你。同理 bcrypt、node-canvas、puppeteer 这几个基本也都趴窝。这行报错是在线编程新手最容易撞的墙,而绝大多数教程里不会写,因为写教程的人用的是本地电脑。
参数摊开看:免费额度这个事,各家单位都不一样
我把手上这几个账号的实际情况列一下,数字是我写这篇时看到的,平台改政策挺勤快的,具体以官网为准。
| 平台 | 免费额度 | 典型规格 | 能跑原生模块 | 闲置后会发生什么 |
|---|---|---|---|---|
| GitHub Codespaces | 120 core-hours/月 + 15 GB-month 存储 | 2 核 4GB 或 4 核 8GB | 能 | 默认 30 分钟无操作自动停 |
| Replit | 免费档 0.5 vCPU / 512MB RAM | 项目默认公开 | 能,但 nix 装包慢 | 容器休眠,重开要重建环境 |
| CodeSandbox | 免费 2 vCPU / 2GB RAM | Devbox 走 microVM | 能 | 会话闲置回收 |
| StackBlitz | 无时长限制(跑在你浏览器里) | 受标签页内存限制 | 不能 | 关掉标签页就没了 |
| Google Colab | 免费档给 T4,15GB 显存 | 12 小时硬上限 | 能 | 90 分钟空闲断,/content 清空 |
这里有个坑我要单独拎出来说:core-hours 这个单位。120 core-hours 听起来很多对吧?但它是「核心数 × 小时」,你开一台 4 核 8GB 的机器,实际只能用 30 小时。每天写两小时代码,半个月就见底了。而如果换成 2 核 4GB 的机器,就是 60 小时,直接翻倍。我认识好几个朋友都是月中收到「额度已用完」的邮件才发现自己算错了账。
省钱的操作其实就三招,都不难:
- 在 GitHub 设置里把 Codespaces 的 idle timeout 从默认 30 分钟改成 10 分钟,你下楼买杯咖啡的时间就不会白烧;
- 命令行装一下 gh,用完敲
gh codespace stop,比在网页端翻半天找按钮快; - 在 GitHub 账号的 Billing 页面看当月 core-hours 用量,我习惯每周五瞄一眼,心里有数。
我自己的踩坑清单,按平台来
Colab 的坑最阴。90 分钟空闲断,12 小时硬断,这两个大家都知道。但断线之后 /content 目录里的东西全没了,只有挂载到 /content/drive 的才留得住。所以我现在开新笔记本的第一步永远是先 %cd /content/drive/MyDrive/项目名 再干活,这行命令救过我至少三次。另外免费档的 GPU 不保证,我遇到过排队排到一半,最后分给我的是纯 CPU 的情况。
Replit 的坑在「免费项目默认公开」。你写的东西全世界都能翻到,包括你不小心 hardcode 进去的 API key。这点很多人不看文档是不知道的。另外免费容器隔夜就休眠,第二天打开要重建 nix 环境,我最久一次等了将近 1 分钟,界面卡在 Starting 那里一动不动,第一次遇到还以为崩了。
Codespaces 的坑是端口。默认转发的端口是 private 的,别人访问不了,得手动右键改成 public。但改之前麻烦想一秒:public 端口等于公网可访问,你顺手起的那个没设密码的 Postgres 就是在裸奔。我一般只在演示的时候开 public,演示完立刻改回去。
StackBlitz 的坑前面说过了,原生模块。补充一条:它连 npm 的部分 postinstall 脚本都会静默跳过,所以有时候不是报错,是构建出来结果不对,这个更难查。
一个具体教程:把 Codespaces 当成日常环境又不烧额度
步骤不复杂,核心思路是「让容器在创建阶段就把活干完」,别等到进去了再 npm install。
第一步,在你仓库根目录建一个 .devcontainer/devcontainer.json,内容大概这样:
{
"name": "my-env",
"image": "mcr.microsoft.com/devcontainers/javascript-node:20",
"postCreateCommand": "npm ci",
"forwardPorts": [3000],
"customizations": {
"vscode": {
"extensions": ["dbaeumer.vscode-eslint", "esbenp.prettier-vscode"]
}
}
}
第二步,把 postCreateCommand 写成 npm ci 而不是 npm install,前者按 lock 文件装,快且可复现。这一步会在容器构建阶段跑完,你进编辑器就是装好依赖的状态。
第三步,GitHub 设置里把 idle timeout 调到 10 分钟,再把默认机器类型设成 2 核 4GB,除非你确实要编译大项目,不然 4 核那档纯属浪费额度。
第四步,用完敲 gh codespace stop。注意是 stop 不是 delete,stop 之后存储还在,下次启动只要几秒,delete 才是全清。
这套配下来,我一个月用掉的 core-hours 大概在 20 到 30 之间,120 的免费额度绰绰有余。
我的结论,可能有点反直觉
选平台别看功能列表,看你的依赖树里有没有原生二进制模块。这是我觉得最省事的判断标准,比看官网那个密密麻麻的对比表格快多了。你的 package.json 里有 sharp、bcrypt、canvas、puppeteer 这几个里的任意一个,浏览器沙箱那层就直接排除掉,别浪费时间试。
反过来说,纯前端、纯 TypeScript、写 demo、给别人演示代码,那 StackBlitz 和 CodeSandbox 的浏览器层就是最优解,开箱即用、延迟低、生成个分享链接丢群里对方一点就开,这个体验远程容器给不了你。
要连数据库、要跑 docker-compose、要给团队固化一套环境,那就 Codespaces 加 devcontainer,目前这是最接近「正经开发」的在线方案。
最后说句可能不讨喜的:在线编程平台最大的价值其实不是「你电脑装不了东西」,而是环境可复现。新人入职第一天 clone 仓库,点一下,两分钟后环境跟前端组所有人一模一样,这个事你在本地做得再好,也得折腾半天。冲着这点,它值。
至于我那个老同学,最后给他推的是 Colab。因为他要的就是 Python,不需要 Node.js,也不用装什么奇怪的东西,浏览器打开就能写,还白送一块 GPU。他到现在用得挺好,昨天还发截图给我看他跑的爬虫。