react父组件获取服务端数据_译 | 什么是React服务端组件?

f814290ff4c710ff69e91bc3a7a3c95b.png

在2020年底,React团队分享给我们即将更新的新特性,称之为React 服务端组件(React Server Components)。目前这个特性仍然在研究和开发,还不会马上投入到生产中,但我们仍然可以提前玩耍起来,你可以在这里找到他们分享的演讲和案例。

React 服务端组件是执行在服务端的一个普通的React组件(会有一些限制,比如,他们不能使用stateeffects),它解决的痛点是尝试着去改善服务端组件的性能和优化数据的抓取。

你可能会问这个和服务端渲染(SSR)有什么区别?实际上它们是相互补充的。SSR生成HTML,但是我们仍然需要下载所有的Javascript代码。服务端组件使用不同的格式,这种格式会被随即转换成HTML。这种格式允许我们重新抓取我们的的组件。客户端组件的状态(常规组件)会在重新获取时保留。

关于性能

几乎每个React应用都会使用一些第三方的包,导致最后打包的尺寸增加,还会降低应用的性能。当然通过一些方法可以改善这些客户端问题:我们可以在内部引入这些第三方包的一部分,或者我们自己造轮子实现对应的功能,但这会花费很多时间。

服务端组件允许我们在服务端引入第三方库,不增加我们应用的打包大小。所以我们可以认为服务端组件是一个零大小打包组件(Zero-Bundle-Size Components)。无交互组件和只渲染静态内容的组件可以容易的迁移到服务端。

关于数据获取

另一个好处是服务端组件可以完全访问后端。我们都知道,端的设计并不总是以UI为中心,我们必须在客户端做一些额外的处理。使用服务端组件我们可以把复杂的逻辑放到服务端(也可以通过后端访问的方式去减少),让我们的客户端更干净。

我们能提到很多其他好处,类似于自动的代码分割,UX的改善等等。但是我推荐你读一下RFC详解。现在让我们看一个例子,更好的理解这些组件是如何工作的。

在开始之前..

这里会介绍两个除了服务端组件之外的新概念。我们常规React组件被称为客户端组件,但也不妨碍我们如何定义它。一些组件不使用state、effects或者后端的资源,他们只是转化一些数据,我们称它们为共享组件。

按照惯例我们会有个后缀去显示他们的类型:

  • Component.client.js (or .jsx, .tsx) — 客户端组件

  • Component.server.js — 服务端组件

  • Component.js — 共享组件

共享组件,顾名思义,客户端和服务器端都可以导入。服务端组件可以导入服务端或者客户端组件,但是客户端组件不能导入服务端组件。

如何把组件迁移到服务端?

比方说我们有一个类似下面的组件:

// Article.jsimport { fetch } from 'react-fetch';import { format } from 'date-fns';import ArticleHeader from './ArticleHeader';import ArticleDeatails from './ArticleDetails';export default function Article({ artileId }) => {  const article = fetch(`my-api/articles/${articleId}`);  const postedAt = format(article.created_at, 'mm/dd/yy');  return (    <>                >  );}

我们可以看到它从我们的API中抓取了当前的文章的内容,然后使用了第三方库格式化了文章的日期,然后渲染了这两个组件(header和details)。我们能把Article部分移到服务端,因为它没有任何的交互,他只读取一些数据并转换渲染到两个其他组件上。我们现在可以忽视其它两个组件,假设我们把它们保留在客户端上。我们知道服务端组件仍然可以导入它们。所以这个案例中,我们唯一要做的事情就是给他们添加server和client的后缀。

// Article.server.jsimport { fetch } from 'react-fetch';import { format } from 'date-fns';import ArticleHeader from './ArticleHeader.client';import ArticleDeatails from './ArticleDetails.client';export default function Article({ artileId }) => {  const article = fetch(`my-api/articles/${articleId}`);  const postedAt = format(article.created_at, 'mm/dd/yy');  return (    <>                >  );}

是不是很容易?当然应用中可能有更复杂的组件,我们需要考虑充分利用服务端组件的优势更好的构造它们。我们可以结合服务端组件和SSR让应用有更好的性能。这一个令人兴奋的特性,会带给我们很多的好处,但最重要的是为我们的用户带来好处。

原文:

https://medium.com/dailyjs/how-react-server-components-work-c8b69595e29f

相关连接

Demohttps://reactjs.org/blog/2020/12/21/data-fetching-with-react-server-components.html

RFC:https://github.com/josephsavona/rfcs/blob/server-components/text/0000-server-components.md

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值