🧭 新一代 Next.js App Router 下的 Route Handlers —— 从原理到优雅实践

当年人类第一次造船时,造了一块木板就下水了,淹得不成人样。后来我们发现,要想在海上浪迹天涯,需要 船体、舵、地图 。前端路由的发展何尝不是如此:从最初的 SPA 里疯狂监听 hashchange,到 React Router 一点点织网,直到 2023 年 Next.js App Router 带着服务器组件和 Route Handlers,从"前端小船"变成了"全栈巨舰"。

今天我们来聊聊其中颇有哲学意味的部分:Route Handlers

一句话总结:它让你在 app/ 目录下,写一份文件,就可以直接处理 HTTP 请求。相当于内置了 后端 API


🌍 Route Handlers 的基本定位

在旧版 Next.js (Pages Router) 下,想写接口要建 pages/api/*

新版 App Router 更像是一本精装书:所有内容都归档在 /app 下,页面、布局、接口,都是同一棵树的不同叶子。

👉 你只需要在某个文件夹下建一个 route.js 文件(或 route.ts),即可定义 HTTP 方法。

这意味着,Next.js 在同一个运行时里扮演了两种角色:

  • React 渲染器:负责搬运客户看到的 HTML
  • 轻量服务器:直接拦截和处理请求

这种双重身份,很像莎士比亚演员一会儿是王子,一会儿是弄臣。🎭


📝 基本写法:GET & POST

GET Handler

创建文件:app/api/hello/route.js

javascript 复制代码
export async function GET(request) {
  return new Response(
    JSON.stringify({ message: 'Hello Next.js 🌐' }),
    {
      status: 200,
      headers: { 'Content-Type': 'application/json' }
    }
  )
}

解释

  • GET 方法就是一个导出的函数
  • 它的参数是 request(标准的 Web API Request 对象)
  • 返回值用 Response ------ 这不是 Express 的 res,而是 Fetch 标准里的 Response

也就是说:Next.js 底层是基于 WHATWG Fetch 标准 ,而不是绑死在 req/res 上。这放在 2010 年代的前端圈,就好像突然有人掏出了一把激光剑


POST Handler

创建文件:app/api/echo/route.js

javascript 复制代码
export async function POST(request) {
  const body = await request.json()
  return new Response(
    JSON.stringify({ you_said: body }),
    {
      status: 200,
      headers: { 'Content-Type': 'application/json' }
    }
  )
}

解释

  • request.json() 直接解析 body
  • 不需要额外安装 body-parser,也不用担心 Buffer 数据拼接
  • Next.js 直接调用 Node.js 的流接口并转化成 Fetch Request,对开发者完全透明

从思想角度说,这是一种"抽象复用":既可以跑在 Node.js,也能跑在 Edge Runtime。换句话说,写一次,跑遍天涯。🌍


⚙️ 底层原理一点点(保证不会无聊)

Route Handlers 之所以能运行,是因为 Next.js 在构建时,会将 app/**/route.js 文件编译为特殊的 middleware entry

  1. 当请求匹配 http://localhost:3000/api/hello
  2. Server runtime 查路由树,发现有个 route.js
  3. 调用里面导出的 GETPOST
  4. 填装返回值到标准 Fetch Response,再返回客户端

底层其实就是 Node.js 的 http.createServer 收到请求后的一层分发逻辑,只不过进行了标准化包装。

这个标准化让我们离浏览器 API 更近,离 "裸 Node.js 回调" 更远。就像你骑自行车已经够累了,这时 Next.js 给了你一辆自动平衡的电动小摩托 🛵。


🎨 幽默示意图

虽然我没办法直接贴图,这里用 ASCII 小图标形象描述下:

vbscript 复制代码
          🌐 Request
              │
              ▼
      +-----------------+
      | Next.js Router  |
      +-----------------+
         │          │
         ▼          ▼
     页面渲染     Route Handlers
                   │
                   ▼
             JSON / Response

你可以想象 App Router 是总驯兽师,页面和接口是两只听话的猴子 🐒,各司其职。


📜 总结

  • Route Handlers 是 App Router 下的重要进化:把前后端接口统一到一棵路由树结构
  • 写法极简:直接导出 GETPOSTPUT 等函数
  • 底层基于 Fetch 标准,与浏览器 API 接口对齐
  • 优势:无额外依赖、天然支持 Edge Runtime、逻辑清晰

✍️ 留个小作业

如果你今天学会了 GET/POST 的写法,可以试着写一个:

  • GET 返回当前时间戳
  • POST 模拟一个 "留言接口" 把 body 里内容回传

你会发现,Next.js 不再只是你心中的前端框架,而变成了一个"可以写后端接口的全栈剧场"。🎭

相关推荐
bitbitDown3 小时前
忍了一年多,我终于对i18n下手了
前端·javascript·架构
JarvanMo3 小时前
我尝试了Appwrite, Supabase和 Firebase Databases
前端·后端
Hilaku3 小时前
前端的单元测试,大部分都是在自欺欺人
前端·javascript·单元测试
用户47949283569153 小时前
一道原型链面试题引发的血案:为什么90%的人都答错了
前端·javascript·面试
Lotzinfly3 小时前
10个React性能优化奇淫技巧你需要掌握😏😏😏
前端·react.js·面试
一枚前端小能手3 小时前
🔥 字符串处理又踩坑了?JavaScript字符串方法全攻略,这些技巧让你效率翻倍
前端·javascript
windliang3 小时前
一文入门 agent:从理论到代码实战
前端·算法
4z333 小时前
Jetpack Compose重组原理(一):快照系统如何精准追踪状态变化
前端·android jetpack
三十_3 小时前
私有 npm 仓库实践:Verdaccio 保姆级搭建教程与最佳实践
前端·npm