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 可通过网络面板观察分块响应与内容到达顺序。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部