Remix 开发小技巧(五)

本文探讨了在Remix应用中使用类型安全Fetcher钩子实现RPC,包括资源路由、Zod验证、自定义提取器和暗模式主题切换,以提升用户体验。同时介绍了如何通过Cookie和matchMediaAPI处理用户首选配色方案的动态切换。

类型安全的 Fetcher 钩子

RPC 是一种远程过程调用,这是一种奇特的说法,表示“在服务器上运行的函数”。

他们现在正在经历一个鼎盛时期,gRPC、tRPC 和 Next.js Server Actions 等工具越来越受欢迎,并重新激发了对该模式的兴趣。

但我不建议将它们与 Remix 一起使用。

Remix 的工作方式与典型的 Web 框架略有不同。它的设计重点是渐进式增强和利用浏览器的强大功能。

通过使用 RPC 库,您将远离这些好处。

例如,不能使用 tRPC 路由器生成与基本 HTML 表单兼容的 Endpoints。

在 Next.js 服务器操作宣布之前,Next 框架从未真正承认数据突变是一回事。由于没有内置的支持,tRPC 非常适合该利基市场,两者成为开发的绝佳组合。

通过在编写 Remix 应用程序的方式中采用一些新习惯,您可以在不牺牲 Remix 优势的情况下获得 RPC 的好处。

一切从资源路由开始

Remix 源于 React Router,路由是它所说的语言。Remix 应用是通过创建路由来获取数据、处理突变、提供文件、呈现页面等来构建的。

在单个文件中,任何页面都可以通过指定操作函数成为 POST 端点。

export async function action({
   
    request }: ActionArgs) {
   
   
  const body = await request.formData()
  const title = body.get("title")
  if (!title) {
   
   
    throw new Response("Title is required", {
   
    status: 400 })
  }
  const description = body.get("description")
  const item = db.create({
   
   
    title: title.toString(),
    description: description?.toString(),
  })
  return json(item, {
   
    status: 201 })
}

或者,它可以通过指定加载程序函数成为 GET 终结点。

export async function loader({
   
    params }: LoaderArgs) {
   
   
  const item = db.get(params.id)
  if (item) {
   
   
    return json(item, {
   
    status: 200 })
  }
  throw new Response("Not found", {
   
    status: 404 })
}

这些函数的终结点 URL 是根据文件路径自动生成的。要调用这些函数,任何组件都需要知道它要调用的资源路由的 URL,然后它可以向该 URL 发出请求。

下面是一些以编程方式调用上一个 POST 终结点的客户端代码。

const body = new FormData()
body.append("title", title)
body.append("description", description)
const response = await fetch("/items", {
   
   
  method: "POST",
  body,
})

由于几个原因,这并不完全理想

  • URL 是硬编码的,因此如果 URL 发生更改,您必须在使用它的所
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Willin 老王躺平不摆烂

感谢你这么好看还这么慷慨

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值