2025 年构建类型安全应用程序的完美堆栈

2025-05-25

2025 年构建类型安全应用程序的完美堆栈

试图在 2025 年挑选出最好的技术堆栈非常困难,尤其是在所有新框架发布的情况下。

这不仅仅是类型安全的问题。你还需要良好的性能、可扩展性、开发者体验 (DX) 和良好的社区,这样你才不会陷入困境。

今天,我们将了解为什么 Next.js(前端)和 Encore.ts(后端)可能是现代开发人员的最佳全栈组合。

让我们开始吧。


涵盖哪些内容?

简而言之,我们正在详细介绍这些主题。

  1. 为什么这个技术栈是一个可靠的选择。
  2. 有关如何开始使用 Next.js 和 Encore 的分步指南。
  3. 一些带有源代码的真实示例。

注意:Encore 是一个支持 TypeScript 和 Go 的开源后端框架。在本指南中,当我提到 Encore 时,指的是 TypeScript 版本 (Encore.ts)。


1. 为什么这个技术栈是一个可靠的选择。

有大量令人惊叹的技术堆栈,其中一些确实令人印象深刻。

据我所知,将 Next.js 作为前端,将 Encore.ts 作为后端配对是一个成功的组合。

如果您是新手,Encore 是一个后端框架和工具集,带有 Rust 运行时、API 验证、集成基础设施、开发人员仪表板等。

我们将通过五个主要因素来审视这个堆栈:

  • 类型安全
  • 表现
  • 开发者体验(DX)
  • 可扩展性
  • 额外福利

⚡ 类型安全

无论何时构建生产级应用程序,最好都是类型安全的(即使没有它也可以工作)。

Encore 内置了类型验证功能,并且完全以声明式的方式完成,能够自动解析和验证传入的请求。它确保请求与架构匹配,无需任何样板代码。

简而言之,它在到达 JavaScript 层之前就对内容进行验证。

Next.js(使用 TypeScript)和 Encore.ts 均强制执行静态类型检查,从而减少运行时错误并使代码更易于重构。Encore.ts 采用模式优先的方法,确保 API 契约保持一致。

类型安全的应用程序

Encore 还可以使您的基础设施能够感知类型,并且无需连接字符串或其他样板。

基础设施

⚡ 性能

Next.js:借助服务器端渲染(SSR)、静态站点生成(SSG)、自动代码拆分、图像优化、延迟加载、脚本优化、缓存、无服务器功能、链接优化等内置功能……(以及更多),可以肯定地说,在选择 Next.js 作为前端时,性能并不是一个需要考虑的因素。

Turing有一篇关于优化 Next.js 构建性能的非常好的博客。

Encore.ts:它拥有非常高性能的 Rust 运行时,请求吞吐量比 Express.js 高出 9 倍,比 Fastify 高出 2 倍。它通过在 Rust 中提供多线程来实现这一点,并使用 Rust 而非 JavaScript 处理许多操作(例如请求验证)。

根据GitHub 上的基准代码就冷启动时间而言,Encore.ts 比 Express 快 5 倍以上,比 NestJS 快 17 倍。

安可性能基准

⚡ 开发者体验

Next.js:它有一个不错的文件系统,内置功能如路由、自动代码分割、热模块替换和丰富的插件生态系统,这使得 DX 变得更好。

Encore.ts:DX 是 Encore 的强项之一,具有内置可观察性(分布式跟踪、指标、日志记录)、本地仪表板、自动架构图(用于实时概览)、API Explorer(用于测试 API 端点)、DevOps 自动化和减少样板。

开发者体验

此外,部署应用程序也变得更加容易,只需推送到 git 存储库即可,无需手动步骤。

部署

⚡ 可扩展性

Next.js:它支持动态路由和不同的渲染技术,如服务器端渲染(SSR)、静态站点生成(SSG)、增量静态再生(ISR),使其适用于大型、高流量的 Web 应用程序。

我阅读更多相关内容并发现了一篇有趣的文章,关于如何为你的 Next.js 项目构建可扩展架构

