跳到主要内容

部署到 Vercel

本指南将带领您了解如何设置和部署一个使用 Prisma 到 Vercel 的无服务器应用程序。

Vercel 是一个托管静态站点、无服务器函数和边缘函数的云平台。您可以将 Vercel 项目与 GitHub 仓库集成,以便在新提交时自动部署。

我们创建了一个使用 Next.js 的示例应用程序,您可以在将使用 Prisma 的应用程序部署到 Vercel 时将其作为参考。

虽然我们的示例使用了 Next.js,但您可以将其他应用程序部署到 Vercel。请参阅在 Vercel 上使用 ExpressVercel 上的 Nuxt 作为其他选项的示例。

构建配置

在 Vercel 构建期间更新 Prisma Client

Vercel 在部署时会自动缓存依赖项。对于大多数应用程序来说,这不会引起任何问题。但是,对于 Prisma ORM,在您的 Prisma schema 发生更改时,可能会导致 Prisma Client 版本过时。为了避免这个问题,请将 prisma generate 添加到您的应用程序的 postinstall 脚本中。

package.json
{
...
"scripts" {
"postinstall": "prisma generate"
}
...
}

这将在构建时重新生成 Prisma Client,以便您的部署始终具有最新的客户端。

信息

如果您在部署到 Vercel 期间看到 prisma: command not found 错误,则表示您的依赖项中缺少 prisma。默认情况下,prisma 是开发依赖项,可能需要将其移动到标准依赖项中。

另一种避免 Prisma Client 过时的方法是使用自定义输出路径并将您的客户端添加到版本控制中。这样可以确保每次部署都包含正确的 Prisma Client。

schema.prisma
generator client {
provider = "prisma-client-js"
output = "./generated/client"
}

在 Vercel 上的 Monorepos 中部署 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 等不同打包器交互的更多详细信息,请参阅我们的模块打包器页面。

如果出现以下情况,此插件的使用将过时:

CI/CD 工作流程

在更复杂的 CI/CD 环境中,您可能还想使用在本地开发期间执行的任何迁移来更新数据库 schema。您可以使用prisma migrate deploy 命令来执行此操作。

在这种情况下,您可以在您的 package.json 中创建一个自定义构建命令(例如命名为 vercel-build),如下所示:

package.json
{
...
"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

  1. 点击您的 Vercel 项目的设置选项卡。

  2. 点击环境变量

  3. 添加一个键为 DATABASE_URL 的环境变量,并且选择预览环境选项。

    Add an environment variable for the preview environment

  4. 将值设置为您的第二个数据库的连接字符串。

    postgresql://dbUsername:dbPassword@myhost:5432/mydb
  5. 点击保存

连接池

当您使用函数即服务提供商(如 Vercel Serverless 函数)时,每次调用都可能导致与您的数据库建立新的连接。这可能导致您的数据库迅速耗尽开放连接并导致应用程序停滞。因此,为数据库建立连接池至关重要。

您可以使用Accelerate 进行连接池,或者使用具有内置连接池的Prisma Postgres,以减小 Prisma Client 打包大小并避免冷启动。

有关无服务器环境连接管理的更多信息,请参阅我们的连接管理指南