熟悉的全栈应用模型
以 Vercel Next.js 应用模型为参照,提供 layout、page、route handler、middleware、redirects、rewrites 和 headers 等能力。
Text.js 是 Rue 生态中的全栈应用框架。它基于 Vite、Rue、RSC 与文件系统路由,把 App Router、Pages Router、SSR、API 路由和 Workers 部署整合成一条轻量开发路径。 设计上参考 Vercel 的 Next.js,并基于 Cloudflare 的 vinext 与 Workers 运行时继续演进。
// app/page.tsx
export default function Page() {
return <main>Hello Text.js</main>
}
// package.json
{
"scripts": {
"dev": "text dev",
"build": "text build",
"start": "text start",
"deploy": "text deploy"
}
}同时覆盖 App Router 与 Pages Router,适合渐进迁移。
自动接入 Rue JSX / TSX、Vite 插件与开发服务器。
通过 text deploy 输出 Cloudflare Workers 应用。
Text.js 不是从零发明一套全栈约定,而是把 Vercel Next.js 的应用框架经验、Cloudflare vinext 的 Vite-first / Workers 部署路径,与 Rue 的 JSX / TSX 运行时组合到同一套工具链里。
参考 vinext 的 Vite-first 思路,Text.js 把熟悉的文件系统约定放到 Rue 运行时之上。保留简单组件开发体验,同时补齐服务端、路由和部署层。
以 Vercel Next.js 应用模型为参照,提供 layout、page、route handler、middleware、redirects、rewrites 和 headers 等能力。
页面和组件继续使用 Rue 的响应式能力与 JSX 表达方式,Text.js 负责路由、渲染、构建编排和部署适配。
支持 React Server Components 风格的服务端组件工作流,并为 SSR、静态生成与客户端交互保留统一入口。
内置 text/navigation、text/link、text/image、text/headers、text/cache 等 shim,降低生态适配成本。
从页面到接口都沿用 app 目录约定,动态参数和 route handler 放在同一套图谱里。
// app/blog/[slug]/page.tsx
export default function BlogPage({ params }: { params: { slug: string } }) {
return <article>{params.slug}</article>
}
// app/api/hello/route.ts
export function GET() {
return Response.json({ message: 'Hello from Text.js' })
}text 命令负责开发、构建、检查、类型生成和 Cloudflare Workers 部署。
text dev # 启动开发服务器
text build # 构建生产产物
text start # 启动生产服务器
text preview # text start 的别名
text deploy # 部署到 Cloudflare Workers
text typegen # 生成 App Router 路由类型
text lint # 调用项目中的 eslint / oxlint
text init # 初始化部署相关配置
text check # 检查 Text.js 兼容性仓库内提供了 SSR 博客和静态导出两个 demo,用同一套 App Router 约定覆盖服务端渲染、API 路由、客户端交互、动态路由预渲染和纯静态文件交付。
一个 App Router 博客示例,首页与文章页走服务端渲染,同时包含 /api/posts route handler、客户端主题筛选和本地点赞组件。
pnpm --dir examples/text-blog-ssr dev
pnpm --dir examples/text-blog-ssr build
pnpm --dir examples/text-blog-ssr start// examples/text-blog-ssr/app/page.tsx
import TopicFilter from '../components/TopicFilter'
import { getTags, getTopics, posts } from '../lib/posts'
export default function HomePage() {
const renderedAt = new Date().toLocaleTimeString('en-US', {
hour: '2-digit',
minute: '2-digit',
second: '2-digit',
})
return (
<main>
<section className="intro">
<p className="eyebrow">Server-rendered demo</p>
<h1>A small blog running on Text.js</h1>
<a href="/blog/rendering-notes">Read the featured post</a>
<a href="/blog">Browse all posts</a>
<a href="/api/posts">View API response</a>
<span>Rendered at {renderedAt}</span>
</section>
<TopicFilter posts={posts} topics={getTopics()} tags={getTags()} />
</main>
)
}
// examples/text-blog-ssr/app/api/posts/route.ts
export function GET() {
return Response.json({ count: posts.length, posts })
}一个知识库静态导出示例,通过 output: "export" 在 text build 时预渲染全部路由,包括动态 guide 页面。
pnpm --dir examples/text-static-export dev
pnpm --dir examples/text-static-export build
pnpm --dir examples/text-static-export start// examples/text-static-export/text.config.mjs
export default {
output: 'export',
}
// examples/text-static-export/app/guides/[slug]/page.tsx
export function generateStaticParams() {
return guides.map(guide => ({ slug: guide.slug }))
}
export default async function GuidePage({ params }) {
const guide = getGuide((await params).slug)
if (!guide) notFound()
return (
<main className="narrow">
<Link href="/">Back home</Link>
<h1>{guide.title}</h1>
<ol>{guide.steps.map(step => <li key={step}>{step}</li>)}</ol>
</main>
)
}安装 @rue-js/text 后,创建 app/page.tsx 即可启动。多数项目不需要手动维护 Vite 配置,Text.js 会自动组织 Rue 插件与应用路由。