Supabase 教程
Supabase 是一个开源的后端即服务平台,基于 PostgreSQL 构建,提供数据库、身份认证、文件存储、实时订阅等完整的后端功能。它被誉为"开源版 Firebase",但比 Firebase 更强大,因为它基于关系型数据库,支持完整的 SQL 功能。
什么是 Supabase?
Supabase 的核心理念是"用开源的方式重新定义服务器开发体验"。它将一系列优秀的开源技术组件无缝打包并托管,形成了一个完整的后端即服务平台。
传统开发模式下,你需要自己搭建数据库、编写 API、实现用户认证、处理文件上传等。而使用 Supabase,这些功能都开箱即用,你可以专注于业务逻辑的开发。
核心特点
开源免费:Supabase 完全开源,你可以查看和修改源代码,也可以选择自托管。免费套餐提供 500MB 数据库存储和 1GB 文件存储,足够小型项目使用。
基于 PostgreSQL:Supabase 的核心是一个完整的 PostgreSQL 数据库,支持所有 PostgreSQL 特性,包括复杂查询、事务、存储过程、触发器等。这比 Firebase 的 NoSQL 数据库更适合关系型数据。
自动生成 API:Supabase 会根据你的数据库结构自动生成 RESTful API 和 GraphQL API,无需手动编写后端代码。
实时订阅:通过 PostgreSQL 的 LISTEN/NOTIFY 机制,客户端可以实时监听数据变化,非常适合聊天应用、协作工具等场景。
行级安全策略:Supabase 深度集成了 PostgreSQL 的 Row Level Security (RLS),可以在数据库层面实现精细的权限控制。
核心功能概览
Supabase 提供了构建现代应用所需的所有后端功能:
数据库(Database)
每个 Supabase 项目都会创建一个独立的 PostgreSQL 数据库,你可以:
- 使用 SQL 或可视化界面创建表、视图、函数
- 启用数据库扩展,如 pgvector(向量搜索)、postgis(地理信息)
- 配置行级安全策略控制数据访问
- 创建触发器和存储过程实现业务逻辑
身份认证(Authentication)
内置完整的用户认证系统,支持多种登录方式:
- 邮箱密码登录
- 魔法链接(Magic Link,无密码登录)
- 手机号 OTP 验证
- OAuth 社交登录(Google、GitHub、Apple、Facebook 等)
- 企业级 SSO
认证系统与 RLS 无缝集成,你可以基于用户身份控制数据访问权限。
文件存储(Storage)
提供类似云存储的文件管理功能:
- 创建存储桶组织文件
- 支持公开和私有访问
- 内置图片转换和优化
- 与 RLS 集成实现文件权限控制
实时订阅(Realtime)
基于 WebSocket 的实时数据同步:
- 监听表的 INSERT、UPDATE、DELETE 事件
- 支持过滤条件,只订阅感兴趣的数据
- 适用于实时聊天、协作编辑、实时仪表盘等场景
边缘函数(Edge Functions)
基于 Deno 的无服务器函数:
- 使用 TypeScript/JavaScript 编写
- 全球边缘部署,低延迟执行
- 处理 Webhook、调用第三方 API、执行敏感逻辑
架构设计
Supabase 的架构设计非常清晰,它不是重新发明轮子,而是将成熟的开源项目组合在一起:
┌─────────────────────────────────────────────────────────┐
│ 客户端应用 │
│ (Web / Mobile / Desktop / IoT) │
└─────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ Supabase 平台 │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────────┐ │
│ │ Kong │ │ PostgREST│ │ GoTrue │ │ Realtime │ │
│ │ (API网关)│ │ (REST API)│ │ (认证) │ │ (实时订阅) │ │
│ └─────────┘ └─────────┘ └─────────┘ └─────────────┘ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ PostgreSQL 数据库 │ │
│ │ ┌───────┐ ┌───────┐ ┌─────────┐ ┌───────────┐ │ │
│ │ │ 表 │ │ 视图 │ │ RLS策略 │ │ 扩展插件 │ │ │
│ │ └───────┘ └───────┘ └─────────┘ └───────────┘ │ │
│ └─────────────────────────────────────────────────┘ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ Storage │ │ Edge Funcs │ │
│ │ (文件存储) │ │ (边缘函数) │ │
│ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────┘
Kong:API 网关,负责请求路由和负载均衡。
PostgREST:将 PostgreSQL 数据库自动转换为 RESTful API,支持复杂的查询过滤和嵌套资源。
GoTrue:用户认证服务,处理注册、登录、JWT 令牌管理等。
Realtime:实时订阅服务,监听 PostgreSQL 的 WAL 日志,将数据变更推送给客户端。
Storage:文件存储服务,基于对象存储实现文件管理。
Edge Functions:基于 Deno 的无服务器函数运行时。
与 Firebase 对比
Supabase 常被拿来与 Firebase 比较,两者都是后端即服务平台,但有本质区别:
| 特性 | Supabase | Firebase |
|---|---|---|
| 数据库 | PostgreSQL(关系型) | Firestore(NoSQL 文档型) |
| 开源 | 完全开源,可自托管 | 闭源,仅云服务 |
| 数据模型 | 关系型,支持 JOIN、事务 | 文档型,嵌套结构 |
| 查询能力 | 完整 SQL | 有限查询能力 |
| 数据迁移 | 标准 SQL 导出导入 | 需要工具迁移 |
| 价格 | 免费额度大,按量付费 | 免费额度小,按读写计费 |
| 实时功能 | 基于 PostgreSQL | 原生支持 |
| 扩展性 | PostgreSQL 扩展生态 | Google 生态集成 |
如果你的应用需要关系型数据模型、复杂查询、事务支持,Supabase 是更好的选择。如果你的应用是简单的文档存储、需要深度集成 Google 生态,Firebase 可能更合适。
适用场景
适合使用 Supabase 的场景
快速原型开发:Supabase 提供了完整的后端功能,你可以在几分钟内搭建一个可用的后端,非常适合 MVP 开发。
实时应用:聊天应用、协作工具、实时仪表盘等需要实时数据同步的场景。
移动应用后端:Supabase 提供了 iOS、Android、Flutter 等平台的 SDK,可以快速构建移动应用后端。
AI 应用:通过 pgvector 扩展,Supabase 支持向量搜索,可以构建 AI 应用。
全栈 Web 应用:与 Next.js、Nuxt.js 等框架深度集成,构建全栈应用。
可能不太适合的场景
超大规模应用:虽然 Supabase 支持扩展,但对于日活千万级的应用,可能需要更精细的架构设计。
复杂业务逻辑:如果业务逻辑非常复杂,可能需要传统的后端服务来处理。
需要完全控制:虽然 Supabase 支持自托管,但如果你需要对基础设施有完全控制,可能需要自己搭建。
教程目录
入门基础
核心功能
进阶功能
高级主题
参考资料
- 速查表 - 常用代码片段
快速开始
让我们创建第一个 Supabase 项目:
步骤一:注册账号
访问 supabase.com,使用 GitHub 账号或邮箱注册。
步骤二:创建项目
点击 "New Project",填写项目名称和数据库密码,选择离你最近的区域。
步骤三:创建数据表
在 Table Editor 中创建一个 todos 表:
create table todos (
id bigint primary key generated always as identity,
task text not null,
is_complete boolean default false,
created_at timestamptz default now()
);
步骤四:插入测试数据
insert into todos (task) values
('学习 Supabase'),
('构建第一个应用'),
('部署到生产环境');
步骤五:获取 API 密钥
在项目设置的 API 页面,获取 Project URL 和 anon public 密钥。
步骤六:在应用中使用
import { createClient } from '@supabase/supabase-js'
const supabaseUrl = 'https://your-project.supabase.co'
const supabaseKey = 'your-anon-key'
const supabase = createClient(supabaseUrl, supabaseKey)
// 查询数据
const { data, error } = await supabase
.from('todos')
.select('*')
console.log(data)
学习建议
-
理解 PostgreSQL 基础:Supabase 基于 PostgreSQL,了解 SQL 和关系型数据库概念非常重要。
-
掌握 RLS 策略:行级安全策略是 Supabase 安全模型的核心,理解它对于构建安全应用至关重要。
-
善用官方文档:Supabase 官方文档非常详细,遇到问题先查阅文档。
-
从简单开始:先构建基本的 CRUD 应用,再逐步添加认证、实时订阅等功能。
-
使用 CLI 工具:Supabase CLI 可以帮助你在本地开发和管理项目。