欢迎来到 Remix
export async function loader({ request }) {
return getProjects();
}
export async function action({ request }) {
const form = await request.formData();
return createProject({
title: form.get("title"),
});
}
export default function Projects() {
const projects = useLoaderData();
const { state } = useNavigation();
const busy = state === "submitting";
return (
<div>
{projects.map((project) => (
<Link to={project.slug}>
{project.title}
</Link>
))}
<Form method="post">
<input name="title" />
<button type="submit" disabled={busy}>
{busy
? "Creating..."
: "Create New Project"}
</button>
</Form>
</div>
);
}
用户评价
当你在 等待你的静态网站构建时, 分布式网络 基础设施变得非常好了。 突破静态。
Remix 是一个无缝的服务器和浏览器运行时,它通过利用分布式系统和原生浏览器功能而不是笨重的静态构建来提供快速的页面加载和即时过渡。它基于 Web Fetch API(而不是 Node)构建,可以在任何地方运行。它已经可以在 Cloudflare Workers 上原生运行,并且当然支持无服务器和传统的 Node.js 环境,因此你可以按你现有的方式使用它。
页面速度只是我们真正目标的一个方面。我们追求的是 更好的用户体验。随着你不断突破 Web 的边界,你的工具并没有跟上你的需求。 Remix 已经准备好从初始请求到你的设计师能想到的最炫酷的 UX 为你服务。看看吧 👀
Remix 有一个作弊码
嵌套路由。
网站通常具有控制子视图的导航级别。
这些组件不仅几乎总是与 URL 段耦合...
...它们也是数据加载和代码拆分的分界线。
加载状态怎么样?
大多数 Web 应用在组件内部进行数据获取,从而产生 请求瀑布、加载缓慢和 卡顿。
Remix 在服务器上并行加载数据,并发送一个完全形成的 HTML 文档。 更快,无卡顿。
预取一切
Remix 可以在用户点击链接之前并行预取所有内容。
公共数据。用户数据。模块。甚至 CSS。
零加载状态。零骨架 UI。零卡顿。
好吧,你抓到我们了,它们只是预取链接标签,#使用平台
数据加载
你有没有注意到你应用中的大多数代码都是用来 更改数据的?
想象一下,如果 React 只有 props 而没有设置状态的方法。那有什么意义?如果一个 Web 框架可以帮助你加载数据,但不能帮助你更新数据,那有什么意义?Remix 不会在 <form onSubmit>
悬崖边把你丢下。 (event.preventDefault
到底有什么作用?)
它太简单了,有点傻。只需创建一个表单...
...以及路由模块上的一个 action。它看起来像传统的 HTML 表单,但可以实现你想要的完全动态的 Web 体验。
Remix 在服务器端运行 action,在客户端重新验证数据,甚至可以处理重新提交导致的竞争条件。
使用过渡钩子变得花哨,并创建一些待处理的 UI。Remix 处理所有状态,你只需请求它即可。
或者使用一些乐观 UI 来活跃一下。Remix 提供了发送到服务器的数据,因此你也可以跳过突变的繁忙旋转器。
用于突变的 HTML 表单。谁会想到呢?
export default function NewInvoice() {
return (
<Form method="post">
<input type="text" name="company" />
<input type="text" name="amount" />
<button type="submit">Create</button>
</Form>
);
}
export async function action({ request }) {
const body = await request.formData();
const invoice = await createInvoice(body);
return redirect(`/invoices/${invoice.id}`);
}
错误处理
路由错误边界 保持快乐路径的快乐。
每个路由模块都可以在默认路由组件旁边导出一个错误边界。
如果抛出错误,无论是客户端还是服务器端,用户都会看到边界而不是默认组件。
没有问题的路由会正常渲染,因此用户有比强制刷新更多的选择。
如果路由没有边界,则错误会向上冒泡。只需在顶部放置一个,然后在代码审查中放松一下对错误的担忧,好吗?