Next.js项目实践(十)– 部署生产环境

本文是本系列最后一篇,部署项目的生产环境。


添加元数据

目前我们的项目未对搜索引擎优化,比如每个页面的标题都是“Create Next App”。我们应该给每个页面设置恰当的标题和描述。

首先是首页 app/page.tsx,在该页最后添加metadata,注意不能拼错这是约定的。

......
​
export const metadata: Metadata = {
  title: "Issue Tracker - Dashboard",
  description: "View a summary of project issues",
};

再在app/issues/page.tsx也添加同样的metadata。

然后在 /app/issues/[id]/page.tsx添加,这个页面使用generateMetadata动态添加,同样的,这也是约定的,函数名不能拼错。

查看网页,打开开发者工具能看到相应的metadata。这里只设置了基本的title和description信息的metadata,实际可以设置更多的信息,比如社交媒体信息,这样可以很方便分享。

提交Git。命名:Add metadata.


使用 React Cache 优化性能

IssueDetailPage有两个地方都从数据库获取具体的Issue, 这是没必要的重复连接数据库的操作,可以使用React Cache优化。

连接数据获取具体Issue的操作传给cache, 第一次使用真实的连接数据库来获得Issue, 第二次则使用缓存的数据。缓存只在同一请求中生效,如果发起另外的HTTP Request时,也是需要连接数据库的。

为了证明确实只有一次连接数据库,我们可以在prisma的client中添加 log属性,这样就在控制台能看到相关查询语句。

提交Git。命名:Optimize performance using react cache。


删除 .env 文件

之前我们有个疏忽,未将 .env 排除在git 跟踪之外,因为 .env文件有敏感信息,其他人访问git存储库就会看到敏感信息。

先将 .env 加进 .gitignore文件,后续 .env不会被 git 跟踪,但已存在的存储库还是有 .env的信息的。要删除之前存储库已存在的文件,需要借用工具,git-filter-repo或BFG repo-cleaner。这里就使用git-filter-repo.

在使用git-filter-repo删除历史文件之前,我们先创建一个 .env.sample文件,内容复制于.env,但去掉所有敏感信息,这样后面看到该存储库的人就知道需要设置哪些信息。

DATABASE_URL=""
NEXTAUTH_URL="http://localhost:3000"
NEXTAUTH_SECRET=""
GITHUB_ID=""
GITHUB_SECRET=""

现在开始删除git历史文件 .env , 下载git-filter-repo文件。

https://github.com/newren/git-filter-repo/blob/main/git-filter-repo

将该文件改名为git-filter-repo.py并放置在根目录下。

很明显,这是一个python文件,需要python环境。然后到根目录,执行以下命令清除历史版本的 .env文件。

python3 git-filter-repo.py –path .env –invert-path –force

提交Git。命名:Add an example env file。


设置错误跟踪

实际生产环境中,用户使用可能会产生各种各样的问题,需要进行错误跟踪,有不少选择,比如sentry, BugSang, LockRocket等。

本节使用sentry,官网是:

sentry.io

如果没有账户,需要花几分钟注册一个。再进行Project的创建:选择项目平台为Next.js;警报频率为”Alert me on every new issue”;项目名称为”issue-tracker”。

根据提示,回到控制台执行:

npx @sentry/wizard@latest -i nextjs

sentry会自动为我们的项目创建更新相关文件配置好sentry的SDK。

我们无需碰sentry创建的文件,有趣的是,我们看到sentry自动为我们创建了一个端点 ” /api/sentry-example-api “和一个页面” /sentry-example-page”,我们可以访问,并产生一个error。

再查看sentry网站,就能看到错误的详细信息。

实际我们不需要这两个 sentry-example-api 和 sentry-example-page,在提交Git之前删除掉。

提交Git。命名:Set up error tracking。


设置生产数据库

Mysql平台很多,这里选择planetscale.com。作为测试,免费的计划足够了。

需要开通一个账户并绑定信用卡,然后进行创建,数据库名设置issue-tracker,类型是prisma。记下数据库用户名和密码,后面需要配置。


部署到 Vercel

由于Planetscale.com的Mysql不支持外键约束,需要在prisma添加relationMode属性,设置为”prisma”。

原有的迁移有外键约束,需要重新迁移。删除migrations文件夹,再运行:npx prisma migrate dev

提交Git,命名:Change relationMode to prisma.

再同步到Github

登录github,新建Repository命名issue-tracker,并将本地的Git库同步到github。

再登录vercel.com,导入github的项目。

进行相关设置,重写Build Command (prisma generate && prisma migrate deploy && next build)以及设置环境变量,注意其中的DATABASE_URL替换成之前在planetscale创建的数据库。具体可以参见文档。

https://www.prisma.io/docs/guides/deployment/serverless/deploy-to-vercel

设置完成后,点“Deploy”开始部署。因目前vercel的URL尚未生成,暂保持http://localhost:3000,一会儿回来修改。

等待一段时间,部署完成。如果有错误,根据提示进行修复。

部署成功后,修正环境变量设置正确的URL,注意不加斜杠。

再设置正确的Github回调地址。

访问网页,测试功能都正常。


小结

本文将issue-tracker项目部署到vercel,介绍了生产环境的部署过程。

Next.js项目实践系列已完结,希望有帮助到您。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注