Encore.ts:通过统一您的基础设施和应用程序代码并自动化基础设施配置和 DevOps 任务,它改进了大规模微服务应用程序的开发。

这是一个代码示例。

import { SQLDatabase } from "encore.dev/storage/sqldb";

// Create the todo database and assign it to the "db" variable
const db = new SQLDatabase("todo", {
  migrations: "./migrations",
});

// Then, query the database using db.query, db.exec, etc.
Enter fullscreen mode Exit fullscreen mode

它还提供了一个称为的可视化工具,Flow可让您始终了解整个系统的最新视图,帮助您推理微服务架构并确定哪些服务相互依赖以及它们如何协同工作。

安可流可视化工具

Encore.tscloud-agnostic默认启用,这意味着它提供了一个基于云提供商 API 的抽象层prevent vendor lock-in。随着需求的变化,您可以调整已配置的基础架构,而无需更改应用程序代码。这真的非常有用!

⚡ 额外福利

Next.js:详尽的文档和活跃的社区支持是众多开发者青睐 Next.js 的原因。它还提供丰富的插件、教程和资源。您可以查看Awesome Next.js,它在 GitHub 上拥有超过 1 万颗星。

Encore.ts:Encore 为您打造云基础架构和 DevOps。这使得开发人员能够使用微服务、Postgres 和 Pub/Sub 等工具快速创建可用于生产的后端,而无需面对常见的复杂性和 DevOps 麻烦。

再来工作

 

您可以做更多令人惊奇的事情,所以请查看Next.js 文档Encore.ts 文档

如果您对 Encore 还很陌生,我强烈建议您观看这个官方教程。


2. 有关如何开始使用 Next.js 和 Encore 的分步指南。

在本节中,我们将讨论如何开始使用 Next.js 和 Encore.ts。

根据官方文档,您可以使用入门模板快速完成设置。我遵循了相同的模板,如果您感兴趣,可以查看一下。

encore.ts next.js 模板

步骤 1:安装 Encore CLI

要使用 Encore 进行本地开发,首先需要安装 Encore CLI。它会配置您的本地开发环境,并运行包含日志、跟踪和 API 文档的本地开发仪表盘。

您可以使用以下任意命令(按顺序为 Linux、Windows、macOS)。

curl -L https://encore.dev/install.sh | bash
iwr https://encore.dev/install.ps1 | iex
brew install encoredev/tap/encore
Enter fullscreen mode Exit fullscreen mode

encore cli 已安装

他们还提供了ts_llm_instructions.txt 文件,这是一组预先编写的说明,旨在帮助 Cursor 和 GitHub Copilot 等 LLM 工具理解如何使用 Encore。每当我在使用 Cursor 时遇到疑问时,它都能帮我轻松很多。

第 2 步:克隆 repo 并创建一个新的应用程序。

首先,使用以下命令克隆模板存储库。

git clone --depth=1 https://github.com/encoredev/nextjs-starter.git
Enter fullscreen mode Exit fullscreen mode

然后,导航到后端目录,安装依赖项并创建一个新的 Encore 应用程序。

cd nextjs-starter/backend 
npm install # Install dependencies 
encore app init # Create a new Encore application.
Enter fullscreen mode Exit fullscreen mode

在设置过程中,系统会提示您注册一个免费的云帐户。它是完全免费的,所以我建议您注册。您还需要选择一个版本,在本指南中,我选择了 TypeScript。

云部署

确保backend directory在运行之前切换到encore app init。我最初忘记了,所以我不得不再做一次。

安可应用程序初始化

设置完成后,您将获得Application IDCloud Dashboard URL。请记下这些,因为您稍后会需要它们。

步骤 3:运行您的 Encore 应用程序。

现在,您需要backend directory使用命令在内部启动您的 encore 应用程序encore run

再来一次

前往frontend/package.json并将其替换 {{ENCORE_APP_ID}} 为您的实际 Encore 应用程序 ID。您也可以在 中找到此 ID encore.app

