Supabase框架集成 #
一、Next.js集成 #
1.1 安装依赖 #
bash
npm install @supabase/supabase-js @supabase/auth-helpers-nextjs
1.2 环境变量 #
bash
# .env.local
NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
1.3 创建客户端 #
typescript
// lib/supabase/client.ts
import { createBrowserClient } from '@supabase/ssr'
export function createClient() {
return createBrowserClient(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!
)
}
typescript
// lib/supabase/server.ts
import { createServerClient } from '@supabase/ssr'
import { cookies } from 'next/headers'
export async function createClient() {
const cookieStore = await cookies()
return createServerClient(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
{
cookies: {
getAll() {
return cookieStore.getAll()
},
setAll(cookiesToSet) {
try {
cookiesToSet.forEach(({ name, value, options }) =>
cookieStore.set(name, value, options)
)
} catch {}
},
},
}
)
}
1.4 Server Component使用 #
tsx
// app/users/page.tsx
import { createClient } from '@/lib/supabase/server'
export default async function UsersPage() {
const supabase = await createClient()
const { data: users } = await supabase
.from('profiles')
.select('*')
return (
<ul>
{users?.map(user => (
<li key={user.id}>{user.name}</li>
))}
</ul>
)
}
1.5 Client Component使用 #
tsx
// components/UserList.tsx
'use client'
import { createClient } from '@/lib/supabase/client'
import { useEffect, useState } from 'react'
export function UserList() {
const [users, setUsers] = useState([])
const supabase = createClient()
useEffect(() => {
supabase.from('profiles').select('*').then(({ data }) => {
setUsers(data || [])
})
}, [])
return (
<ul>
{users.map(user => (
<li key={user.id}>{user.name}</li>
))}
</ul>
)
}
1.6 认证中间件 #
typescript
// middleware.ts
import { createServerClient } from '@supabase/ssr'
import { NextResponse, type NextRequest } from 'next/server'
export async function middleware(request: NextRequest) {
let supabaseResponse = NextResponse.next({ request })
const supabase = createServerClient(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
{
cookies: {
getAll() { return request.cookies.getAll() },
setAll(cookiesToSet) {
cookiesToSet.forEach(({ name, value }) => request.cookies.set(name, value))
supabaseResponse = NextResponse.next({ request })
cookiesToSet.forEach(({ name, value, options }) =>
supabaseResponse.cookies.set(name, value, options)
)
},
},
}
)
const { data: { session } } = await supabase.auth.getSession()
if (!session && request.nextUrl.pathname.startsWith('/protected')) {
const url = request.nextUrl.clone()
url.pathname = '/login'
return NextResponse.redirect(url)
}
return supabaseResponse
}
export const config = {
matcher: ['/((?!_next/static|_next/image|favicon.ico).*)'],
}
二、React集成 #
2.1 安装依赖 #
bash
npm install @supabase/supabase-js @supabase/auth-helpers-react
2.2 配置Provider #
tsx
// App.tsx
import { SessionContextProvider } from '@supabase/auth-helpers-react'
import { createClient } from '@supabase/supabase-js'
const supabase = createClient(
process.env.REACT_APP_SUPABASE_URL!,
process.env.REACT_APP_SUPABASE_ANON_KEY!
)
function App() {
return (
<SessionContextProvider supabaseClient={supabase}>
<Router>...</Router>
</SessionContextProvider>
)
}
2.3 使用Hook #
tsx
import { useSession, useSupabaseClient } from '@supabase/auth-helpers-react'
export function Profile() {
const session = useSession()
const supabase = useSupabaseClient()
if (!session) {
return <div>Not logged in</div>
}
return <div>Hello {session.user.email}</div>
}
三、Vue集成 #
3.1 安装依赖 #
bash
npm install @supabase/supabase-js
3.2 创建插件 #
typescript
// plugins/supabase.ts
import { createClient } from '@supabase/supabase-js'
import type { App } from 'vue'
const supabaseUrl = import.meta.env.VITE_SUPABASE_URL
const supabaseKey = import.meta.env.VITE_SUPABASE_ANON_KEY
export const supabase = createClient(supabaseUrl, supabaseKey)
export default {
install(app: App) {
app.provide('supabase', supabase)
}
}
3.3 注册插件 #
typescript
// main.ts
import { createApp } from 'vue'
import App from './App.vue'
import supabase from './plugins/supabase'
const app = createApp(App)
app.use(supabase)
app.mount('#app')
3.4 组件使用 #
vue
<script setup lang="ts">
import { inject, onMounted, ref } from 'vue'
import type { SupabaseClient } from '@supabase/supabase-js'
const supabase = inject('supabase') as SupabaseClient
const users = ref([])
onMounted(async () => {
const { data } = await supabase.from('profiles').select('*')
users.value = data || []
})
</script>
<template>
<ul>
<li v-for="user in users" :key="user.id">
{{ user.name }}
</li>
</ul>
</template>
四、Nuxt集成 #
4.1 安装依赖 #
bash
npm install @supabase/nuxt
4.2 配置模块 #
typescript
// nuxt.config.ts
export default defineNuxtConfig({
modules: ['@supabase/nuxt'],
runtimeConfig: {
supabase: {
url: process.env.SUPABASE_URL,
key: process.env.SUPABASE_KEY,
}
}
})
4.3 使用Composable #
vue
<script setup>
const client = useSupabaseClient()
const user = useSupabaseUser()
const { data } = await client.from('profiles').select('*')
</script>
五、SvelteKit集成 #
5.1 安装依赖 #
bash
npm install @supabase/supabase-js @supabase/auth-helpers-sveltekit
5.2 创建客户端 #
typescript
// src/lib/supabaseClient.ts
import { createClient } from '@supabase/supabase-js'
import { PUBLIC_SUPABASE_URL, PUBLIC_SUPABASE_ANON_KEY } from '$env/static/public'
export const supabase = createClient(PUBLIC_SUPABASE_URL, PUBLIC_SUPABASE_ANON_KEY)
5.3 服务端Hooks #
typescript
// src/hooks.server.ts
import { PUBLIC_SUPABASE_URL, PUBLIC_SUPABASE_ANON_KEY } from '$env/static/public'
import { createServerClient } from '@supabase/ssr'
import type { Handle } from '@sveltejs/kit'
export const handle: Handle = async ({ event, resolve }) => {
event.locals.supabase = createServerClient(
PUBLIC_SUPABASE_URL,
PUBLIC_SUPABASE_ANON_KEY,
{
cookies: {
getAll() { return event.cookies.getAll() },
setAll(cookiesToSet) {
cookiesToSet.forEach(({ name, value, options }) =>
event.cookies.set(name, value, { ...options, path: '/' })
)
},
},
}
)
event.locals.safeGetSession = async () => {
const { data: { session } } = await event.locals.supabase.auth.getSession()
return session
}
return resolve(event)
}
六、React Native集成 #
6.1 安装依赖 #
bash
npm install @supabase/supabase-js
npm install react-native-url-polyfill
npm install @react-native-async-storage/async-storage
6.2 创建客户端 #
typescript
// lib/supabase.ts
import 'react-native-url-polyfill/auto'
import AsyncStorage from '@react-native-async-storage/async-storage'
import { createClient } from '@supabase/supabase-js'
const supabaseUrl = 'YOUR_SUPABASE_URL'
const supabaseKey = 'YOUR_SUPABASE_ANON_KEY'
export const supabase = createClient(supabaseUrl, supabaseKey, {
auth: {
storage: AsyncStorage,
autoRefreshToken: true,
persistSession: true,
detectSessionInUrl: false,
},
})
七、总结 #
框架集成要点:
| 框架 | 包 |
|---|---|
| Next.js | @supabase/auth-helpers-nextjs |
| React | @supabase/auth-helpers-react |
| Vue | @supabase/supabase-js |
| Nuxt | @supabase/nuxt |
| SvelteKit | @supabase/auth-helpers-sveltekit |
下一步,让我们学习第三方集成!
最后更新:2026-03-28