他的作用是识别项目中的'use client'指令 , 作用有些类似于「全自动React.lazy」 。
使用过React.lazy特性的同学会知道,当我们通过React.lazy懒加载组件时,懒加载的组件会被打包工具(比如webpack)打包成独立的chunk 。当前端需要该组件时 , 会通过Jsonp请求chunk文件 。
比如下面代码中的./Cpn.jsx组件由于懒加载,会被打包成独立的chunk:
import React from 'react';const LayCpn = React.lazy(() => import('./Cpn.jsx'));function App(props) {return <LayCpn {...props} />; }
与React.lazy类似,当我们在组件所在文件的顶部标记'use client'时 , 并在服务端组件的子孙组件中使用到该组件,该组件代码也会打包成独立的chunk 。由于这个过程是全自动的,所以可以称为「全自动React.lazy」 。
服务端运行时上面讲到的编译产物都是「客户端组件对应chunk」,所以他们是不会在服务端运行时使用的 。
服务端运行时的作用类似SSR,都是给定JSX输入,经过render后获得输出 。比如,给定如下输入:
function App() {return <div>hello</div>;}
对于SSR,会获得字符串'<div>hello</div>'的输出 。
对于RSC规范,将输入传给react-server-dom-webpack/server导出的renderToPipeableStream方法,会获得如下序列化数据:
0:"$L1"1:["$","div",null,{"children":"hello"}]
再让我们看一个稍微复杂点的例子:
我们有个组件Cpn,由于他包含客户端状态(使用了useState),所以只能作为客户端组件(顶部标记'use client'):
'use client'import {useState} from 'react';function Cpn() {const [num, update] = useState(0);// ...省略}
现在,我们的服务端组件App返回值中包含了Cpn:
function App() {return <div><Cpn/></div>;}
经由renderToPipeableStream方法,会获得如下序列化数据:
0:"$L1"2:I["./src/app/Test.jsx",["client0","client0.chunk.js"],"Test"]1:["$","div",null,{"children":["$","$L2",null,{}]}]
可以发现,序列化数据中并不包含具体的客户端组件代码,而是组件代码对应的文件(client0.chunk.js),这个文件就是我们在「服务端编译时」打包产生的chunk文件 。
客户端运行时当「服务端运行时」产生的「序列化数据」传递给前端时,react-server-dom-webpack又出场了,这次使用的是react-server-dom-webpack/client 。
这个包提供了几个方法,用于将「从不同数据源获取的序列化数据」转换为「合法的React Element」,比如:
- createFromFetch:通过fetch方法获取序列化数据 。
- createFromReadableStream:通过可读流获取序列化数据 。
0:"$L1"2:I["./src/app/Test.jsx",["client0","client0.chunk.js"],"Test"]1:["$","div",null,{"children":["$","$L2",null,{}]}]
经由react-server-dom-webpack/client中方法的转换 , 会得到一个React.lazy组件,这样前端的React就能正常render这个组件了 。总结RSC规范属于React特性,来自于React Canary 。规范的落地可以通过react-server-dom-webpack包实现 。
整个工作流程包括三个阶段:
- 服务端编译时,对应react-server-dom-webpack/plugin 。
- 服务端运行时,对应react-server-dom-webpack/server 。
- 客户端运行时,对应react-server-dom-webpack/client 。
参考资料[1]data-fetching-with-react-server-components:https://legacy.reactjs.org/blog/2020/12/21/data-fetching-with-react-server-components.html 。
[2]react-server-dom-webpack:https://www.npmjs.com/package/react-server-dom-webpack 。
【怎么理解 React Server Component 和 Next.js 的关系】
推荐阅读
- HBase详细介绍及原理解析!
- 关键词获客,运营商大数据精准获客怎么实现的?
- 深入理解SQL事务:保证数据的一致性和完整性
- 微信小程序怎么开发?
- 大厂都是怎么做Redis重试的?
- 如何制作连环衣钩 连环鱼钩怎么绑?
- 微波炉不转了怎么回事 微波炉转盘不转了怎么回事
- 抖店商品卡怎么推广?怎么带来流量?
- 微波炉突然不加热啦是怎么回事 微波炉运转正常不加热的解决办法
- pps怎么下载电影 pps下载的视频是什么格式