我把 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 ?谢谢。

相关推荐
大明者省1 小时前
AI 在课程思政的 10 大应用:从资源挖掘到效果升华
前端·人工智能·easyui
_何同学4 小时前
Ollama 安装 DeepSeek 与 Spring Boot 集成指南
java·spring boot·后端·ai
饺子大魔王的男人5 小时前
【Three.js】机器人管线包模拟
javascript·机器人
知否技术5 小时前
知道这10个npm工具包,开发效率提高好几倍!第2个大家都用过!
前端·npm
希希不嘻嘻~傻希希6 小时前
CSS 字体与文本样式笔记
开发语言·前端·javascript·css·ecmascript
盖世英雄酱581366 小时前
时间设置的是23点59分59秒,数据库却存的是第二天00:00:00
java·数据库·后端
石小石Orz6 小时前
分享10个吊炸天的油猴脚本,2025最新!
前端
爷_7 小时前
Nest.js 最佳实践:异步上下文(Context)实现自动填充
前端·javascript·后端
爱上妖精的尾巴7 小时前
3-19 WPS JS宏调用工作表函数(JS 宏与工作表函数双剑合壁)学习笔记
服务器·前端·javascript·wps·js宏·jsa
追逐时光者7 小时前
提高 .NET 编程效率的 Visual Studio 使用技巧和建议!
后端·.net·visual studio