搭配 Next.js 使用 Prisma ORM 的綜合指南
Prisma ORM 和 Next.js 結合起來,為建構現代化、伺服器端渲染和 API 驅動的 Web 應用程式提供了強大的組合。本指南整合了各種技巧和策略,以幫助您最大限度地發揮它們的潛力。無論您是在尋找最佳實踐、monorepo 設定指南,還是動態使用策略,我們都能滿足您的需求。
在開發中使用 Prisma Client 的最佳實踐
避免多個 Prisma Client 實例
在開發 Next.js 應用程式時,一個常見的問題是意外地建立多個 Prisma Client 實例。這通常是由於 Next.js 在開發中的熱重載功能所導致。
發生原因
Next.js 的熱重載功能會頻繁地重新載入模組,以立即反映程式碼變更。然而,這可能會導致建立多個 Prisma Client 實例,進而消耗資源並可能導致意外行為。
建議的解決方案
為了避免這種情況,請透過使用全域變數來建立單一 Prisma Client 實例
// lib/prisma.ts
import { PrismaClient } from "@prisma/client";
const globalForPrisma = global as unknown as { prisma: PrismaClient };
export const prisma =
globalForPrisma.prisma || new PrismaClient();
if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = prisma;
使用這種方法可確保即使在開發中的熱重載期間,也只存在一個 Prisma Client 實例。
在 Monorepo 中設定 Prisma ORM
在 monorepo 中使用 Prisma ORM 的挑戰
Monorepo 允許多個專案共享程式碼和依賴項,使其成為現代開發的熱門選擇。然而,在 monorepo 中使用 Prisma ORM 可能會帶來與依賴項解析和 schema 管理相關的挑戰。
主要問題
- 依賴項解析:如果 monorepo 中的多個套件使用不同版本的 Prisma ORM,可能會導致衝突。
- Schema 集中化:跨多個專案管理單一 Prisma Schema 可能很複雜。
monorepo 整合的最佳實踐
-
集中化 Prisma Schema:將 `schema.prisma` 檔案放在共享套件中,例如 `@myorg/db`,以確保一致性。
-
為生成的 client 使用自訂輸出目錄:為生成的 Prisma Client 定義自訂輸出目錄,以維持跨套件的一致性。
-
在根目錄中安裝依賴項:為了防止版本衝突,請在 monorepo 的根目錄中安裝 Prisma ORM。如果個別套件需要直接存取 Prisma(例如,用於本機 client 生成),也請在這些套件中安裝。您可以使用像 Turborepo 這樣的 monorepo 工具,並遵循其最佳實踐,或採用類似的策略來保持應用程式中依賴項的同步。
-
使用 NPM 指令碼進行生成:
{
"scripts": {
"prisma:generate": "prisma generate --schema=./packages/db/schema.prisma"
}
}
這種方法可讓您的 Prisma Schema 和生成的 client 在 monorepo 中的所有專案之間保持同步。
在 Next.js 中動態使用 Prisma Client
處理動態情境
動態使用案例,例如使用租戶特定的資料庫,在使用 Prisma ORM 和 Next.js 時需要額外考量。
問題
每個租戶可能有自己的資料庫,因此需要在執行時建立單獨的 Prisma Client。由於 Next.js 的混合渲染模型,這在 Next.js 中可能會很複雜。
解決方案
使用工廠函數根據租戶特定的配置動態建立 Prisma Client
// lib/prismaDynamic.ts
import { PrismaClient } from "@prisma/client";
type TenantConfig = {
databaseUrl: string;
};
export function createPrismaClient(config: TenantConfig): PrismaClient {
return new PrismaClient({
datasources: {
db: {
url: config.databaseUrl,
},
},
});
}
確保您管理動態建立的 Prisma Client 的生命週期,以避免資源耗盡。