介绍
Void 是运行在 Cloudflare Workers 之上、由 Vite 驱动的全栈框架。用 React、Vue、Svelte 或 Solid 构建界面,在同一个项目里编写服务端代码。
预计阅读 3 分钟
先从快速开始创建并部署一个应用;如果你已经在使用某个元框架,请阅读框架集成。
服务端路由与页面
文件即路由。routes/api/users.ts 中的处理器提供 /api/users,pages/users/index.tsx 中的组件渲染 /users。
每个页面都可以有一个配套的 .server.ts 文件。它的 loader 读取数据并把带类型的 props 返回给组件,它的 actions 处理表单与其他变更,然后更新页面。服务端代码始终留在服务端;组件首次在服务端渲染,随后在浏览器中运行以完成导航与交互。
用页面路由构建全栈 UI,或者保留你自己的客户端路由,用类型化 fetch调用服务端路由。你也可以完全不写前端,只构建一个 API。
// GET|POST /api/users
import { defineHandler } from 'void';
import { db } from 'void/db';
import { users } from '@schema';
export const GET = defineHandler(() => db.select().from(users));
export const POST = defineHandler.withValidator({ body: insertUserSchema })(async (c, { body }) => {
const [created] = await db.insert(users).values(body).returning();
return created;
});
资源来自你的代码
从 void/db 导入 db 即可查询数据库。开发时 Void 会提供一个本地数据库,部署时会为你开通一个真实资源。同样的导入方式还能启用 KV、对象存储、队列等资源;当需要连接已有资源时,使用配置。
你的 Drizzle schema 定义了数据库类型。处理器推断出响应类型,类型化 fetch 会检查它们的调用方。页面 loader 与 action 把同样的类型带进组件与表单。改动一个字段,TypeScript 就会告诉你应用的哪些部分需要跟着改。
import { fetch } from 'void/client';
const users = await fetch('/api/users');
// ^ { id: number; name: string; email: string }[]
从本地开发到生产
Vite 使用 Cloudflare 的运行时在本地运行你的应用。void deploy 会构建应用、开通资源、执行数据库迁移,并发布它。环境变量使用 schema、本地值与生产密钥来管理。
你可以部署到自己的 Cloudflare 账户,也可以连接到由团队运维的 Void 平台。两者使用完全相同的应用 API,平台额外提供共享访问控制、部署历史与后台管理。
Void 也能部署已有的框架与静态站点:框架保留自己的路由与渲染,Void 负责资源与部署。