Remix 2 流式 SSR 与数据路由最佳实践概述Remix 2 强化了数据路由与流式 SSR,允许在路由级统一声明数据获取与提交逻辑,配合 `defer` 实现首屏与异步数据的分层到达,显著降低 TTFB 与阻塞。核心能力1. 路由级数据获取与提交// app/routes/users.tsx
import { json, defer } from '@remix-run/node'
import { useLoaderData, Await, Form, useActionData } from '@remix-run/react'
export async function loader() {
const head = await fetch('https://api.example.com/users?limit=10').then(r => r.json())
const tail = fetch('https://api.example.com/users?cursor=next').then(r => r.json())
return defer({ head, tail })
}
export async function action({ request }: { request: Request }) {
const form = await request.formData()
const name = String(form.get('name') ?? '')
if (!name) return json({ ok: false, error: 'name required' }, { status: 400 })
return json({ ok: true })
}
export default function Users() {
const data = useLoaderData<typeof loader>()
const result = useActionData<typeof action>()
return (
<div>
<ul>
{data.head.map((u: any) => <li key={u.id}>{u.name}</li>)}
</ul>
<React.Suspense fallback={<p>Loading more…</p>}>
<Await resolve={data.tail} children={(items: any[]) => (
<ul>
{items.map((u: any) => <li key={u.id}>{u.name}</li>)}
</ul>
)} />
</React.Suspense>
<Form method="post">
<input name="name" />
<button type="submit">Create</button>
</Form>
{result && !result.ok && <p role="alert">{result.error}</p>}
</div>
)
}
要点:`loader`/`action` 将数据获取与表单提交集中到路由层;`defer` 通过流式传输延后部分数据。
2. 边缘运行与适配Remix 可部署到支持 Web 标准的边缘平台,保持 `Request/Response` 一致性,减少延迟。业务逻辑建议避免 Node 专有模块以提升可移植性。性能优化实践分层数据:首屏关键数据同步返回,次要数据由 `defer` 异步流式到达。路由整洁:依赖路由边界的缓存与错误处理,保持组件内容纯粹。提交校验:在 `action` 内完成表单校验与标准 JSON 响应,减少前端胶水代码。验证要点示例使用稳定官方 API,可在本地与边缘平台一致运行。流式 SSR 可通过网络面板观察分块响应与内容到达顺序。

发表评论 取消回复