🧭 新一代 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 不再只是你心中的前端框架,而变成了一个"可以写后端接口的全栈剧场"。🎭

相关推荐
WeiXiao_Hyy27 分钟前
成为 Top 1% 的工程师
java·开发语言·javascript·经验分享·后端
吃杠碰小鸡44 分钟前
高中数学-数列-导数证明
前端·数学·算法
kingwebo'sZone1 小时前
C#使用Aspose.Words把 word转成图片
前端·c#·word
xjt_09011 小时前
基于 Vue 3 构建企业级 Web Components 组件库
前端·javascript·vue.js
我是伪码农1 小时前
Vue 2.3
前端·javascript·vue.js
夜郎king2 小时前
HTML5 SVG 实现日出日落动画与实时天气可视化
前端·html5·svg 日出日落
辰风沐阳2 小时前
JavaScript 的宏任务和微任务
javascript
夏幻灵3 小时前
HTML5里最常用的十大标签
前端·html·html5
冰暮流星3 小时前
javascript之二重循环练习
开发语言·javascript·数据库
Mr Xu_3 小时前
Vue 3 中 watch 的使用详解:监听响应式数据变化的利器
前端·javascript·vue.js