欢迎来到 Remix

专注于 Web 标准现代 Web 应用 UX,你将会 构建更好的网站

Remix 是一个全栈 Web 框架,让你可以专注于用户界面,并通过 Web 标准来提供快速、流畅且具有弹性的用户体验。用户将会喜欢你的作品。

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>
  );
}

用户评价

Twitter Logo
Jenna Smith,
Radix UI
我一直在等待能在 React 领域鼓励渐进增强的东西 *很久了*,而 Remix 确实远不止于此。它证明了我们不需要为了闪电般快速、可访问的 UI 而牺牲 React 或选择 SSG,而且 DX 也让一切变得太容易了 🤤

当你在 等待你的静态网站构建时, 分布式网络 基础设施变得非常好了。 突破静态。

Remix 是一个无缝的服务器和浏览器运行时,它通过利用分布式系统和原生浏览器功能而不是笨重的静态构建来提供快速的页面加载和即时过渡。它基于 Web Fetch API(而不是 Node)构建,可以在任何地方运行。它已经可以在 Cloudflare Workers 上原生运行,并且当然支持无服务器和传统的 Node.js 环境,因此你可以按你现有的方式使用它。

页面速度只是我们真正目标的一个方面。我们追求的是 更好的用户体验。随着你不断突破 Web 的边界,你的工具并没有跟上你的需求。 Remix 已经准备好从初始请求到你的设计师能想到的最炫酷的 UX 为你服务。看看吧 👀

Remix 有一个作弊码
嵌套路由。

网站通常具有控制子视图的导航级别。

这些组件不仅几乎总是与 URL 段耦合...

...它们也是数据加载和代码拆分的分界线。

example.com/sales/invoices/102000
Fakebooks
仪表盘
账户
销售
费用
报告
销售
概览
订阅
发票
客户
存款
逾期
$10,800
即将到期
$62,000
发票列表
圣莫妮卡
$10,800
1995
逾期
Stankonia
$8,000
2000
今天到期
海洋大道
$9,500
2003
已付款
Tubthumper
$14,000
1997
10 天后到期
Wide Open Sp...
$4,600
1998
8 天后到期
Stankonia
$8,000
今天到期• 开票日期:2000/10/31
专业计划
$6,000
自定义
$2,000
净总额
$8,000

加载状态怎么样?

通过嵌套路由,Remix 几乎可以消除 所有的加载状态。

大多数 Web 应用在组件内部进行数据获取,从而产生 请求瀑布、加载缓慢和 卡顿

Remix 在服务器上并行加载数据,并发送一个完全形成的 HTML 文档。 更快,无卡顿。

预取一切

嵌套路由使 Remix 可以让你的应用 快如闪电。

Remix 可以在用户点击链接之前并行预取所有内容。

公共数据。用户数据。模块。甚至 CSS。

零加载状态。零骨架 UI。零卡顿。

好吧,你抓到我们了,它们只是预取链接标签,#使用平台

example.com/dashboard
Fakebooks
仪表盘
账户
销售
费用
报告
仪表盘
最近活动
警报
消息
新发票
客户
Stankonia
净总额
$8,000
新发票
客户
海洋大道
净总额
$9,500
sales.js
sales/nav.json
invoices.js
invoice.js
invoice/{id}.json
invoice.css

数据加载

你有没有注意到你应用中的大多数代码都是用来 更改数据的?

想象一下,如果 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}`);
}

错误处理

你的网站会遇到问题,但使用 Remix,它们不需要刷新。错误处理很难记住,也很难实现。这就是为什么它是内置的。
Remix 处理服务器渲染期间的错误。客户端渲染期间的错误。甚至在你的服务器端数据处理中出现的错误。

路由错误边界 保持快乐路径的快乐。

每个路由模块都可以在默认路由组件旁边导出一个错误边界。

如果抛出错误,无论是客户端还是服务器端,用户都会看到边界而不是默认组件。

没有问题的路由会正常渲染,因此用户有比强制刷新更多的选择。

如果路由没有边界,则错误会向上冒泡。只需在顶部放置一个,然后在代码审查中放松一下对错误的担忧,好吗?

example.com/sales/invoices/102000
Fakebooks
仪表盘
账户
销售
费用
报告
销售
概览
订阅
发票
客户
存款
逾期
$10,800
即将到期
$62,000
发票列表
圣莫妮卡
$10,800
1995
逾期
Stankonia
$8,000
2000
今天到期
海洋大道
$9,500
2003
已付款
Tubthumper
$14,000
1997
10 天后到期
Wide Open Sp...
$4,600
1998
8 天后到期
Stankonia
$8,000
今天到期• 开票日期:2000/10/31
专业计划
$6,000
自定义
$2,000
净总额
$8,000
哎呀!
加载此发票时出现问题
现在可能足够了。你还在等什么?