性能优化

优化您的 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 指令请访问 这里

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