没有服务器、没有数据库、没有后端代码。一个 HTML 文件丢上静态托管,聊天室就跑起来了。
听起来像天方夜谭?往下看。
那天,我受够了”脚手架”
想搭个聊天室。常规操作:
npx create-react-app → 300MB node_modules
npm install socket.io express mongoose bcrypt ...
写 WebSocket 服务 → 写路由 → 配数据库 → 写认证 → 部署服务器 → 配 Nginx → 配 SSL → 配域名
两个小时过去了,还没开始写聊天界面。
我突然想:能不能像个野蛮人一样,一个 HTML 文件扔上去就完事?
答案是:能。
魔法在哪里?
BeeChat 把服务端的活全部分派给了三样东西:
| 🧩 零件 | 🎭 角色 | 💰 费用 |
|---|---|---|
| EMQX 公共 MQTT 代理 | 消息中转站,替 WebSocket 服务端干活 | 免费 |
| 浏览器 Canvas API | 图片压缩工厂,上传前自动瘦身 80%+ | 免费 |
| Web Crypto API | 管理密码 SHA-256 验证,在浏览器里完成 | 免费 |
三个全免费、全网可用的公共设施,凑在一起,把服务端架空了。
架构图一句话说完:
用户A 浏览器 ──MQTT──→ 公共代理 ←──MQTT── 用户B 浏览器
↑
零行后端代码
这就是 BeeChat 的全部秘密。不是没有后端——是把后端的活外包给了互联网公共基础设施。
你只需要一个文件
beechat/
└── index.html ← 就这一个
丢到任何地方都能跑:
- GitHub Pages →
git push即上线 - Vercel / Netlify → 拖拽上传
- 虚拟主机 → FTP 上传
- 甚至本地双击打开(配合
python -m http.server)
零 npm install、零环境变量、零数据库。
但功能一个不少
🗨️ 实时聊天
MQTT 的 pub/sub 模型天然适合聊天。消息发布到公共主题,所有订阅者毫秒级接收。WebSocket 长连接,比轮询省流量,比 SSE 双向。
🖼️ 图片压缩黑科技
上传图片前,Canvas API 在浏览器里完成压缩:
原始 5MB PNG → Canvas 缩放 (800px) → WebP quality 0.7 → 约 60KB
压缩率 98%+,肉眼几乎看不出区别。 压缩后的图片以 base64 嵌入 MQTT 消息体,不需要任何图床服务。
🛡️ 管理后台
点击右上角「管理」→ 输入密码 → 进入上帝视角:
- 查看所有在线用户的 IP 地址
- 追溯每条消息的 发送者 IP
- 单条删除或一键清空,操作实时同步到全体用户
密码用 SHA-256 哈希存在页面里,验证全程在浏览器完成,密码原文从不离开你的电脑。

👤 用户昵称系统
首次访问弹窗设昵称,localStorage 持久化。消息带上昵称标签,不再”谁发的?”一脸懵。

🌐 网络自适应
内置 6 个 MQTT 代理自动切换:
broker-cn.emqx.io → 中国节点
broker.emqx.io → 全球节点
test.mosquitto.org → 备用
broker.hivemq.com → 再备用
...(WS/WSS 双协议)
3 个 CDN 加载 MQTT 库(jsdelivr → BootCDN → Staticfile),一个挂了自动换。
4 个 IP 服务获取客户端 IP(ipify → httpbin → ip.sb → 备用),全挂也能降级运行。
每个关键依赖都有 Plan B、C、D。BeeChat 对不稳定网络的容忍度,是传统架构难以企及的。
技术选型表
| 需求 | 传统方案 | BeeChat 方案 |
|---|---|---|
| 实时通信 | Socket.IO + Node.js 服务 | MQTT 公共代理 |
| 消息存储 | MongoDB / Redis | MQTT 消息链 + 客户端缓存 |
| 图片存储 | OSS / S3 / 本地磁盘 | Canvas 压缩 → base64 |
| 用户认证 | JWT + 数据库 | localStorage 昵称 |
| 管理员认证 | 后端 session | SHA-256 客户端比对 |
| 部署 | 服务器 + 域名 + SSL | 静态文件托管 |
每一行都在问同一个问题:这件事能不能不在服务端做?
一个”叛逆”的对话
面试官:你们的聊天室后端用什么语言写的?
BeeChat:没有后端。
面试官:……那消息怎么同步?
BeeChat:MQTT 公共代理。
面试官:图片存哪?
BeeChat:base64 嵌在消息里。
面试官:管理员怎么认证?
BeeChat:浏览器本地 SHA-256。
面试官:…………你们在哪个服务器部署?
BeeChat:GitHub Pages。
面试官:😶
适合谁?
- 🧑🎓 想学实时通信但不想配服务器的新手
- 🚀 需要快速搭个内部聊天工具的团队
- 🎨 追求极简部署的独立开发者
- 🕵️ 想理解 MQTT / Canvas / Web Crypto 的好奇宝宝
不适合谁?
- 需要消息持久化存储的生产环境(MQTT 代理不保证历史)
- 需要端到端加密的场景(base64 图片可被中间代理读取)
- 需要复杂权限管理的企业应用
这就是取舍。BeeChat 不追求大而全,追求的是用最小的复杂度,覆盖最多的真实需求。
一分钟跑起来
# 1. 下载
git clone https://github.com/Remtg/beechat.git
# 2. 启动(任意静态服务器)
cd beechat
python -m http.server 3000
# 3. 打开浏览器
# http://localhost:3000
# 用手机连同一 WiFi 也能访问
修改管理密码:看 README。
最后
这个项目的核心理念是:
不是所有应用都需要一个后端。公共基础设施已经足够好,好到你可以把服务端的职责外包给它们。
当 MQTT 代理替你转发消息、Canvas 替你压缩图片、Crypto API 替你验证密码——你剩下的工作,就是写一个漂亮的 HTML。
这就是 BeeChat。一个 HTML 文件,一个聊天室,一种态度。










