性能优化
优化您的 Better Auth 应用性能的指南。
在本指南中,我们将介绍一些优化应用性能的方法,以构建更高效的 Better Auth 应用。
缓存
缓存是一种强大的技术,能够显著提升 Better Auth 应用的性能,减少数据库查询次数并加快响应速度。
Cookie 缓存
每次调用 useSession 或 getSession 都访问数据库并不理想,尤其是在会话不经常变化的情况下。Cookie 缓存通过将会话数据存储在短期有效且签名过的 Cookie 中来解决此问题,这类似于使用刷新令牌的 JWT 访问令牌。
要开启 Cookie 缓存,只需在认证配置中设置 session.cookieCache:
import { betterAuth } from "better-auth";
export const auth = betterAuth({
session: {
cookieCache: {
enabled: true,
maxAge: 5 * 60, // 缓存时长,单位秒
},
},
});阅读更多关于Cookie 缓存的内容。
框架缓存
以下是如何在不同框架和环境中实现缓存的示例:
从 Next v15 起,我们可以使用 "use cache" 指令缓存服务器函数的响应。
export async function getUsers() {
'use cache'
const { users } = await auth.api.listUsers();
return users
}了解更多 NextJS use cache 指令请访问 这里。
在 React Router v7 中,你可以在 loader 函数中使用 HTTP Cache-Control 头来缓存响应。你还必须导出 headers 函数以发送这些头信息。示例如下:
import { data } from 'react-router';
import type { Route } from './+types/your-route-name';
export const loader = async ({ request }: Route.LoaderArgs) => {
const { users } = await auth.api.listUsers();
return data(users, {
headers: {
'Cache-Control': 'max-age=3600', // 缓存 1 小时
},
});
};
export function headers({ loaderHeaders }: Route.HeadersArgs) {
return loaderHeaders;
}在 SolidStart 中,你可以使用 query 函数来缓存数据。示例如下:
const getUsers = query(
async () => (await auth.api.listUsers()).users,
"getUsers"
);了解更多关于 SolidStart query 函数的信息请访问 这里。
使用 TanStack Query 你可以通过 useQuery 钩子缓存数据。示例如下:
import { useQuery } from '@tanstack/react-query';
const fetchUsers = async () => {
const { users } = await auth.api.listUsers();
return users;
};
export default function Users() {
const { data: users, isLoading } = useQuery('users', fetchUsers, {
staleTime: 1000 * 60 * 15, // 缓存 15 分钟
});
if (isLoading) return <div>加载中...</div>;
return (
<ul>
{users.map(user => (
<li key={user.id}>{user.name}</li>
))}
</ul>
);
}了解更多关于 TanStack Query 请访问 这里。
后台任务
在无服务器平台(如 Vercel、Cloudflare Workers)上,你可以通过将非关键工作(清理、分析、速率限制更新、邮件发送)延迟到响应发送后执行,来提升响应速度。配置 advanced.backgroundTasks 并在钩子中使用 ctx.context.runInBackground 或 ctx.context.runInBackgroundOrAwait。
import { betterAuth } from "better-auth";
import { createAuthMiddleware } from "better-auth/api";
import { waitUntil } from "@vercel/functions";
export const auth = betterAuth({
advanced: {
backgroundTasks: { handler: waitUntil },
},
hooks: {
after: createAuthMiddleware(async (ctx) => {
if (ctx.path === "/sign-up/email") {
ctx.context.runInBackground(logSignUp(ctx.context.newSession?.user.id));
}
}),
},
});有关更多示例,请参阅上下文文档。
SSR 优化
如果你使用支持服务器端渲染的框架,通常建议在服务器上预取用户会话,并将其作为客户端的回退。
const session = await auth.api.getSession({
headers: await headers(),
});
// 然后将 session 传递给客户端数据库优化
优化数据库性能对于充分发挥 Better Auth 的性能至关重要。
推荐索引字段
| 表名 | 字段 | 插件 |
|---|---|---|
| users | email | |
| accounts | userId | |
| sessions | userId, token | |
| verifications | identifier | |
| invitations | email, organizationId | organization |
| members | userId, organizationId | organization |
| organizations | slug | organization |
| passkey | userId | passkey |
| twoFactor | secret | twoFactor |
我们计划在未来的模式生成工具中添加索引支持。
打包体积优化
如果你使用自定义适配器(如 Prisma、Drizzle 或 MongoDB),可以通过使用 better-auth/minimal 替代 better-auth 来减小打包体积。该版本排除了仅在直接数据库连接时才需要的 Kysely。
使用方法
只需从 better-auth/minimal 而非 better-auth 导入即可:
import { betterAuth } from "better-auth/minimal";
import { prismaAdapter } from "better-auth/adapters/prisma";
import { PrismaClient } from "@prisma/client";
const prisma = new PrismaClient();
export const auth = betterAuth({
database: prismaAdapter(prisma, {
provider: "postgresql", // 或 "mysql", "sqlite"
}),
});import { betterAuth } from "better-auth/minimal";
import { drizzleAdapter } from "better-auth/adapters/drizzle";
import { db } from "./database";
export const auth = betterAuth({
database: drizzleAdapter(db, {
provider: "pg", // 或 "mysql", "sqlite"
}),
});import { betterAuth } from "better-auth/minimal";
import { mongodbAdapter } from "better-auth/adapters/mongodb";
import { MongoClient } from "mongodb";
const client = new MongoClient(process.env.DATABASE_URL!);
const db = client.db();
export const auth = betterAuth({
database: mongodbAdapter(db),
});限制:
- 不支持直接数据库连接(必须使用适配器)
- 不支持内置迁移。请使用外部迁移工具(如果需要内置迁移支持请使用
better-auth)