我把 NextJS 的 App Router 搬到了 Server 端,写一个后端框架有多简单

Hello

大家好,我是 anuoua ,自从很久以前写了前端框架 Unis 后,很长一段时间觉得啥都不感兴趣,期间做了 NextJS 的项目,突然对全栈框架产生了兴趣, NextJS 是真的好用,其中一点是 App Router 模式下的项目组织方式,特别优雅。

于是萌生了一些小想法。。

对 App Router 动手

首先, App Router 是可以用在 Vue React 等所有的前端框架的,同时 NextJS 是全栈框架,那么它也适用后端。

转念一想,那么 App Router 不就可以单独抽离出来么,那不就有事干了?打开 Github 创建仓库,输入 app-route (带r名字被占了), 创建。

Github: app-route

点个 start 再走。

app-route 简介

本质上这个包其实很简单

解析指定目录输出目录树结构,同时在解析每个树节点的时候可以自定义解析 当前目录下的资源,比如一些特殊文件路径、元数据等,也就拥有了适配前端、后端的能力,自己写 resolve 就行。

提供路由匹配方法,参考 NextJS App Router 的方式进行路由匹配,匹配结果为匹配到的目录节点路由参数

那么有了这两个功能,就可以想干什么就干什么了。

我要一个 App Router 的后端框架

在使用 NextJS 的时候,我一直在想,要是后端可以用 App Router 多爽。NextJS 身为全栈框架本身支持后端,但是它不合适。

  1. 它太重了,包含了太多不需要的功能,性能也不行。
  2. 它的中间件设计很弱,无法支持嵌套目录的多中间件,大大降低了使用欲望。

怎么办?自己写!

下一代 JS Runtime Server 框架

很多人可能不知道,NodeJS 的那套 Http Server API 已经过时了,现在是 Fetch API 的时代!

也许有人有疑问,fetch 和服务端有什么关系?

在这里需要介绍一下 Fetch API 两个重要的类 Request 和 Response,我猜你用了这么久的 fetch 应该已经察觉,前后端 Request 和 Response 是可以同构的。

javascript 复制代码
// client
const response = fetch(new Request(...));

// server
const app.use((request) => {
    return new Response(...)
})

前后端都处理一样的 req 和 res,不觉得很优雅么?

事实上,现在新出的 JS Server 框架,很多都是直接支持 Fetch API 标准的,比如 hono.js,而新出的 JS runtime 可以直接使用 Fetch API 标准的 Server API,比如 Bun 比如 Deno

用他们写一个服务非常简单

javascript 复制代码
import { serve } from "bun";

serve({
  fetch: (request) => new Response("hello world"),
  port: 8080,
});

看到 fetch 方法没有,用这个写 API 很容易,而且在 Response 加持下操作返回数据的能力变强了很多,在 ts 类型加持下,开发体验非常不错。原生 Node 的 res 则很难用。

刚才说道 NodeJS 不支持这套 Server API,怎么办?这么好用的 API,当然是兼容咯,@hono/node-server 这个包提供了兼容层,感谢 hono.js。

App Router Server 框架的设计

app-route 有了,API 也确定使用 Fetch API,那么似乎只剩下一套 koa 一样的洋葱圈中间件的设施了吧。

没错,如果了解 koa 的话,那么我们可以很容易写出一个 compose 方法,搭配 app-route 包,我们可以很快的实现框架原型,具体可以看源码哦,很简单的。

如下目录结构,使用 app-route 的时候,需要解析出每个目录中的功能文件的路径,放入目录节点中,供框架处理,简单介绍一下单个目录内的一些文件。

  • GET.ts、POST.ts ...: 路由对应请求方法
  • handler.ts: 统一处理请求或者兜底处理
  • middleware.ts: 中间件

用一个例子解释一下这个框架的玩法,现在有如下文件系统目录

bash 复制代码
app
├── middleware.ts #1
└── roles
    ├── middleware.ts #2
    └── [id]
        ├── GET.ts
        └── middleware.ts #3

启动 Server,浏览器访问 GET /roles/xx 的时候,中间件执行的顺序为

csharp 复制代码
request #1
  request #2
    request #3
      get
    response #3
  response #2
response #1

框架本身实现很简单,总共100多行就搞定了(不包含 app-route ),功能已经挺完善的了,写一堆中间件就可以上战场了。

这类框架其实对 Serverless 服务比较友好,比如 vercel 等,我觉得真的很好用。

Fanl 登场

说了这么久,框架叫啥都不知道吧,这个框架就叫做 fanl。大概是第一个这么做的后端框架吧??!哈哈

Github fanl

都看了,还不点个 start ?谢谢。

相关推荐
UXbot1 分钟前
企业AI开发工具:界面自动生成与前端代码交付能力详解
前端·人工智能·交互·web app·ui设计
专业技术员!!!!2 分钟前
陪玩系统前端核心功能详解|线上线下陪玩平台开发方案
前端·陪玩系统·电竞陪玩
英俊潇洒美少年2 分钟前
前端主流状态管理全家桶:Vuex/Pinia/Redux/Zustand/MobX 从入门到原理、实战、面试全解
前端·面试·职场和发展
染翰4 分钟前
Linux root用户安装配置Git
linux·git·后端
JiaWen技术圈11 分钟前
next.js 开发中的水合(Hydration)问题
javascript
Maddie_Mo12 分钟前
Pi Agent Web 使用教程:把本地 Pi Coding Agent 搬进浏览器
android·java·前端·人工智能·ai
正在走向自律30 分钟前
金仓数据库DISTINCT优化:从全表扫描到LIMIT 1的蜕变
后端
小马爱打代码32 分钟前
Spring源码 第十二篇:Spring 全套核心原理 - 完结终章
java·后端·spring
西安邮电大学1 小时前
2026华为OD机考真题附答案-准备生日礼物
java·后端
Python私教1 小时前
从主题闪烁到 Markdown 阅读体验:RuyiBlog v0.1.1 的前端实现复盘
前端·状态模式