Next.js 与 Encore.ts — 什么时候不应该将 Next.js 用于后端?
在本文中,我将比较 Next.js 和 Encore。我将向您展示它们的区别以及它们如何相互补充。如果您有一个 Next.js 应用程序并想扩展该应用程序的后端功能,那么本文适合您!
:使用 Next.js 和 Encore.ts 的代码示例:https://github.com/encoredev/examples/tree/main/ts/nextjs-starter
Encore.ts 与 Next.js
Encore 是一个开源框架,旨在让构建强大且类型安全的后端变得更加容易。该框架适用于 TypeScript 和 Go(本文中我将重点介绍 TypeScript 版本的 Encore.ts),并且它拥有大量内置工具,可在构建从小型到大型后端的所有内容时让开发体验更加顺畅。
与 Next 一样,Encore 也是完全开源的。您可以在 GitHub 上阅读代码、对其进行分叉或为其做出贡献。在构建应用程序时,您可以将其托管在任何您想要的地方(使用 Docker 映像,例如 Digital Ocean),而无需任何隐藏成本或迫在眉睫的配额。性能方面,与其他 Node.js 和 Bun 框架(包括 Next.js)相比,Encore 速度极快。在此基准测试中,我们测量了公共 API 端点上的每秒请求数。

Encore 如此之快的原因在于 Encore 在底层使用了 Rust,如果您有兴趣了解更多信息,请查看本文:Encore.ts — 比 Express.js 快 9 倍,比 ElysiaJS 和 Hono 快 3 倍
比较
那么,Encore.ts 和 Next.js 相比如何呢?我喜欢这样描述:

因此,我们传统上将后端和前端分开。后端部分更大,因为这是我们感兴趣的部分。这里的后端也是一个范围,从功能丰富到轻量级。我知道,我知道……这有点二维(字面意思),但请继续听我说。
Next.js
在这个范围内,我会将 Next.js 定位为包含所有前端方面和一小部分后端范围。前端方面已涵盖,您可以执行从静态站点渲染到服务器端组件的所有操作。如果您愿意,甚至可以在 Next 中构建单页应用程序。Next 主要是一个前端框架,它提供的后端功能是为了使前端方面更好。Next 非常棒,对于很多用例来说,它将满足您的一切需求,我使用 Next.js 多年,并且一直对它印象深刻。
但是…… Next 的后端方面是有限的。有些事情你根本做不到,有些事情即使你能做也不应该做。我正在考虑以下事情:
与最后一点相关的是,在 Next.js 中创建的 API 是无状态的。这不一定是坏事,但根据你正在构建的应用程序类型,它可能成为一种限制。
对于无状态应用程序,您的 API 处理程序在 lambda 函数中运行,这些函数在发送响应后会终止,因此您实际上无法响应用户,然后继续在后台处理数据。对于有状态应用程序,您可以做到这一点。同样,这并不意味着无状态/无服务器不好,但 Next 会强迫您走上一条特定的路线。

对于无状态应用程序,您的 API 处理程序在 lambda 函数中运行,这些函数在发送响应后会终止,因此您实际上无法响应用户,然后继续在后台处理数据。对于有状态应用程序,您可以做到这一点。同样,这并不意味着无状态/无服务器不好,但 Next 会强迫您走上一条特定的路线。
安可
另一方面,Encore.ts 纯粹是一个后端框架。它从头开始构建,可扩展,无论您的应用程序或团队有多大。
将 Next.js 与 Encore.ts 结合使用
那么为什么不将 Next 与 Encore 一起使用呢?好吧,你应该这样做!使用 Encore,你可以生成可供 Next.js 应用使用的类型安全请求客户端。如果你熟悉它,你可以将它想象成 tRPC 客户端。
我们喜欢将 Next 与 Encore 结合使用,encore.dev 就是一个例子。我们使用静态站点生成来生成文档,以保持其快速而敏捷。但我们保持 Next.js 应用的后端层非常薄,并在生成静态 props 时从 Encore 应用获取 markdown 文件。这样,我们可以将更繁重的工作(例如生成文档搜索索引)留在 Encore 应用中。
代码示例
在我们的示例仓库中查看使用 Next.js 和 Encore.ts 的完整代码示例:https://github.com/encoredev/examples/tree/main/ts/nextjs-starter
安装 Encore
克隆示例应用程序
encore app create --example=ts/nextjs-starter
生成请求客户端
每当您进行更改时,通过重新生成请求客户端来保持后端和前端之间的契约同步
到 Encore 端点。
encore gen client --output=./app/client.ts --env=local
部署
自托管
请参阅自托管说明,了解如何使用“encore build docker”创建 Docker 映像并对其进行配置。
Encore 云平台
使用“git push encore”将您的应用程序部署到 Encore 开发云中的免费暂存环境中(如果您运行“encore app create”来创建您的应用程序,则此方法有效):
git add -A . git commit -m 'Commit message' git push encore
您还可以在云仪表板中打开您的应用程序以与 GitHub 集成,或连接您的 AWS/GCP 帐户,让 Encore 自动为您处理云部署。
Vercel 上的 Next.js
您唯一需要做的就是在 Vercel 上创建一个新项目并将其指向您新创建的 GitHup 存储库。
结论
就这样!谢谢阅读。
在 GitHub 上为 Encore repo 点赞,以便跟踪更新,这也会对我们有所帮助。
在下面发布您的问题或加入 Encore Discord 社区。