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