跳转到内容

Refine 适配器

@svadmin/refine-adapter 提供了一个通用桥接层,可以将任意官方 Refine 数据源适配器包装为 svadmin 的 DataProvider。

Refine 拥有成熟的生态系统,提供了 10+ 个生产级数据源适配器,涵盖 Supabase、Hasura、Strapi、Appwrite、GraphQL、REST 等后端。svadmin 无需从头实现这些集成,可以通过该适配器直接复用。

Terminal window
bun add @svadmin/refine-adapter @svadmin/core
# 加上你想要的 Refine 数据源:
bun add @refinedev/supabase

如果你的项目运行在 Vite 上,并且同时用了 @svadmin/ui 或 @svadmin/supabase,请把 svadmin 相关包加入 optimizeDeps.exclude,避免开发环境预打包后出现导出缺失之类的问题:

optimizeDeps: {
exclude: ['@svadmin/core', '@svadmin/ui', '@svadmin/supabase'],
}
import { createRefineAdapter } from '@svadmin/refine-adapter';
import { dataProvider as createRefineSupabase } from '@refinedev/supabase';
import { createClient } from '@supabase/supabase-js';
const supabaseClient = createClient(SUPABASE_URL, SUPABASE_KEY);
const refineProvider = createRefineSupabase(supabaseClient);
// 将 Refine 数据源包装为 svadmin 格式
const dataProvider = createRefineAdapter(refineProvider);

然后将 dataProvider 传给 <AdminApp> 或 setDataProvider():

<AdminApp {dataProvider} {resources} title="管理后台" />

Refine 的 DataProvider 接口与 svadmin 的 DataProvider 高度一致。适配器的工作方式:

  1. 绑定 5 个必需方法(getList、getOne、create、update、deleteOne、getApiUrl)。
  2. 仅在底层 Refine 数据源实现了可选方法时,才附加它们(getMany、createMany、updateMany、deleteMany、custom)。

这意味着你可以获得所选 Refine 数据源的完整功能集——包括排序、过滤、分页和批量操作支持。

如果你已经在使用 @svadmin/* 提供器包,则无需直接使用此包。以下包内部使用了 @svadmin/refine-adapter:

svadmin 包桥接目标Refine 包
@svadmin/supabaseSupabase 数据/认证/实时@refinedev/supabase
@svadmin/appwriteAppwrite 数据/认证/实时@refinedev/appwrite
@svadmin/strapiStrapi CMS@refinedev/strapi-v4
@svadmin/hasuraHasura GraphQL@refinedev/hasura
@svadmin/graphql通用 GraphQL@refinedev/graphql
@svadmin/airtableAirtable@refinedev/airtable
@svadmin/medusaMedusa Commerce@refinedev/medusa
@svadmin/nestjs-queryNestJS GraphQL@refinedev/nestjs-query
@svadmin/nestjsx-crudNestJS CRUD@refinedev/nestjsx-crud
@svadmin/simple-restREST API@refinedev/simple-rest

当你想使用 svadmin 尚未提供专用包的 Refine 数据源时,可以直接使用 createRefineAdapter:

import { createRefineAdapter } from '@svadmin/refine-adapter';
import { dataProvider as createRefineDirectus } from '@tspvivek/refine-directus';
const directusProvider = createRefineDirectus('https://my-directus.example.com');
const dataProvider = createRefineAdapter(directusProvider);

某些 svadmin 提供器直接连接后端,不经过 Refine,因为它们使用非 Refine 后端或提供了更深层的集成:

包原因
@svadmin/drizzle通过 Drizzle ORM 直连数据库(无 HTTP API)
@svadmin/elysia通过 Eden Treaty 实现类型安全,从 Elysia 路由推断 ResourceTypeMap
@svadmin/pocketbase直接使用 PocketBase SDK,集成认证和实时订阅
@svadmin/firebase直接使用 Firebase SDK,支持 Firestore 序列化