introduction
React 18 已经包括了一些新的特性,例如Suspense,自动批量更新,例如startTransition的API,并增加了一些新的流式API(对于支持React.lazy的服务端渲染)
React 18 当前处于RC(发布候选版) …
React 18 使用在Next.js中
npm install next@latest react@rc react-dom@rc
启用SSR 流化(Alpha)
当前React 18 已经内置了服务端(Suspense) 以及SSR 流式支持 … 允许你使用Http streaming 服务端渲染一个页面 ..
这是一个在Next.js 12中的实验性特性,但是一旦启用,SSR 将使用相同的Edge Runtime 作为中间件 ..
为了启用,使用这个实验性标志concurrentFeatures: true
// next.config.jsmodule.exports = {experimental: {concurrentFeatures: true,},}
一旦启用,你能够使用Suspense 以及SSR 流化(对所有页面),这意味着你能够使用基于Suspense的数据抓取,next/dynamic以及 React的内置的React.lazy以及Suspense 边界 ..
import dynamic from 'next/dynamic'import { lazy, Suspense } from 'react'import Content from '../components/content'// These two ways are identical:const Profile = dynamic(() => import('./profile'), { suspense: true })const Footer = lazy(() => import('./footer'))export default function Home() {return (<div><Suspense fallback={<Spinner />}>{/* A component that uses Suspense-based */}<Content /></Suspense><Suspense fallback={<Spinner />}><Profile /></Suspense><Suspense fallback={<Spinner />}><Footer /></Suspense></div>)}
React 服务器组件
React 服务器组件允许我们渲染任何事情,包括它们的组件(在服务器上),这是根本上不同于服务端渲染的,在服务器上预渲染HTML .. 通过服务器组件,这里不需要客户端js,并且页面渲染的更加快速,这提高了应用对用户的体验,
将服务器呈现的最佳部分与客户端交互性配对。
启用React 服务器组件
为了使用React 服务器组件,确保你安装了React 18,然后调整concurrentFeatures以及 ·serverComponent` 选项
// next.config.jsmodule.exports = {experimental: {concurrentFeatures: true,serverComponents: true,},}
如果你已经自定义了pages/_document组件,你需要移除getInitialProps静态方法以及getServerSideProps(暴露,如果有), 否则它不能和服务器组件工作,如果没有自定义的文档组件提供,那么Next.js 将回滚到默认的配置
// pages/_document.jsimport { Html, Head, Main, NextScript } from 'next/document'export default function Document() {return (<Html><Head /><body><Main /><NextScript /></body></Html>)}
然后,你能够开始使用React 服务器组件,查看demo 了解更多信息
服务器组件APIs(Alpha)
为了在服务器上运行一个组件,追加server.js到文件名的结尾,例如./pages/home.server.js是一个服务器组件
对于客户端组件,增加.client.js到文件名结尾
例如: ./components/avatar.client.js
你能够从任何任何服务器组件导入其他服务器或者客户端组件,注意到一个服务器组件不能够被一个客户端组件导入 …
没有服务器或者客户端扩展的组件能够处理为”普通组件”并且能够被同时在服务器或者客户端进行使用 … 依赖它在哪里导入的
// pages/home.server.jsimport { Suspense } from 'react'import Profile from '../components/profile.server'import Content from '../components/content.client'export default function Home() {return (<div><h1>Welcome to React Server Components</h1><Suspense fallback={'Loading...'}><Profile /></Suspense><Content /></div>)}
Home以及 Profile组件将总是进行服务端渲染并且流式到客户端,并且不会再客户端运行时包括,然而<Content>将仍然能够被水和(在客户端),就像普通的React 组件 ..
了解更多demo,查看 link to the demo and repository.
受支持的Next.js APIs
- ·next/link
/next/image` next/document/next/app- 动态路由
不支持的Next.js APIs
然而RSC以及 SSR 流化仍然处于alpha 阶段,不是所有的Next.js API 都是支持的,以下Next.js API 在服务端组件被限制了功能 ..
- React 内部: 大多数hooks 例如
useContext,useState,useReducer,useEffect以及useLayoutEffect不是受支持的,到目前为止由于服务端组件在每次请求进行执行且是无状态的 … next/head- 部分: 在
.client.js组件中useRouter是支持的 - Styled JSX
- CSS Modules
- Next.js I18n
getInitialProps,getStaticProps,getStaticPaths
不进行SSR 流化,那么一切照常 ….(以前的任何特性都是支持的) ….
