部署到 Vercel
本指南將引導你完成設定和部署使用 Prisma 的無伺服器應用程式到 Vercel 的步驟。
Vercel 是一個託管靜態站點、無伺服器和邊緣函式的雲平臺。你可以將 Vercel 專案與 GitHub 倉庫整合,以便在你進行新提交時自動部署。
我們使用 Next.js 建立了一個示例應用程式,你可以將其作為使用 Prisma 部署應用程式到 Vercel 時的參考。
儘管我們的示例使用了 Next.js,但你也可以將其他應用程式部署到 Vercel。請參閱在 Vercel 上使用 Express 和Vercel 上的 Nuxt 作為其他選項的示例。
構建配置
在 Vercel 構建期間更新 Prisma Client
Vercel 會在部署時自動快取依賴。對於大多數應用程式來說,這不會引起任何問題。然而,對於 Prisma ORM 而言,當 Prisma schema 發生變化時,這可能會導致 Prisma Client 版本過時。為避免此問題,請將 prisma generate 新增到應用程式的 postinstall 指令碼中
{
...
"scripts": {
"postinstall": "prisma generate"
}
...
}
這將在構建時重新生成 Prisma Client,從而確保你的部署始終擁有最新的客戶端。
如果你在部署到 Vercel 期間看到 prisma: command not found 錯誤,則表示你的依賴中缺少 prisma。預設情況下,prisma 是一個開發依賴,可能需要將其移動為標準依賴。
避免 Prisma Client 過時的另一種方法是使用自定義輸出路徑並將客戶端納入版本控制。這樣可以確保每次部署都包含正確的 Prisma Client。
generator client {
provider = "prisma-client-js"
output = "./generated/client"
}
在 Vercel 上的 Monorepo 中部署 Prisma
如果你在 monorepo(例如,使用 TurboRepo)中使用了 Prisma 並部署到 Vercel,你可能會遇到部署包中缺少所需檔案(如 libquery_engine-rhel-openssl-3.0.x.so.node)的問題。這是因為 Vercel 會積極最佳化無伺服器部署,有時會剝離必要的 Prisma 檔案。為了解決此問題,請使用 @prisma/nextjs-monorepo-workaround-plugin 外掛,該外掛可確保 Prisma 引擎檔案正確包含在最終的打包中。有關 Prisma 如何與 Webpack 和 Parcel 等不同打包器互動的更多詳細資訊,請參閱我們的模組打包器頁面。
如果滿足以下條件,則此外掛的使用將過時:
- 你正在使用不帶 Rust 引擎的 Prisma ORM(透過
queryCompiler功能標誌) - 你正在使用新的
prisma-client生成器
CI/CD 工作流程
在更復雜的 CI/CD 環境中,你可能還希望使用你在本地開發期間執行的任何遷移來更新資料庫 schema。你可以使用 prisma migrate deploy 命令來完成此操作。
在這種情況下,你可以在 package.json 中建立一個自定義構建命令(例如,名為 vercel-build),其內容如下:
{
...
"scripts" {
"vercel-build": "prisma generate && prisma migrate deploy && next build",
}
...
}
你可以使用以下命令在 CI/CD 管道中呼叫此指令碼:
npm run vercel-build
為預覽部署新增單獨的資料庫
預設情況下,你的應用程式將有一個與倉庫的 main git 分支關聯的單一生產環境。如果你開啟一個拉取請求來更改應用程式,Vercel 會建立一個新的預覽環境。
Vercel 會使用你在匯入專案時定義的 DATABASE_URL 環境變數,用於生產環境和預覽環境。如果你建立包含資料庫 schema 遷移的拉取請求,這會引發問題,因為該拉取請求將更改生產資料庫的 schema。
為防止這種情況,請使用第二個託管資料庫來處理預覽部署。獲得連線字串後,你可以使用 Vercel 控制檯為你的預覽環境新增 DATABASE_URL。
-
點選你的 Vercel 專案的設定選項卡。
-
點選環境變數。
-
新增一個鍵為
DATABASE_URL的環境變數,並僅選擇預覽環境選項。
-
將值設定為你的第二個資料庫的連線字串。
postgresql://dbUsername:dbPassword@myhost:5432/mydb -
點選儲存。
連線池
當你使用函式即服務提供商(例如 Vercel 無伺服器函式)時,每次呼叫都可能導致與資料庫建立新連線。這可能導致你的資料庫迅速耗盡開放連線,並使你的應用程式停滯。因此,為資料庫建立連線池至關重要。
你可以使用 Accelerate 進行連線池,或者使用具有內建連線池的 Prisma Postgres,以減小 Prisma Client 的打包大小並避免冷啟動。
有關無伺服器環境連線管理的更多資訊,請參閱我們的連線管理指南。