Function Duration
serverless関数の実行時間を増加させるパターンを検出するルール。
これらのルールは、serverless関数の実行時間を膨らませるパターンを検出します。実行時間が短いほど請求額は下がります。VercelはGB秒あたりの実行時間で課金します。
async-parallel
Warning ·
vercel-doctor/async-parallel3つ以上の直列な await で、互いに独立しているように見えるもの(後の await が前の変数を参照していない)を検出します。
Why it matters: 直列な await は順番に実行されます。独立していれば、Promise.all() で並列実行すると、関数の実行時間を大幅に短縮できます。
const users = await db.user.findMany();
const posts = await db.post.findMany();
const comments = await db.comment.findMany();const [users, posts, comments] = await Promise.all([
db.user.findMany(),
db.post.findMany(),
db.comment.findMany(),
]);server-after-nonblocking
Warning ·
vercel-doctor/server-after-nonblockingserver action("use server" を含むファイル)内の console.log()、console.info()、console.warn()、analytics.track()、analytics.identify()、analytics.page() の呼び出しを検出します。
Why it matters: ログや analytics 呼び出しは完了までレスポンスをブロックします。after() でラップすると、レスポンスは即座に返し、処理はバックグラウンドで続行できます。
"use server";
export const updateUser = async (data: FormData) => {
await db.user.update({ ... });
console.log("User updated");
analytics.track("user_updated");
};"use server";
import { after } from "next/server";
export const updateUser = async (data: FormData) => {
await db.user.update({ ... });
after(() => {
console.log("User updated");
analytics.track("user_updated");
});
};vercel-edge-sequential-await
Warning ·
vercel-doctor/vercel-edge-sequential-awaitedge runtime のファイルで、Promise.all を使用せずに2つ以上の直列な await があることを検出します。
Why it matters: edge 関数は実行時間制限が厳格です。直列な I/O は並列化できる貴重なミリ秒を無駄にします。
export const runtime = "edge";
export async function GET() {
const user = await getUser();
const settings = await getSettings();
return Response.json({ user, settings });
}export const runtime = "edge";
export async function GET() {
const [user, settings] = await Promise.all([getUser(), getSettings()]);
return Response.json({ user, settings });
}Edit on GitHub
Last updated on