在之前的项目中,我们都是使用 npx create-next-app@latest
初始化项目,它是 Next.js 的官方脚手架,提供了开发 Next.js 项目最基础的配置。
然而在实际的开发中,Next.js 通常会搭配多种技术选型一起使用,比如 Tailwind CSS、TypeScript、Prisma、Drizzle、NextAuth.js、tRPC、ESLint、Prettier、Husky、Lint-Staged、Commitlint 等等。
它们解决的问题各不相同,本篇我们就来盘点下 Next.js 项目常搭配的主流技术选型。
根据这样一项数据库统计,常用的数据库是 Postgres、MongoDB、MySQL、Redis。
其中 Redis 常被用作缓存层,MongoDB 是非关系型数据库,MySQL 是老牌的关系型数据库,Postgres 则比较轻量。
其实用哪个数据库都可以,云数据库也很不错,最主要看开发者的熟悉程度和喜好。此外,数据库往往会搭配 ORM 一起使用,即便切换数据库,切换成本也比较低。
根据《实战篇 | React Notes | Prisma》 的介绍,在 Node.js 中,目前使用度和满意度最高的就是 Prisma、Drizzle、Mongoose 了。
在实际的项目开发中,理论上应该选择使用度更高、版本相对稳定的库。简而言之,初学者推荐用 Prisma。如果你用 MongoDB,可以选择 Mongoose。新项目尝鲜可以使用 Drizzle。
关于身份认证有 3 个主流的技术选型:Clerk、 Supabase、Next-Auth
其中 Clerk 和 Supabase 是平台,接入成本低,但免费版有限制。Clerk 更专注于身份验证和用户管理,对应功能更加丰富。Supabase 实现的功能更多,身份验证只是其中之一。Next-auth 不是平台,是一个开源库,可以帮助我们快速实现登录注册等功能。
Next.js 的状态管理参考 React 的状态管理库,其实可用的库特别多。但优先推荐 Zustand。
Zustand 是 2021 年 Star 增长最快的 React 状态管理库,API 设计优雅,业务侵入小,学习成本低,十分推荐。
Next.js 项目实现国际化,目前有三个主流的技术选型:next-i18next、next-intl、next-translate
react-i18next 配置繁琐,但更为灵活自由。next-intl 配置简单,相对限制更多,部分配置无法自定义。
也有一些搭配它们使用的做本地化的平台,比如 Phrase Localization Platform、Lokalise、Crowdin。你可以把它简单的理解为管理翻译文件的平台,可以上传、翻译、下载文件。
Zod 是一个 TypeScript 优先的模式声明和验证库。Next.js 官方文档示例中用到的正是 Zod。
T3 Env,使用 Zod 定义环境变量,可对环境变量进行验证并完成自动补全和类型推断。
React Hook Form (40.1k Star)是一个老牌的用于 React 应用程序的表单验证和状态管理库。它提供了一组钩子,可以轻松地创建和管理表单,而无需编写大量样板代码。
Husky + Prettier + ESLint + Lint-Staged + Commitlint + Commitizen + VSCode 配置 + semantic-release,涉及到的工具有点多,但也算是常见的搭配了。
Husky 用于添加 Git Hooks,ESLint 用于代码校验,Prettier 用于代码美化、Lint-staged 用于在 git 暂存文件上指定 Lint 检查。
Commitlint 用于校验 Git Commit Messge,Commitizen 用于优化提交信息。Commitlint 与 Commitizen 的区别在于 Commitlint 校验提交信息,Commitizen 辅助填写提交信息;在 Git 提交工作流程中,Commitlint 作用于 commit-msg 阶段,Commitizen 作用于 pre-commit。
semantic-release 做自动化 changelog 生成 自动化包的发布工作流程,包括:确定下一个版本号,生成发行说明,以及发布包。
Tailwind CSS 是一个用于构建 Web 项目的 CSS 框架,它提供了一系列预定义的原子CSS类,可以帮助开发人员快速构建 Web 界面,并且可以通过自定义主题和扩展来满足不同的需求。
常搭配组件库 shadcn/ui 一起使用,shadcn/ui 是 2023 年 GitHub Stars 增长最快的 JavaScript 开源项目。
Vitest 是一款JavaScript 的单元测试框架。React Testing Library 是一款用于 React 组件的 DOM Testing Library
Playwright 是一个由 Microsoft 开发的用于浏览器测试和网页抓取的开源自动化库。
Codecov 是一个用于代码覆盖率分析的工具,它可以帮助开发人员了解他们的代码被测试的程度。Codecov 支持多种编程语言,并提供多种功能,例如可视化覆盖率报告、代码审查集成和与其他工具的集成
Storybook 是一个用于开发 UI 组件的开源工具,它允许您创建可交互的组件并将其独立于应用程序进行开发和测试。Storybook 支持多种框架,包括 React、Vue、Angular 等。
简单来说,Storybook 用于可视化查看 UI 组件,组件根据不同的 props 传入形成不同的 “ story”,共同组成了一个 “Storybook”。可用于测试组件、添加组件文档。
Bundler Analyzer 用于分析包依赖关系,参考《实战篇 | 博客 | 性能分析》
Sentry,常见的用于监控错误和性能的解决方案。
Pino 是一个非常快速且简洁的 Node.js 日志库,其设计宗旨在于提供最小的开销以及高性能的日志记录功能。
Better Stack是一个日志管理与分析协作平台,通过将监控、日志记录、事件管理和状态页面整合到一个平台中,为开发人员提供实时协作服务。
如果将这些技术选型从头配置,属实有些慢,业界也有很多现成的模板、CLI、脚手架等可以直接使用。这其中最常用的有:
create-t3-app 是一个交互式的 Cli 用于启动一个全栈、类型安全的 Next.js 应用程序。它专注于简单性、模块化和全栈类型安全。它的技术栈包括 Next.js、tRPC、Tailwind CSS、TypeScript、Prisma、Drizzle、NextAuth.js
Next-js-Boilerplate 是一个 Next.js 项目模板。它的技术栈包括:Next.js + TypeScript + ESLint + Prettier + Husky + Lint-Staged + Jest + Testing Library + Cypress + Storybook + Commitlint + VSCode + Netlify + PostCSS + Tailwind CSS
Blitz 致力于添补 Next.js 缺失的全栈工具,比如类型安全的内容层(RPC)、Authentication、各种预配置(eslint、prettier、husky git hooks 等)、丰富的脚手架用于创建各种技术选型方案。
这个模板涉及的技术栈众多且基本都是主流技术选型,熟悉这个模板,可以帮助大家快速建立起自己的 Next.js 最佳实践模板。
不过这个模板的技术选型也太多了,如果你不喜欢,后面我们还会专门介绍 create-t3-app
使用 Next-js-Boilerplate 模板:
git clone --depth=1 https://github.com/ixartz/Next-js-Boilerplate.git my-project-name
如果出现以下这种错误:
可以改为使用 SSH 地址:
git clone --depth=1 git@github.com:ixartz/Next-js-Boilerplate.git my-project-name
项目运行方式同正常的 Next.js 项目:
# 进入项目目录
cd my-project-name
# 安装
npm install
# 开启开发模式
npm run dev
浏览器效果如下:
简单总结一下这个模板的功能:
总的来说,使用这个模板的好处在于:
最后我们介绍一下如何使用这个模板。因为这个项目涉及的技术栈和平台众多,很多都需要登录到对应的平台上,获取特殊的 key 或者 token 等。所以如果真的要使用这些技术栈的话,还要做一些配置:
在 Clerk.com 创建一个 Clerk 帐户,并在 Clerk Dashboard 中创建新应用程序。然后,将 NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY
和 CLERK_SECRET_KEY
复制到 .env.local
文件中:
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=your_clerk_pub_key
CLERK_SECRET_KEY=your_clerk_secret_key
现在就拥有了一个功能齐全的身份验证系统:注册、登录、注销、忘记密码、重置密码、更新个人资料、更新密码、更新电子邮件、删除帐户等等。
首先,需要在 Turso.tech 创建一个 Turso 帐户并安装 Turso CLI:
brew install tursodatabase/tap/turso
turso auth signup # Sign up to Turso
然后,创建一个新数据库:
turso db create nextjs-boilerplate
再然后,使用 Turso 提供的数据库 URL 更新 .env
文件中的 DATABASE_URL
:
turso db show nextjs-boilerplate --url
# .env
# DATABASE_URL=libsql://[RANDOM-CHARS]-[DB-NAME]-[ORG-NAME].turso.io
最后,还需要使用 Turso 提供的身份验证令牌在 .env.local
中创建一个新的环境变量 DATABASE_AUTH_TOKEN
:
turso db tokens create nextjs-boilerplate
# .env.local
# DATABASE_AUTH_TOKEN=[your-auth-token]
项目搜索 FIXME
可以看到一些需要自定义配置的地方。这是一些需要自定义的最重要的文件:
public/apple-touch-icon.png
、public/favicon.ico
、public/favicon-16x16.png
、public/favicon-32x32.png
: 网站图标,可以从 https://favicon.io/favicon-converter/ 生成src/utils/AppConfig.ts
: 配置文件src/templates/BaseTemplate.tsx
: 默认主题next.config.mjs
: Next.js 配置.env
: 环境变量npm run commit
npm run test
npx playwright install # Only for the first time in a new environment
npm run test:e2e
npm run build
npm run start
具体的配置方案可以在官方文档中查看:https://github.com/ixartz/Next-js-Boilerplate
是不是感觉有些懵逼?怎么突然多了这么多没听说过的平台和工具?没有关系,我们会在后续的篇章中详细介绍。本篇只是作为总览,让大家有个大致的印象和参考。