|
| 1 | +# React Server Components (Alpha) |
| 2 | + |
| 3 | +Server Components allow us to render React components on the server. This is fundamentally different from server-side rendering (SSR) where you're pre-generating HTML on the server. With Server Components, there's **zero client-side JavaScript needed,** making page rendering faster. This improves the user experience of your application, pairing the best parts of server-rendering with client-side interactivity. |
| 4 | + |
| 5 | +### Enable React Server Components |
| 6 | + |
| 7 | +To use React Server Components, ensure you have React 18 installed: |
| 8 | + |
| 9 | +```jsx |
| 10 | +npm install next@latest react@rc react-dom@rc |
| 11 | +``` |
| 12 | + |
| 13 | +Then, update your `next.config.js`: |
| 14 | + |
| 15 | +```jsx |
| 16 | +// next.config.js |
| 17 | +module.exports = { |
| 18 | + experimental: { |
| 19 | + runtime: 'nodejs', |
| 20 | + serverComponents: true, |
| 21 | + }, |
| 22 | +} |
| 23 | +``` |
| 24 | + |
| 25 | +Using `runtime` also enables [Streaming SSR](/docs/advanced-features/react-18/streaming). When setting `runtime` to `'edge'`, the server will be running entirely in the [Edge Runtime](https://nextjs.org/docs/api-reference/edge-runtime). |
| 26 | + |
| 27 | +Now, you can start using React Server Components in Next.js. [See our example](https://github.com/vercel/next-rsc-demo) for more information. |
| 28 | + |
| 29 | +### Server Components Conventions |
| 30 | + |
| 31 | +To run a component on the server, append `.server.js` to the end of the filename. For example, `./pages/home.server.js` will be treated as a Server Component. |
| 32 | + |
| 33 | +For client components, append `.client.js` to the filename. For example, `./components/avatar.client.js`. |
| 34 | + |
| 35 | +You can then import other server or client components from any server component. Note: a server component **can not** be imported by a client component. Components without "server/client" extensions will be treated as shared components and can be used and rendered by both sides, depending on where it is imported. For example: |
| 36 | + |
| 37 | +```jsx |
| 38 | +// pages/home.server.js |
| 39 | + |
| 40 | +import { Suspense } from 'react' |
| 41 | + |
| 42 | +import Profile from '../components/profile.server' |
| 43 | +import Content from '../components/content.client' |
| 44 | + |
| 45 | +export default function Home() { |
| 46 | + return ( |
| 47 | + <div> |
| 48 | + <h1>Welcome to React Server Components</h1> |
| 49 | + <Suspense fallback={'Loading...'}> |
| 50 | + <Profile /> |
| 51 | + </Suspense> |
| 52 | + <Content /> |
| 53 | + </div> |
| 54 | + ) |
| 55 | +} |
| 56 | +``` |
| 57 | + |
| 58 | +The `<Home>` and `<Profile>` components will always be server-side rendered and streamed to the client, and will not be included by the client-side JavaScript. However, `<Content>` will still be hydrated on the client-side, like normal React components. |
| 59 | + |
| 60 | +> Make sure you're using default imports and exports for server components (`.server.js`). The support of named exports are a work in progress! |
| 61 | +
|
| 62 | +To see a full example, check out the [hello world example](https://github.com/vercel/next.js/tree/canary/examples/react-server-components) or the larger [vercel/next-rsc-demo demo](https://github.com/vercel/next-rsc-demo). |
| 63 | + |
| 64 | +## Supported Next.js APIs |
| 65 | + |
| 66 | +### `next/link` and `next/image` |
| 67 | + |
| 68 | +You can use `next/link` and `next/image` like before and they will be treated as client components to keep the interaction on client side. |
| 69 | + |
| 70 | +### `next/document` |
| 71 | + |
| 72 | +If you have a custom `_document`, you have to change your `_document` to a functional component like below to use server components. If you don't have one, Next.js will use the default `_document` component for you. |
| 73 | + |
| 74 | +```jsx |
| 75 | +// pages/_document.js |
| 76 | +import { Html, Head, Main, NextScript } from 'next/document' |
| 77 | + |
| 78 | +export default function Document() { |
| 79 | + return ( |
| 80 | + <Html> |
| 81 | + <Head /> |
| 82 | + <body> |
| 83 | + <Main /> |
| 84 | + <NextScript /> |
| 85 | + </body> |
| 86 | + </Html> |
| 87 | + ) |
| 88 | +} |
| 89 | +``` |
| 90 | + |
| 91 | +### `next/app` |
| 92 | + |
| 93 | +If you're using `_app.js`, the usage is the same as [Custom App](/docs/advanced-features/custom-app). |
| 94 | +If you're using `_app.server.js` as a server component, see the example below where it only receives the `children` prop as React elements. You can wrap any other client or server components around `children` to customize the layout of your app. |
| 95 | + |
| 96 | +```js |
| 97 | +// pages/_app.server.js |
| 98 | +export default function App({ children }) { |
| 99 | + return children |
| 100 | +} |
| 101 | +``` |
| 102 | + |
| 103 | +### Routing |
| 104 | + |
| 105 | +Both basic routes with path and queries and dynamic routes are supported. If you need to access the router in server components(`.server.js`), they will receive `router` instance as a prop so that you can directly access them without using the `useRouter()` hook. |
| 106 | + |
| 107 | +```jsx |
| 108 | +// pages/index.server.js |
| 109 | + |
| 110 | +export default function Index({ router }) { |
| 111 | + // You can access routing information by `router.pathname`, etc. |
| 112 | + return 'hello' |
| 113 | +} |
| 114 | +``` |
| 115 | + |
| 116 | +### Unsupported Next.js APIs |
| 117 | + |
| 118 | +While RSC and SSR streaming are still in the alpha stage, not all Next.js APIs are supported. The following Next.js APIs have limited functionality within Server Components. React 18 use without SSR streaming is not affected. |
| 119 | + |
| 120 | +#### React internals |
| 121 | + |
| 122 | +Most React hooks, such as `useContext`, `useState`, `useReducer`, `useEffect` and `useLayoutEffect`, are not supported as of today since server components are executed per request and aren't stateful. |
| 123 | + |
| 124 | +#### Data Fetching & Styling |
| 125 | + |
| 126 | +Like streaming SSR, styling and data fetching within `Suspense` on the server side are not well supported. We're still working on them. |
| 127 | + |
| 128 | +Page level exported methods like `getInitialProps`, `getStaticProps` and `getStaticPaths` are not supported. |
| 129 | + |
| 130 | +#### `next/head` and I18n |
| 131 | + |
| 132 | +We are still working on support for these features. |
0 commit comments