Next.js
React
Server Actions
Fullstack
Web Development

Next.js 15 和服务器操作:现代突变的权威指南

Next.js 15 和服务器操作:现代突变的权威指南

[网络开发43不断变化。曾经有一段时间,所有内容都在服务器上呈现(PHP、Ruby on Rails)。然后,我们将所有内容移至客户端(带有 React、Vue 的 SPA)。现在,随着 React Server Components (RSC)Next.js App Router 的出现,我们找到了一个强大的中间立场:两全其美。

React 生态系统新时代的皇冠上的宝石是服务器操作

随着 Next.js 15 的发布,服务器操作不再是实验性的,而是已成为处理数据突变的推荐标准。在这份庞大的指南中,我们将探讨此功能的每一个细节,从基础知识到高级安全性和用户体验标准。如果您仍在编写 8 来处理表单,请准备好淘汰大量样板代码。

服务器操作到底是什么?

简而言之,服务器操作是在服务器上运行的异步函数,但可以直接从客户端或服务器组件调用。

以前,提交表单的流程是:

  1. 在客户端创建表单组件(9)。
  2. 为输入创建10状态。
  3. 创建一个执行 12 的函数11。
  4. 创建 API 路由文件 (13) 以接收请求、验证并将其保存在数据库中。
  5. 手动处理错误、加载状态和数据重新验证。

使用服务器操作,流程为:

  1. 创建一个保存在银行中的函数14。
  2. 将此函数传递给16的支柱15。

结尾。 Next.js 负责通信、序列化和执行。它是专为 Web 完成的远程过程调用 (RPC)

Next.js 中的初始配置 15

在 Next.js 15 中,服务器操作已默认启用。您无需更改17。

约定很简单:

  • 要定义可导入客户端组件的操作,请创建一个顶部带有 "use server" 指令的文件。
  • 对于服务器组件中的内联操作,请在函数内添加 19 。

基本示例:动作的“Hello World”

让我们创建一个操作来保存博客文章。创建 20 文件:

0

在你的组件中:

1

请注意,客户端上没有用于提交的 JavaScript。 即使用户在浏览器中禁用 JS(渐进增强),此表单也能正常工作,尽管在现代应用程序中我们很少依赖于此。

充电状态管理 (21)

糟糕的用户体验是点击“保存”却没有得到反馈。由于我们使用的是原生 HTML 属性 22,因此我们没有23 手册。 React 为我们提供了 24 钩子。

注意: 25 必须用在 26 内渲染的组件中。

2

现在只需在上一个示例的表单中使用 27 即可。

错误处理和反馈 (28)

如果[数据库44失败怎么办?还是验证?简单地抛出一个错误(29)并不是最好的用户体验。我们希望将错误消息返回到表单。

为此,我们使用钩子 30(以前在实验性 React 中为31)。它允许服务器操作返回在客户端上更新的值。

重构我们的行动:

3

在客户端组件中:

4

缓存重新验证:32 的力量

在旧模型中,突变后,您必须手动重新获取数据或使用 React Query 或 SWR 等库来使缓存失效。

在 Next.js 中,这是内置的。函数33清除该特定路由的缓存。在下次访问时(或立即访问,如果是 SPA 导航),Next.js 会从服务器获取最新数据。 还有34,如果您使用带 (35) 标签的 fetch,它可以为您提供精细控制。

乐观更新 (36)

对于看起来“即时”的应用程序,我们不想等待服务器响应来更新 UI。如果我将一个项目添加到列表中,我想现在就在那里看到它。

挂钩37以一种优雅的方式实现了这一点。

5

如果服务器操作失败,React 会自动将乐观状态回滚到之前的真实状态。它坚固而神奇。

安全:房间里的大象

许多开发人员看着 38 并想:“等等,我是否将我的[数据库 45] 暴露给客户端?”

不会。 服务器操作代码永远不会发送到浏览器。仅公开函数的“签名”(内部 Next.js 参考 URL)。然而,将服务器操作视为API 的公共入口点至关重要。

强制性安全检查表:

  1. 身份验证:始终检查谁在调用该操作。不要仅仅因为“保存”按钮可见就假设用户已登录。 6

  2. 授权:用户已经登录,但是他可以*删除这个帖子吗? 7

  3. 输入验证:永远不要相信39或传递的参数。使用 Zod 确保数据格式正确。

服务器操作与 API 路由

毕竟,API 路由已经死了吗?

不完全是,但其使用量已大幅减少。

在以下情况下使用服务器操作

  • 你正在处理形式突变。
  • 您想要从客户端上的事件调用服务器函数 (40)。
  • 您想要 [TypeScript46 端到端输入而不生成 SDK。

在以下情况下使用 API 路由(路由处理程序)

  • 您需要向第三方(webhooks、移动应用程序)公开公共 [REST API47 ]。
  • 您需要 React 抽象隐藏的 HTTP 协议的特定功能(例如流式自定义二进制文件、复杂标头)。

结论

Next.js 15 巩固了服务器操作作为近期 Web 开发中最富有成效的变化之一。它们消除了中间层的“粘合代码”(API 路由、获取器、状态管理器),让您能够专注于重要的事情:业务逻辑和用户界面。

通过将服务器操作与 41、42 以及验证与 Zod 相结合,您可以创建具有世界一流用户体验的强大、安全的应用程序,而编写的代码仅为 3 年前编写的代码的一小部分。

未来是服务器端,但体验是客户端。服务器操作是它们之间的桥梁。


您是否已将表单迁移到服务器操作?最大的挑战是什么?留下您的评论!

另请阅读

  • [Next.js 中的服务器操作:无需为此维护 API 的突变49
  • [Next.js App Router:默认思考服务器指南50
  • [Next.js 中的缓存和流式传输:性能成为架构决策51
  • [2025 年 React 和 Next.js 的国际化最佳实践(i18n)52
  • [什么是 React 服务器组件以及为什么逻辑要回归服务器53
  • [使用 Strapi 和 Next.js 构建自定义 Headless CMS54