返回项目目录
服务端框架精选项目

Acorn

Oak 团队打造、内置 Schema 验证的跨运行时 RESTful JSON 服务框架。

主要语言TypeScript
开源许可MIT
项目类型服务端框架
维护状态有限维护
OVERVIEW

项目概述

Acorn 以一个专注的 Router 覆盖 JSON API 的路由、验证、状态响应与日志需求,可运行在 Deno、Node.js、Bun 和 Cloudflare Workers。

这里的 Acorn 指 Oak 团队维护的 RESTful 服务框架,而不是同名的 JavaScript Parser。它围绕 Router 和 Web 标准 Request/Response 构建,目标是用较少样板代码创建 JSON API。Handler 可以直接返回普通对象,由框架序列化为 JSON;也可以返回 Response,或返回 undefined 表示 204。Acorn 内置路径路由、404/405/OPTIONS 行为、HTTP 错误辅助方法、状态处理器、请求生命周期 Hook、LogTape 日志,以及基于 Valibot 的请求与响应 Schema 验证。同一套 API 可运行在 Deno、Node.js、Bun 和 Cloudflare Workers,适合功能边界清晰的小型 REST 服务和跨运行时 API。

当前版本Acorn 1.1.1
运行环境Deno / Node / Bun / Workers
主要用途RESTful JSON API
FEATURES

主要特点

Acorn 将 REST Router、JSON 响应、Schema 验证和常见 HTTP 语义集中在一个小型、跨运行时的 TypeScript 包中。

01

专注 RESTful JSON

框架聚焦 JSON API,不引入模板渲染或完整应用架构,Handler 返回对象即可生成 JSON 响应。

02

内置 Valibot 验证

可为 Body、Query 和 Response 声明 Schema,在数据进入业务逻辑和离开服务前执行运行时验证。

03

完整 Router

支持 GET、POST、PUT、PATCH、DELETE、HEAD、OPTIONS、路径参数和 path-to-regexp 模式。

04

合理的 HTTP 默认值

自动处理 404 Not Found、405 Method Not Allowed 和 OPTIONS,并在 Handler 无返回值时发送 204。

05

REST 响应辅助方法

Context 提供 created、notFound、conflict、redirect 和 throw 等方法,帮助保持状态码、Location 与错误语义一致。

06

跨运行时 Context

Context 统一暴露 Request、URL、参数、环境变量、客户端地址、请求 ID、Cookie 和响应 Header。

07

Hook 与状态处理器

onRequest、onHandled、onNotFound 和 onError 可用于观测生命周期,状态处理器可统一定制特定 HTTP 响应。

08

集成结构化日志

通过 LogTape 配置控制台日志级别和请求记录,无需从零搭建最基本的 Router 可观测性。

USE CASES

适用场景

适合接口以 JSON CRUD 为主、希望内置运行时验证,并且不需要完整 MVC 或复杂依赖注入体系的服务。

小型 CRUD API

资源路由、JSON 序列化、Schema 和 REST 状态辅助方法可快速覆盖标准增删改查接口。

Webhook 接收服务

在边界验证第三方 JSON Payload,通过 Hook 记录请求耗时,并返回明确的成功或错误状态。

边缘 JSON 接口

Router 可直接作为 Cloudflare Worker 导出,适合轻量配置、查询、鉴权或数据转换端点。

跨运行时微服务

主要业务逻辑围绕标准 Request/Response 编写,可在 Deno、Node.js 和 Bun 部署目标之间复用。

内部工具 API

简单 Router 与内置验证适合管理脚本、自动化平台和低流量内部服务,减少基础样板代码。

REST 原型验证

无需先选择庞大的插件体系即可定义路径、Schema 和响应,适合快速验证接口契约。

EVALUATION

优点与注意事项

技术选型不仅要看能力,也要理解它带来的团队成本。

主要优点

Acorn 擅长的地方

  • 定位专一,JSON API 所需的核心概念集中且学习成本较低
  • 请求和响应 Schema 共用 Valibot,可同时保护输入边界与输出契约
  • 普通对象自动序列化,常见 REST Handler 写法简洁
  • 内置 404、405、OPTIONS 和状态辅助方法,减少重复 HTTP 样板
  • 基于 Web 标准 Request/Response,能够覆盖多种 JavaScript Runtime
  • 自带请求 ID、环境访问、生命周期 Hook 和 LogTape 日志入口

需要注意

采用前应考虑的问题

不要与 Acorn Parser 混淆

npm 与搜索结果中的 acorn 通常指 JavaScript 解析器;本项目的包名是 @oak/acorn,仓库位于 oakserver/acorn。

社区和采用规模较小

专用中间件、教程、问答和生产案例明显少于 Express、Fastify 或 Hono,遇到边缘问题可能需要阅读源码。

发布节奏需要评估

当前 JSR 1.1.1 已发布一段时间,新项目应核对仓库活动、依赖状态和安全修复响应是否符合团队要求。

适用范围刻意受限

它聚焦 RESTful JSON,不提供模板、完整 MVC、依赖注入、ORM 或 GraphQL 等体系,复杂应用需要自行组合。

跨运行时能力存在差异

WebSocket Upgrade 当前仅支持 Deno 与 Deno Deploy;Cookie、环境变量和网络信息也应在每个目标 Runtime 实测。