"gen": "encore gen client {{ENCORE_APP_ID}} --output=./app/lib/client.ts --env=local"
Enter fullscreen mode Exit fullscreen mode

步骤4:生成新的请求客户端

导航到frontend目录,打开一个新的终端窗口并使用此命令生成一个新的请求客户端。

npm run gen # Inside the frontend directory
Enter fullscreen mode Exit fullscreen mode

运行此命令将为您的应用程序在 ( ) 处生成请求客户端frontend/app/lib/client.ts。这将启用前端和后端之间的通信。

在继续操作之前,请确保 Encore 应用正在backend目录中运行。如果没有,您可以使用 重新启动它encore run。现在,像往常一样运行 Next.js 前端。

cd frontend 
npm install 
npm run dev
Enter fullscreen mode Exit fullscreen mode

一旦运行,在浏览器中打开http://localhost:3000即可查看应用程序的运行情况。

再来一次前端 nextjs

同样,您可以访问http://localhost:9400查看 Encore 的本地开发者仪表板。在这里,您可以看到、 、API ExplorerService Catalog可视化工具)等。InfraFlowSnippets

安可本地开发仪表板

当地基础设施

当地基础设施

 

本地仪表板在开始时有小型演示,因此您肯定不会遇到困难。

每当您对 Encore 端点进行更改时,请确保通过重新生成请求客户端来保持后端和前端之间的契约同步。

可以通过运行来完成npm run gen

步骤 5:使用 Encore Cloud 部署后端。

我假设你有一个包含代码更改的 GitHub 存储库。

在 Encore  Cloud Dashboard中打开您的应用程序。

安可云

转到您的应用程序设置并将 设置Root Directory为 backend。这是因为该encore.app 文件位于后端目录中。

后端

在集成中,将您的帐户连接到 GitHub,这将打开 GitHub,您可以在其中授予对相关存储库的访问权限。

一旦连接到 GitHub,推送代码将自动触发部署。

将应用程序链接到 GitHub

将您的应用链接到 GitHub

将您的应用链接到 GitHub

 

您可以在文档中阅读有关使用 Encore Cloud 部署应用程序的更多信息。

确认消息

确认消息

 

您可以在云端仪表板中跟踪部署进度。完成后,您的应用将在云端上线!🎉

成功部署

云部署

第 6 步:使用 Vercel 部署前端。

我们将使用 Vercel 进行前端部署。只需在 Vercel 上创建一个新项目并将其指向你的 GitHub 仓库即可。

在项目设置中,将根目录设置为frontend

在 vercel 中选择前端作为根目录

一旦部署完毕,您的前端就应该上线了!

已部署的前端

处理 CORS 问题

我们也来谈谈吧CORS configuration

如果您在从前端调用 Encore API 时遇到 CORS(跨域资源共享)问题,则可能需要指定哪些来源被允许访问您的 API(通过浏览器)。

您可以通过配置 文件global_cors 中的密钥 来执行此操作encore.app ,该文件具有以下结构:

global_cors: {
  // allow_origins_without_credentials specifies the allowed origins for requests
  // that don't include credentials. If nil it defaults to allowing all domains
  // (equivalent to ["*"]).
  "allow_origins_without_credentials": [
    "<ORIGIN-GOES-HERE>"
  ],

  // allow_origins_with_credentials specifies the allowed origins for requests
  // that include credentials. If a request is made from an Origin in this list
  // Encore responds with Access-Control-Allow-Origin: <Origin>.
  //
  // The URLs in this list may include wildcards (e.g. "https://*.example.com"
  // or "https://*-myapp.example.com").
  "allow_origins_with_credentials": [
    "<DOMAIN-GOES-HERE>"
  ]
}
Enter fullscreen mode Exit fullscreen mode

您可以阅读文档以获取有关 CORS 配置的更多信息。

在下一部分中,我们将提供一些可以使用此技术栈构建的应用程序的示例。


3. 带有源代码的用例和示例。

