欢迎使用 Remix

专注于 Web 标准现代 Web 应用 用户体验,你将能够 构建更优秀的网站

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 确实做到了更多。它证明了我们不需要牺牲 React 或选择 SSG 就能获得闪电般的速度、可访问的 UI,并且开发体验让这一切变得轻而易举🤤

当你还在 等待 静态网站构建时, 分布式 Web 基础设施变得越来越强大。 突破静态的局限。

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

然而,页面速度只是我们真正目标的一个方面。我们追求的是 更好的用户体验。随着你不断突破 Web 的界限,你的工具却跟不上你的需求。 Remix 已准备就绪,可以为你服务,从最初的请求到你的设计师能够想到的最花哨的用户体验。快来体验一下 👀

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 天内到期
广阔的...
$4,600
1998
8 天内到期
Stankonia
$8,000
今天到期• 2000 年 10 月 31 日开具发票
专业版
$6,000
自定义
$2,000
净额
$8,000

加载状态呢?

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

大多数 Web 应用在组件内部获取数据,从而创建 请求瀑布,导致加载速度变慢和 卡顿

Remix 在服务器端并行加载数据,并发送一个完整格式的 HTML 文档。 速度更快,无卡顿。

预取一切

嵌套路由允许 Remix 使你的应用 速度快如闪电。

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

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

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

好吧,你抓到我们了,它们只是预取链接标签,#useThePlatform

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到底有什么作用?)

弹性且渐进增强的 数据更新 已内置。

它非常简单,几乎有点愚蠢。只需创建一个表单...

...并在路由模块上添加一个操作。它看起来像传统的 HTML 表单,但能够提供你想要的完全动态的 Web 体验。

Remix 在服务器端运行操作,在客户端重新验证数据,甚至处理重新提交导致的竞争条件。

使用过渡钩子并创建一些加载 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 天内到期
广阔的...
$4,600
1998
8 天内到期
Stankonia
$8,000
今天到期• 2000 年 10 月 31 日开具发票
专业版
$6,000
自定义
$2,000
净额
$8,000
糟糕!
加载此发票时出现问题。
现在这些信息应该足够了。你还在等什么?