Schema 不能替代业务授权

Valibot 能验证数据形状,但认证、对象级授权、速率限制和数据库约束仍需独立设计。

错误输出需要统一审查

ctx.throw 和 Hook 虽能集中处理异常,生产环境仍应避免把内部堆栈、数据库信息或敏感 Payload 返回客户端。

QUICK START

快速开始

使用 Deno、JSR、Acorn Router 和内置 Valibot Schema 创建可在多个运行时复用的任务 API。

1初始化 Deno 项目
bash
mkdir acorn-tasks
cd acorn-tasks
deno init
deno add jsr:@oak/acorn
2创建带 Schema 的任务 API
typescript
import { Router, Status, v } from "@oak/acorn";

const CreateTask = v.object({
  title: v.string(),
});

const Task = v.object({
  id: v.string(),
  title: v.string(),
  completed: v.boolean(),
});

const tasks = new Map<string, {
  id: string;
  title: string;
  completed: boolean;
}>();

export const router = new Router({ logger: true });

router.get("/health", () => ({ status: "ok" }));

router.get("/tasks/:id", (ctx) => {
  const task = tasks.get(ctx.params.id);
  if (!task) {
    ctx.throw(Status.NotFound, "Task not found");
  }
  return task;
}, {
  schema: { response: Task },
});

router.post("/tasks", async (ctx) => {
  const input = await ctx.body();
  const task = {
    id: crypto.randomUUID(),
    title: input.title.trim(),
    completed: false,
  };

  if (!task.title || task.title.length > 120) {
    ctx.throw(Status.UnprocessableEntity, "Invalid title");
  }

  tasks.set(task.id, task);
  return ctx.created(task, {
    location: `/tasks/${task.id}`,
  });
}, {
  schema: {
    body: CreateTask,
    response: Task,
  },
});
3统一 404 JSON 响应
typescript
import { Status } from "@oak/acorn";
import { router } from "./router.ts";

router.on(Status.NotFound, () => {
  return Response.json(
    {
      error: "Not Found",
      status: Status.NotFound,
    },
    {
      status: Status.NotFound,
    },
  );
});
4启动 Deno、Node.js 或 Bun 服务
typescript
import { router } from "./router.ts";

await router.listen({
  hostname: "127.0.0.1",
  port: 3000,
});
5导出为 Cloudflare Worker
typescript
import { Router } from "@oak/acorn";

const router = new Router();

router.get("/health", () => ({
  status: "ok",
  runtime: "cloudflare-workers",
}));

export default router;

下一步:Acorn 与著名的 JavaScript 解析器同名,搜索依赖和文档时应使用完整包名 @oak/acorn;生产采用前还应评估其维护节奏、社区规模和目标运行时兼容性。

ALTERNATIVES

类似项目

这些框架同样用于 TypeScript API、轻量 Router 或跨运行时服务,但在生态规模、扩展模型和默认能力上有所不同。

COMPARISON

Acorn vs Oak

Acorn 与 Oak 由同一团队维护并共享跨运行时方向,但抽象层级不同。Acorn 专注结构化 RESTful JSON API,并内置 Valibot Schema;Oak 是更通用的中间件框架,可处理页面、静态文件、流式响应和自定义 Web 栈。

比较维度AcornOak
核心定位专注 RESTful JSON 服务的 Router通用 HTTP Application 与中间件框架
处理模型路由 Handler 返回对象或 ResponseApplication 中组合 async 洋葱中间件
Schema 验证内置 Valibot Body、Query、Response Schema不绑定验证库,由应用自行组合
默认 HTTP 行为内置 404、405、OPTIONS 与 REST 辅助方法Router 与中间件提供更通用的响应控制
响应类型主要面向 JSON、Response 与 204HTML、JSON、文件、Stream、SSE 等更广
扩展机制Route、Hook、Status Handler 与 SchemaMiddleware、Context、Router 与应用状态
运行环境Deno、Node.js、Bun、Cloudflare WorkersDeno、Node.js、Bun、Cloudflare Workers
更适合小型契约化 REST API 与边缘 JSON 接口定制 Web 栈、页面与多种响应类型
如何选择

如果服务几乎全部是 JSON CRUD,并希望 Router 直接提供 Schema、状态码和 REST 辅助方法,Acorn 的范围更聚焦;如果需要中间件编排、HTML、静态文件、复杂响应或更自由的请求生命周期,Oak 更合适。由于 Acorn 的社区和更新频率较低,生产选型还应与 Hono、Fastify 等活跃框架一起评估。

VERIFICATION

资料核验

版本、维护信息与本页采用的官方资料来源。

最后核验2026 年 7 月 26 日
核验版本官方当前稳定版与文档主线
内容维护Docs100 编辑整理
项目维护状态有限维护

本次核验覆盖 Acorn 的核心定位、主要能力、官方入口与开源许可。项目版本持续更新,具体补丁版本、兼容性和迁移要求请在采用前继续核对官方发布记录。

维护状态核验2026 年 7 月 26 日 · 最近可见代码活动:2024 年 11 月 11 日

官方仓库未归档,但核验时最近可见的代码活动停留在 2024 年 11 月 11 日,且未发现近期正式发布。采用前应进一步确认维护响应、依赖兼容性和替代方案。

查看官方仓库