我们可以使用 Encore 和 Next.js 构建许多创新应用,接下来让我们来探索其中几个佼佼者。前三个应用提供了源代码,后两个只是一些可供参考的示例。

构建正常运行时间监视器

您可以构建一个正常运行时间监控系统,当您的网站出现故障时通知您,以便您可以在用户注意到之前修复它。

该应用程序将使用事件驱动架构,最终结果将如下所示。

正常运行时间监控器

这是自动生成的后端架构图,其中白框表示服务,黑框表示 Pub/Sub 主题。

后端架构图

您可以检查GitHub 存储库

 

URL缩短器

REST API您可以使用和构建 URL 缩短器PostgreSQL database。它还将帮助您了解如何使用 Encore 创建 REST API 并在本地测试您的应用。

简而言之,您需要实现/url用于缩短 URL 的端点,以便使用randomBytes唯一 ID 进行 URL 的缩短。您需要设置一个 PostgreSQL 数据库,并创建一个迁移文件来存储原始 URL 和缩短后的 URL。然后,您需要修改 API,以便在 URL 缩短后将数据插入数据库。

接下来,添加一个端点,通过使用短 ID 查询数据库来检索原始 URL。使用本地开发仪表板测试 API,并添加一个/url列表端点来获取所有存储的 URL。

您可以检查GitHub 存储库

 

LLM 聊天室

需要明确的是,您不需要前端部分,但这是提高您对 Encore 的了解的好方法。

您可以创建一个聊天应用程序,将大型语言模型 (LLM)(例如 OpenAI 的 GPT 和 Anthropic 的 Claude)与 Slack 和 Discord 等聊天平台集成在一起。它可以帮助您构建具有独特个性的 AI 机器人,并与用户互动。

聊天机器人

这是一个基于微服务的应用程序,每个服务负责处理聊天机器人生态系统的一个特定方面。这些服务结合使用 Encore API、发布/订阅消息传递和 WebSocket 通信来协调聊天平台和 LLM 提供商之间的消息流。

系统设计

系统设计

 

您可以检查GitHub 存储库

 

✅ AI 博客生成器

博客写作助手可根据用户输入生成文章,并允许编辑和发布。

技术栈:

  • Next.js使用 Tiptap 或 Lexical 等编辑器来实现前端 UI。
  • Encore.ts用于后端 API 处理文本生成请求。
  • OpenAI API (GPT-4)用于生成文章草稿。
  • Resend当文章准备好时通过电子邮件通知。
  • Supabase用于存储草稿和已发布的文章。

示例流程:

  • 用户输入一个主题,AI 就会生成草稿。
  • 他们在应用程序内编辑、完善和发布。
  • 准备就绪后将发送电子邮件通知。

 

✅ Notion 风格的协作应用程序

一个简单的类似 Notion 的应用程序,用于笔记和任务的实时协作。

技术栈

  • Next.js 带有 WebSockets 以实现实时更新。
  • Encore.ts 后端使用 Redis 进行实时数据同步。
  • PostgreSQL 用于持久数据存储。
  • Clerk/Auth.js 用于身份验证。
  • UploadThing 用于文件存储(用于将图像添加到笔记中)。

示例流程

  • 用户创建和共享工作区。
  • 使用 WebSockets 跨设备实时同步。
  • 访问控制确保只有授权用户才能编辑。

 

这些应该足以帮助您入门。

如果您正在寻找真正好的速成课程,您可以参考这个视频!


老实说,没有任何技术栈是完美的,但 Encore 和 Next.js 绝对是构建全栈应用程序的最佳和推荐方法之一。

如果您还有其他想法,请告诉我。

祝你今天过得愉快!下次再见 :)

你可以在anmolbaranwal.com
查看 我的作品 感谢阅读!🥰
叽叽喳喳 GitHub 领英

结尾挥手告别的 GIF

文章来源:https://dev.to/anmolbaranwal/the-perfect-stack-for-building-type-safe-applications-in-2025-k62
PREV
我为什么要学习 TypeScript
NEXT
如何以 10 倍速度进行软件测试