性能优化

优化您的 Better Auth 应用性能的指南。

在本指南中,我们将介绍一些优化应用性能的方法,以构建更高效的 Better Auth 应用。

缓存

缓存是一种强大的技术,能够显著提升 Better Auth 应用的性能,减少数据库查询次数并加快响应速度。

每次调用 useSessiongetSession 都访问数据库并不理想,尤其是在会话不经常变化的情况下。Cookie 缓存通过将会话数据存储在短期有效且签名过的 Cookie 中来解决此问题,这类似于使用刷新令牌的 JWT 访问令牌。

要开启 Cookie 缓存,只需在认证配置中设置 session.cookieCache

auth.ts
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 指令

后台任务

在无服务器平台(如 Vercel、Cloudflare Workers)上,您可以通过将非关键工作(清理、分析、速率限制更新、邮件发送)延迟到响应发送后执行,来提升响应速度。配置 advanced.backgroundTasks 并在钩子中使用 ctx.context.runInBackgroundctx.context.runInBackgroundOrAwait

auth.ts
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 的性能至关重要。

推荐索引字段

表名字段插件
usersemail
accountsuserId
sessionsuserId, token
verificationsidentifier
invitationsemail, organizationIdorganization
membersuserId, organizationIdorganization
organizationsslugorganization
passkeyuserIdpasskey
twoFactorsecrettwoFactor

我们计划在未来的模式生成工具中添加索引支持。

打包体积优化

如果您使用自定义适配器(如 Prisma、Drizzle 或 MongoDB),可以通过使用 better-auth/minimal 替代 better-auth 来减小打包体积。该版本排除了仅在直接数据库连接时才需要的 Kysely。

使用方法

只需从 better-auth/minimal 而非 better-auth 导入即可:

auth.ts
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"
  }),
});

限制:

  • 不支持直接数据库连接(必须使用适配器)
  • 不支持内置迁移。请使用外部迁移工具(如果您需要内置迁移支持,则使用 better-auth