Skip to content

Commit dd63f39

Browse files
authored
docs(cn): translate reference/rsc/server-components into Chinese (#1648)
2 parents 21f1898 + 260f4a0 commit dd63f39

File tree

3 files changed

+57
-57
lines changed

3 files changed

+57
-57
lines changed

src/components/MDX/ExpandableCallout.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ const variantMap = {
7676
'linear-gradient(rgba(249, 247, 243, 0), rgba(249, 247, 243, 1)',
7777
},
7878
rsc: {
79-
title: 'React Server Components',
79+
title: 'React 服务器组件',
8080
Icon: null,
8181
containerClasses: 'bg-blue-10 dark:bg-blue-60 dark:bg-opacity-20',
8282
textColor: 'text-blue-50 dark:text-blue-40',

src/content/reference/rsc/server-components.md

+54-54
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,45 @@
11
---
2-
title: Server Components
2+
title: 服务器组件
33
---
44

55
<RSC>
66

7-
Server Components are for use in [React Server Components](/learn/start-a-new-react-project#bleeding-edge-react-frameworks).
7+
服务器组件被用在 [React 服务器组件](/learn/start-a-new-react-project#bleeding-edge-react-frameworks) 中。
88

99
</RSC>
1010

1111
<Intro>
1212

13-
Server Components are a new type of Component that renders ahead of time, before bundling, in an environment separate from your client app or SSR server.
13+
服务器组件是一种新型的组件,它在打包之前,在独立于客户端应用程序或 SSR 服务器的环境中提前渲染。
1414

1515
</Intro>
1616

17-
This separate environment is the "server" in React Server Components. Server Components can run once at build time on your CI server, or they can be run for each request using a web server.
17+
React 服务器组件中的「服务器」就是指这个独立的环境。服务器组件可以在构建时在你的 CI 服务器上运行一次,也可以在每次请求时在 Web 服务器中运行。
1818

1919
<InlineToc />
2020

2121
<Note>
2222

23-
#### How do I build support for Server Components? {/*how-do-i-build-support-for-server-components*/}
23+
#### 我如何构建对服务器组件的支持? {/*how-do-i-build-support-for-server-components*/}
2424

25-
While React Server Components in React 19 are stable and will not break between minor versions, the underlying APIs used to implement a React Server Components bundler or framework do not follow semver and may break between minors in React 19.x.
25+
虽然 React 19 中的 React 服务器组件是稳定的,并且在小版本之间不会发生破坏,但用于实现 React 服务器组件打包器或框架的底层 API 不遵循 semver,并可能在 React 19.x 的小版本之间发生破坏。
2626

27-
To support React Server Components as a bundler or framework, we recommend pinning to a specific React version, or using the Canary release. We will continue working with bundlers and frameworks to stabilize the APIs used to implement React Server Components in the future.
27+
为了支持 React 服务器组件作为打包器或框架,我们建议固定到特定的 React 版本,或者使用 Canary 发行版。我们将继续与打包器和框架合作,以在未来稳定用于实现 React 服务器组件的 API。
2828

2929
</Note>
3030

31-
### Server Components without a Server {/*server-components-without-a-server*/}
32-
Server components can run at build time to read from the filesystem or fetch static content, so a web server is not required. For example, you may want to read static data from a content management system.
31+
### 不使用服务器的服务器组件 {/*server-components-without-a-server*/}
32+
服务器组件可以在构建时运行,来从文件系统中读取文件,或者获取静态内容,这种情况下,不需要 Web 服务器。例如,你可能会想从内容管理系统(Content Management System/CMS)中读取静态的数据。
3333

34-
Without Server Components, it's common to fetch static data on the client with an Effect:
34+
如果不使用服务器组件,通常会在客户端通过一个 Effect 来获取静态数据:
3535
```js
3636
// bundle.js
3737
import marked from 'marked'; // 35.9K (11.2K gzipped)
3838
import sanitizeHtml from 'sanitize-html'; // 206K (63.3K gzipped)
3939

4040
function Page({page}) {
4141
const [content, setContent] = useState('');
42-
// NOTE: loads *after* first page render.
42+
// 注意: 在第一次页面渲染 **之后** 加载。
4343
useEffect(() => {
4444
fetch(`/api/content/${page}`).then((data) => {
4545
setContent(data.content);
@@ -58,56 +58,56 @@ app.get(`/api/content/:page`, async (req, res) => {
5858
});
5959
```
6060

61-
This pattern means users need to download and parse an additional 75K (gzipped) of libraries, and wait for a second request to fetch the data after the page loads, just to render static content that will not change for the lifetime of the page.
61+
这种模式意味着用户需要下载并解析额外 75K(压缩后)大小的包,还要在页面加载后等待第二次获取数据的请求,做这些仅仅是为了渲染静态内容,而这些内容在整个页面的生命周期内都不会改变。
6262

63-
With Server Components, you can render these components once at build time:
63+
使用服务器组件,你可以在构建时一次性渲染这些组件:
6464

6565
```js
66-
import marked from 'marked'; // Not included in bundle
67-
import sanitizeHtml from 'sanitize-html'; // Not included in bundle
66+
import marked from 'marked'; // 不会包括在 bundle
67+
import sanitizeHtml from 'sanitize-html'; // 不会包括在 bundle
6868

6969
async function Page({page}) {
70-
// NOTE: loads *during* render, when the app is built.
70+
// 注意: 会在应用构建的 **渲染过程中** 加载
7171
const content = await file.readFile(`${page}.md`);
7272

7373
return <div>{sanitizeHtml(marked(content))}</div>;
7474
}
7575
```
7676

77-
The rendered output can then be server-side rendered (SSR) to HTML and uploaded to a CDN. When the app loads, the client will not see the original `Page` component, or the expensive libraries for rendering the markdown. The client will only see the rendered output:
77+
渲染的输出接着可以被服务端渲染(SSR)成 HTML 并上传至 CDN。当应用加载时,客户端不会看到原始的 `Page` 组件,也不会看到用于渲染 markdown 且体积较大的包。客户端只会看到最终渲染出来的 HTML 内容:
7878

7979
```js
8080
<div><!-- html for markdown --></div>
8181
```
8282

83-
This means the content is visible during first page load, and the bundle does not include the expensive libraries needed to render the static content.
83+
这意味着内容在第一次页面加载时就可以被看见,而且 bundle 中不会包含渲染静态内容所需的体积大的包。
8484

8585
<Note>
8686

87-
You may notice that the Server Component above is an async function:
87+
你可能会注意到上方的服务器组件是一个异步函数:
8888

8989
```js
9090
async function Page({page}) {
9191
//...
9292
}
9393
```
9494

95-
Async Components are a new feature of Server Components that allow you to `await` in render.
95+
异步组件是服务器组件的一个新特性,它允许你在渲染中 `await`
9696

97-
See [Async components with Server Components](#async-components-with-server-components) below.
97+
查看下方 [使用服务器组件的异步组件](#async-components-with-server-components)
9898

9999
</Note>
100100

101-
### Server Components with a Server {/*server-components-with-a-server*/}
102-
Server Components can also run on a web server during a request for a page, letting you access your data layer without having to build an API. They are rendered before your application is bundled, and can pass data and JSX as props to Client Components.
101+
### 使用服务器的服务器组件 {/*server-components-with-a-server*/}
102+
服务器组件也可以在请求页面时在 Web 服务器上运行,从而让你不需要建立 API 就可以访问数据层。这类服务器组件在应用打包之前被渲染,并且可以将数据和 JSX 作为 props 传递给客户端组件。
103103

104-
Without Server Components, it's common to fetch dynamic data on the client in an Effect:
104+
如果不使用服务器组件,通常会在客户端的 Effect 里获取动态数据:
105105

106106
```js
107107
// bundle.js
108108
function Note({id}) {
109109
const [note, setNote] = useState('');
110-
// NOTE: loads *after* first render.
110+
// 注意: 在第一次渲染 **之后** 加载。
111111
useEffect(() => {
112112
fetch(`/api/notes/${id}`).then(data => {
113113
setNote(data.note);
@@ -124,8 +124,8 @@ function Note({id}) {
124124

125125
function Author({id}) {
126126
const [author, setAuthor] = useState('');
127-
// NOTE: loads *after* Note renders.
128-
// Causing an expensive client-server waterfall.
127+
// 注意: 在 Note 渲染 **之后** 加载。
128+
// 造成昂贵的客户端-服务器瀑布
129129
useEffect(() => {
130130
fetch(`/api/authors/${id}`).then(data => {
131131
setAuthor(data.author);
@@ -150,13 +150,13 @@ app.get(`/api/authors/:id`, async (req, res) => {
150150
});
151151
```
152152

153-
With Server Components, you can read the data and render it in the component:
153+
使用服务器组件,你可以在组件中读取数据并渲染:
154154

155155
```js
156156
import db from './database';
157157

158158
async function Note({id}) {
159-
// NOTE: loads *during* render.
159+
// 注意: 在 **渲染时** 加载。
160160
const note = await db.notes.get(id);
161161
return (
162162
<div>
@@ -167,14 +167,14 @@ async function Note({id}) {
167167
}
168168

169169
async function Author({id}) {
170-
// NOTE: loads *after* Note,
171-
// but is fast if data is co-located.
170+
// 注意: 在 Note **之后** 加载,
171+
// 如果服务器组件和数据库在同一个位置(例如在同一台服务器上),这里读取数据的加载速度会很快。
172172
const author = await db.authors.get(id);
173173
return <span>By: {author.name}</span>;
174174
}
175175
```
176176

177-
The bundler then combines the data, rendered Server Components and dynamic Client Components into a bundle. Optionally, that bundle can then be server-side rendered (SSR) to create the initial HTML for the page. When the page loads, the browser does not see the original `Note` and `Author` components; only the rendered output is sent to the client:
177+
打包器接着会整合数据、渲染服务器组件并和动态客户端组件一起打成一个包。接着可以选择将这个包进行服务端渲染(SSR)以创建初始的 HTML 页面。当页面加载时,浏览器不会看到原始的 `Note` `Author` 组件,只有渲染后的输出才会发送到客户端:
178178

179179
```js
180180
<div>
@@ -183,26 +183,26 @@ The bundler then combines the data, rendered Server Components and dynamic Clien
183183
</div>
184184
```
185185

186-
Server Components can be made dynamic by re-fetching them from a server, where they can access the data and render again. This new application architecture combines the simple “request/response” mental model of server-centric Multi-Page Apps with the seamless interactivity of client-centric Single-Page Apps, giving you the best of both worlds.
186+
可以通过重新请求服务器来使服务器组件动态化,重新请求时,它们可以访问数据并重新渲染。这种新的应用结构将以服务器为中心多页应用的「请求/响应」心智模型和以客户端为中心单页应用的无缝交互性的优点融合在一起,给你提供两全其美的体验。
187187

188-
### Adding interactivity to Server Components {/*adding-interactivity-to-server-components*/}
188+
### 给服务器组件添加交互性 {/*adding-interactivity-to-server-components*/}
189189

190-
Server Components are not sent to the browser, so they cannot use interactive APIs like `useState`. To add interactivity to Server Components, you can compose them with Client Component using the `"use client"` directive.
190+
由于服务器组件不会发给浏览器,所以它们不能使用交互的 API,例如 `useState`。要给服务器组件添加交互性,你可以使用 `"use client"` 指令把他们和客户端组件组合在一起。
191191

192192
<Note>
193193

194-
#### There is no directive for Server Components. {/*there-is-no-directive-for-server-components*/}
194+
#### 服务器组件没有对应的指令 {/*there-is-no-directive-for-server-components*/}
195195

196-
A common misunderstanding is that Server Components are denoted by `"use server"`, but there is no directive for Server Components. The `"use server"` directive is used for Server Functions.
196+
一个常见的误解是,服务器组件使用 `"use server"` 表示,但其实服务器组件没有对应的指令。`"use server"` 是给服务器函数使用的。
197197

198-
For more info, see the docs for [Directives](/reference/rsc/directives).
198+
要了解更多信息,查看 [指令](/reference/rsc/directives) 的文档.
199199

200200
</Note>
201201

202202

203-
In the following example, the `Notes` Server Component imports an `Expandable` Client Component that uses state to toggle its `expanded` state:
203+
在如下示例中,`Notes` 服务器组件导入了 `Expandable` 客户端组件,这个组件使用 state 切换 `expanded` 状态:
204204
```js
205-
// Server Component
205+
// 服务器组件
206206
import Expandable from './Expandable';
207207

208208
async function Notes() {
@@ -219,7 +219,7 @@ async function Notes() {
219219
}
220220
```
221221
```js
222-
// Client Component
222+
// 客户端组件
223223
"use client"
224224

225225
export default function Expandable({children}) {
@@ -237,11 +237,11 @@ export default function Expandable({children}) {
237237
}
238238
```
239239

240-
This works by first rendering `Notes` as a Server Component, and then instructing the bundler to create a bundle for the Client Component `Expandable`. In the browser, the Client Components will see output of the Server Components passed as props:
240+
其工作原理是,首先将 `Notes` 作为服务器组件渲染,然后指引打包器为客户端组件 `Expandable` 创建一个包。在浏览器中,客户端组件会接收服务器组件的输出并作为 props 传递。
241241

242242
```js
243243
<head>
244-
<!-- the bundle for Client Components -->
244+
<!-- 客户端组件的包 -->
245245
<script src="bundle.js" />
246246
</head>
247247
<body>
@@ -257,21 +257,21 @@ This works by first rendering `Notes` as a Server Component, and then instructin
257257
</body>
258258
```
259259

260-
### Async components with Server Components {/*async-components-with-server-components*/}
260+
### 使用服务器组件的异步组件 {/*async-components-with-server-components*/}
261261

262-
Server Components introduce a new way to write Components using async/await. When you `await` in an async component, React will suspend and wait for the promise to resolve before resuming rendering. This works across server/client boundaries with streaming support for Suspense.
262+
服务器组件引入了一种使用 async/await 编写组件的新方法。当你在一个异步组件里 `await` 时,React 会暂停,等待 promise 解析完成后再继续渲染。这种等待可以跨越服务器和客户端的边界生效,并且支持 Suspense 的流式传输。
263263

264-
You can even create a promise on the server, and await it on the client:
264+
你甚至可以在服务器上创建一个 promise,然后再客户端上 await 它。
265265

266266
```js
267-
// Server Component
267+
// 服务器组件
268268
import db from './database';
269269

270270
async function Page({id}) {
271-
// Will suspend the Server Component.
271+
// 使用 await 会使服务器组件暂停
272272
const note = await db.notes.get(id);
273273

274-
// NOTE: not awaited, will start here and await on the client.
274+
// 注意: 没有使用 await, 所以从这里开始执行,但是客户端上面进行 await
275275
const commentsPromise = db.comments.get(note.id);
276276
return (
277277
<div>
@@ -285,18 +285,18 @@ async function Page({id}) {
285285
```
286286

287287
```js
288-
// Client Component
288+
// 客户端组件
289289
"use client";
290290
import {use} from 'react';
291291

292292
function Comments({commentsPromise}) {
293-
// NOTE: this will resume the promise from the server.
294-
// It will suspend until the data is available.
293+
// 注意: 这样做会复用服务器上的 promise
294+
// 它会一直等到数据可用之后才继续
295295
const comments = use(commentsPromise);
296296
return comments.map(commment => <p>{comment}</p>);
297297
}
298298
```
299299

300-
The `note` content is important data for the page to render, so we `await` it on the server. The comments are below the fold and lower-priority, so we start the promise on the server, and wait for it on the client with the `use` API. This will Suspend on the client, without blocking the `note` content from rendering.
300+
因为 `note` 内容是页面渲染所需的重要数据,所以我们在服务器上进行 `await`comments 数据在折叠部分中,优先级较低,所以我们在服务器上开始 promise,然后在客户端使用 `use` API 进行等待。这会在客户端上暂停,但不会阻塞 `note` 内容的渲染。
301301

302-
Since async components are [not supported on the client](#why-cant-i-use-async-components-on-the-client), we await the promise with `use`.
302+
由于异步组件 [在客户端不受支持](#why-cant-i-use-async-components-on-the-client),所以我们通过 `use`await promise

src/sidebarReference.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -331,10 +331,10 @@
331331
},
332332
{
333333
"hasSectionHeader": true,
334-
"sectionHeader": "React Server Components"
334+
"sectionHeader": "React 服务器组件"
335335
},
336336
{
337-
"title": "Server Components",
337+
"title": "服务器组件",
338338
"path": "/reference/rsc/server-components"
339339
},
340340
{

0 commit comments

Comments
 (0)