跳至主要內容

搭配 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 管理相關的挑戰。

主要問題

  1. 依賴項解析:如果 monorepo 中的多個套件使用不同版本的 Prisma ORM,可能會導致衝突。
  2. 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 的生命週期,以避免資源耗盡。