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 端点上的每秒请求数。

benchmark chart

Encore 如此之快的原因在于 Encore 在底层使用了 Rust,如果您有兴趣了解更多信息,请查看本文:Encore.ts — 比 Express.js 快 9 倍,比 ElysiaJS 和 Hono 快 3 倍

比较

那么,Encore.ts 和 Next.js 相比如何呢?我喜欢这样描述:

next.js compared to encore.ts

因此,我们传统上将后端和前端分开。后端部分更大,因为这是我们感兴趣的部分。这里的后端也是一个范围,从功能丰富到轻量级。我知道,我知道……这有点二维(字面意思),但请继续听我说。

Next.js

在这个范围内,我会将 Next.js 定位为包含所有前端方面和一小部分后端范围。前端方面已涵盖,您可以执行从静态站点渲染到服务器端组件的所有操作。如果您愿意,甚至可以在 Next 中构建单页应用程序。Next 主要是一个前端框架,它提供的后端功能是为了使前端方面更好。Next 非常棒,对于很多用例来说,它将满足您的一切需求,我使用 Next.js 多年,并且一直对它印象深刻。

但是…… Next 的后端方面是有限的。有些事情你根本做不到,有些事情即使你能做也不应该做。我正在考虑以下事情:

  • 您希望拥有多个前端(例如移动应用程序和网页),但想要一个后端。
  • 您想向消费者提供公共 API。
  • Node.js 的单线程特性可能成为性能瓶颈(虽然不是 Next.js 的问题,但仍然是)。
  • 如果您需要长时间运行且具有后台处理的作业,那么 Next 并不是一个好选择。
  • 与最后一点相关的是,在 Next.js 中创建的 API 是无状态的。这不一定是坏事,但根据你正在构建的应用程序类型,它可能成为一种限制。

    对于无状态应用程序,您的 API 处理程序在 lambda 函数中运行,这些函数在发送响应后会终止,因此您实际上无法响应用户,然后继续在后台处理数据。对于有状态应用程序,您可以做到这一点。同样,这并不意味着无状态/无服务器不好,但 Next 会强迫您走上一条特定的路线。

    stateless vs stateful applications

    对于无状态应用程序,您的 API 处理程序在 lambda 函数中运行,这些函数在发送响应后会终止,因此您实际上无法响应用户,然后继续在后台处理数据。对于有状态应用程序,您可以做到这一点。同样,这并不意味着无状态/无服务器不好,但 Next 会强迫您走上一条特定的路线。

    安可

    另一方面,Encore.ts 纯粹是一个后端框架。它从头开始构建,可扩展,无论您的应用程序或团队有多大。

  • Encore.ts 使得在本地设置基础设施变得非常容易,因此无论应用程序的大小,您始终能够通过在终端中运行 encore run 来启动整个应用程序。
  • 将应用程序划分为多个可单独扩展的服务
  • 创建事件驱动系统,以类型安全的方式通过 Pub/Sub 来服务社区
  • Encore.ts 有一个 Rust 运行时,因此您可以获得编写 Typescript 的开发人员体验,但由于 Encore 的多线程运行时,性能得到极大提升。
  • 在后台运行长时间运行的任务或 CronJobs。
  • 使用跟踪检查 API 调用(内置且适用于您的本地环境)。
  • 将 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

  • macOS: brew install encoredev/tap/encore
  • Linux: curl -L https://encore.dev/install.sh | bash
  • Windows:iwr https://encore.dev/install.ps1 |埃克斯
  • 克隆示例应用程序

    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 社区。

    相关文章

    Node.js 框架综述 2024 — Elysia / Hono / Nest / Encore — 您应该选择哪一个?Simon Johansson 为 Encore 撰写 ・ 11 月 1 日 #node #typescript #javascript #webdev构建和部署 TypeScript 微服务到 Kubernetes Marcus Kohlberg for Encore ・ 12 月 17 日 #javascript #typescript #kubernetes #tutorial使用 Pub/Sub 构建简单的事件驱动应用程序 Marcus Kohlberg for Encore ・ 11 月 19 日 #javascript #webdev #typescript #node