基于 Supabase Realtime + 原生 HTML/CSS/JS 三件套构建的实时聊天应用,已部署在 Cloudflare Pages。
- Slack 风格深色 UI — 工作区栏 / 频道列表 / 聊天主区三栏布局
- 多频道群聊 — general / random / tech 等频道自由切换
- 匿名树洞 — 🌳 treehole 频道自动匿名,保护隐私
- 实时消息 — 基于 Supabase Postgres Changes,新消息即时推送
- 在线状态 — Presence 实时显示在线成员列表与人数
- 打字指示器 — Broadcast 广播 "正在输入…" 状态
- 表情反应 — 消息可添加 / 取消 emoji 反应,实时同步
- 消息历史 — 进入频道自动加载最近 200 条历史
- 日期分隔 — 自动按天插入日期分隔线
- 消息删除 — 自己发送的消息可删除
- 头像颜色 — 登录时选择个人头像颜色
- 表情面板 — 输入框内置 emoji 选择器
| 层 | 技术 |
|---|---|
| 前端 | 原生 HTML + CSS + JavaScript (无框架) |
| 实时 | Supabase Realtime v2 (Postgres Changes + Presence + Broadcast) |
| 数据库 | Supabase Postgres |
| 部署 | Cloudflare Pages |
- 前往 supabase.com 创建新项目
- 在 SQL Editor 中执行
schema.sql全部内容 - 在 Dashboard > Settings > API Keys 中获取:
- Project URL
- Publishable Key (
sb_publishable_...)
编辑 app.js 顶部配置区:
const SUPABASE_URL = 'https://你的项目.supabase.co';
const SUPABASE_ANON = '你的_sb_publishable_KEY';直接用浏览器打开 index.html 即可,或启动本地服务器:
npx serve .
# 或
python3 -m http.server 8080npm install -g wrangler
wrangler login
wrangler pages deploy . --project-name realtime-chat- 将代码推送到 GitHub 仓库
- Cloudflare Dashboard > Pages > Create a project > Connect to Git
- 构建命令留空,输出目录填
/ - 部署完成
- Cloudflare Dashboard > Pages > Create a project > Direct Upload
- 拖入
index.html、style.css、app.js三个文件 - 部署
.
├── index.html # 页面结构
├── style.css # Slack 深色主题样式
├── app.js # Supabase Realtime 逻辑
├── schema.sql # 数据库建表 + RLS + Realtime 发布
└── README.md # 本文件
schema.sql 中的 RLS 策略为演示用途,开放了匿名读写。生产环境请:
- 关闭
anon角色写入权限 - 启用 Supabase Auth 认证
- 添加基于
auth.uid()的行级安全策略 - 对树洞频道考虑使用数据库函数隐藏真实 user_id
用户A 发送消息
│
▼
INSERT INTO messages ──► Postgres WAL
│
▼ │
supabase_realtime publication
│
▼ │
Realtime Server (WebSocket)
│ │
┌───────────┴───────────┘
▼ ▼
用户A 收到 INSERT 用户B 收到 INSERT
(Postgres Changes) (Postgres Changes)
- Postgres Changes:消息和反应的增删实时同步
- Presence:在线成员状态追踪
- Broadcast:打字指示器低延迟广播