From c262c15d7de824841684c8a5e01c47a41a30b1c6 Mon Sep 17 00:00:00 2001 From: "translate-react-bot[bot]" <251169733+translate-react-bot[bot]@users.noreply.github.com> Date: Tue, 2 Jun 2026 14:27:15 +0000 Subject: [PATCH 1/3] =?UTF-8?q?docs:=20translate=20`rsc-sandbox-test.md`?= =?UTF-8?q?=20to=20Portugu=C3=AAs=20(Brasil)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/content/learn/rsc-sandbox-test.md | 260 ++------------------------ 1 file changed, 12 insertions(+), 248 deletions(-) diff --git a/src/content/learn/rsc-sandbox-test.md b/src/content/learn/rsc-sandbox-test.md index f914ea4ae..6e6cce9cd 100644 --- a/src/content/learn/rsc-sandbox-test.md +++ b/src/content/learn/rsc-sandbox-test.md @@ -2,7 +2,7 @@ title: RSC Sandbox Test --- -## Basic Server Component {/*basic-server-component*/} +## Componente de Servidor Básico {/*basic-server-component*/} @@ -14,7 +14,7 @@ export default function App() { -## Server + Client Components {/*server-client*/} +## Componentes de Servidor + Cliente {/*server-client*/} @@ -48,7 +48,7 @@ export default function Counter() { -## Async Server Component with Suspense {/*async-suspense*/} +## Componente de Servidor Assíncrono com Suspense {/*async-suspense*/} @@ -88,9 +88,9 @@ export default async function Albums() { -## Streaming Proof {/*streaming-proof*/} +## Prova de Streaming {/*streaming-proof*/} -This demo proves streaming is incremental. The shell renders instantly with a `` fallback. After 2 seconds the async component streams in and replaces it — without re-rendering the outer content. The timestamps show the gap. +Esta demonstração prova que o streaming é incremental. A "shell" renderiza instantaneamente com um fallback ``. Após 2 segundos, o componente assíncrono é transmitido e o substitui — sem re-renderizar o conteúdo externo. Os timestamps mostram a diferença. @@ -145,9 +145,9 @@ export default function Timestamp() { -## Flight Data Types {/*flight-data-types*/} +## Tipos de Dados de Voo {/*flight-data-types*/} -This demo passes Map, Set, Date, and BigInt from a server component through the Flight stream to a client component, proving the full Flight protocol type system works end-to-end. +Esta demonstração passa Map, Set, Date e BigInt de um componente de servidor através do stream Flight para um componente de cliente, provando que o sistema de tipos completo do protocolo Flight funciona de ponta a ponta. @@ -206,9 +206,9 @@ export default function DataViewer({ map, set, date, big }) { -## Promise Streaming with use() {/*promise-streaming-use*/} +## Streaming de Promessas com use() {/*promise-streaming-use*/} -The server creates a promise (resolves in 2s) and passes it as a prop through a parent async component that suspends for 3s. When the parent reveals at ~3s, the promise is already resolved — so `use()` returns instantly with no inner fallback. The elapsed time should be ~3000ms (the parent's delay), not ~5000ms (which would mean the promise restarted on the client). +O servidor cria uma promessa (resolve em 2s) e a passa como prop através de um componente pai assíncrono que suspende por 3s. Quando o pai revela por volta de 3s, a promessa já está resolvida — então `use()` retorna instantaneamente sem um fallback interno. O tempo decorrido deve ser de ~3000ms (o atraso do pai), não ~5000ms (o que significaria que a promessa reiniciou no cliente). @@ -284,9 +284,9 @@ export default function UserCard({ userPromise, serverTime }) { -## Flight Data Types in Server Actions {/*flight-data-types-actions*/} +## Tipos de Dados de Voo em Ações de Servidor {/*flight-data-types-actions*/} -This demo sends Map, Set, Date, and BigInt from a client component *to* a server action via `encodeReply`/`decodeReply`, then verifies the types survived the round trip. +Esta demonstração envia Map, Set, Date e BigInt de um componente de cliente *para* uma ação de servidor via `encodeReply`/`decodeReply`, e então verifica se os tipos sobreviveram à viagem de ida e volta. @@ -336,240 +336,4 @@ export async function testTypes(map, set, date, big) { ok: set instanceof Set, detail: set instanceof Set ? 'values: ' + JSON.stringify([...set]) - : 'received: ' + typeof set, - }, - { - label: 'Date', - ok: date instanceof Date, - detail: date instanceof Date - ? date.toISOString() - : 'received: ' + typeof date, - }, - { - label: 'BigInt', - ok: typeof big === 'bigint', - detail: typeof big === 'bigint' - ? big.toString() - : 'received: ' + typeof big, - }, - ]; -} - -export async function getResults() { - return results; -} -``` - -```js src/TestButton.js -'use client'; -import { useTransition } from 'react'; - -export default function TestButton({ testTypes }) { - const [pending, startTransition] = useTransition(); - - function handleClick() { - startTransition(async () => { - await testTypes( - new Map([['alice', 100], ['bob', 200]]), - new Set(['react', 'next', 'remix']), - new Date('2025-06-15T12:00:00Z'), - 9007199254740993n - ); - }); - } - - return ( - - ); -} -``` - - - -## Server Action Mutation + Re-render {/*action-mutation-rerender*/} - -The server action mutates server-side data and returns a confirmation string. The updated list is only visible because the framework automatically re-renders the entire server component tree after the action completes — the server component re-reads the data and streams the new UI to the client. - - - -```js src/App.js -import { getTodos } from './db'; -import { createTodo } from './actions'; -import AddTodo from './AddTodo'; - -export default function App() { - const todos = getTodos(); - return ( -
-

Todo List

-

- This list is rendered by a server component - reading server-side data. It only updates because - the server re-renders after each action. -

-
    - {todos.map((todo, i) => ( -
  • {todo}
  • - ))} -
- -
- ); -} -``` - -```js src/db.js -let todos = ['Buy groceries']; - -export function getTodos() { - return [...todos]; -} - -export function addTodo(text) { - todos.push(text); -} -``` - -```js src/actions.js -'use server'; -import { addTodo } from './db'; - -export async function createTodo(text) { - if (!text) return 'Please enter a todo.'; - addTodo(text); - return 'Added: ' + text; -} -``` - -```js src/AddTodo.js -'use client'; -import { useState, useTransition } from 'react'; - -export default function AddTodo({ createTodo }) { - const [text, setText] = useState(''); - const [message, setMessage] = useState(''); - const [pending, startTransition] = useTransition(); - - function handleSubmit(e) { - e.preventDefault(); - startTransition(async () => { - const result = await createTodo(text); - setMessage(result); - setText(''); - }); - } - - return ( -
-
- setText(e.target.value)} - placeholder="New todo" - /> - -
- {message && ( -

- Action returned: "{message}" -

- )} -
- ); -} -``` - -
- -## Inline Server Actions {/*inline-server-actions*/} - -Server actions defined inline inside a server component with `'use server'` on the function body. The action closes over module-level state and is passed as a prop — no separate `actions.js` file needed. - - - -```js src/App.js -import LikeButton from './LikeButton'; - -let count = 0; - -export default function App() { - async function addLike() { - 'use server'; - count++; - } - - return ( -
-

Inline Server Actions

-

Likes: {count}

- -
- ); -} -``` - -```js src/LikeButton.js -'use client'; - -export default function LikeButton({ addLike }) { - return ( -
- -
- ); -} -``` - -
- -## Server Functions {/*server-functions*/} - - - -```js src/App.js -import { addLike, getLikeCount } from './actions'; -import LikeButton from './LikeButton'; - -export default async function App() { - const count = await getLikeCount(); - return ( -
-

Server Functions

-

Likes: {count}

- -
- ); -} -``` - -```js src/actions.js -'use server'; - -let count = 0; - -export async function addLike() { - count++; -} - -export async function getLikeCount() { - return count; -} -``` - -```js src/LikeButton.js -'use client'; - -export default function LikeButton({ addLike }) { - return ( -
- -
- ); -} -``` - -
\ No newline at end of file + : 'received \ No newline at end of file From 7d367d7b91de84382ad82b541e2c3734f099870c Mon Sep 17 00:00:00 2001 From: nivaldo Date: Thu, 4 Jun 2026 10:00:26 -0300 Subject: [PATCH 2/3] chore: minor pt-br styleguide issues fixes per @jhonmike suggestions --- src/content/learn/rsc-sandbox-test.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/content/learn/rsc-sandbox-test.md b/src/content/learn/rsc-sandbox-test.md index 6e6cce9cd..e3b0ceb9f 100644 --- a/src/content/learn/rsc-sandbox-test.md +++ b/src/content/learn/rsc-sandbox-test.md @@ -145,7 +145,7 @@ export default function Timestamp() { -## Tipos de Dados de Voo {/*flight-data-types*/} +## Tipos de Dados do Flight {/*flight-data-types*/} Esta demonstração passa Map, Set, Date e BigInt de um componente de servidor através do stream Flight para um componente de cliente, provando que o sistema de tipos completo do protocolo Flight funciona de ponta a ponta. @@ -284,7 +284,7 @@ export default function UserCard({ userPromise, serverTime }) { -## Tipos de Dados de Voo em Ações de Servidor {/*flight-data-types-actions*/} +## Tipos de Dados do Flight em Ações de Servidor {/*flight-data-types-actions*/} Esta demonstração envia Map, Set, Date e BigInt de um componente de cliente *para* uma ação de servidor via `encodeReply`/`decodeReply`, e então verifica se os tipos sobreviveram à viagem de ida e volta. @@ -336,4 +336,4 @@ export async function testTypes(map, set, date, big) { ok: set instanceof Set, detail: set instanceof Set ? 'values: ' + JSON.stringify([...set]) - : 'received \ No newline at end of file + : 'received From 590c44bb9cd40370aaa5b5166a602111c7c4a432 Mon Sep 17 00:00:00 2001 From: "translate-react-bot[bot]" <251169733+translate-react-bot[bot]@users.noreply.github.com> Date: Thu, 4 Jun 2026 14:40:33 +0000 Subject: [PATCH 3/3] =?UTF-8?q?docs:=20translate=20`rsc-sandbox-test.md`?= =?UTF-8?q?=20to=20Portugu=C3=AAs=20(Brasil)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/content/learn/rsc-sandbox-test.md | 248 +++++++++++++++++++++++++- 1 file changed, 242 insertions(+), 6 deletions(-) diff --git a/src/content/learn/rsc-sandbox-test.md b/src/content/learn/rsc-sandbox-test.md index e3b0ceb9f..1c295f18d 100644 --- a/src/content/learn/rsc-sandbox-test.md +++ b/src/content/learn/rsc-sandbox-test.md @@ -90,7 +90,7 @@ export default async function Albums() { ## Prova de Streaming {/*streaming-proof*/} -Esta demonstração prova que o streaming é incremental. A "shell" renderiza instantaneamente com um fallback ``. Após 2 segundos, o componente assíncrono é transmitido e o substitui — sem re-renderizar o conteúdo externo. Os timestamps mostram a diferença. +Esta demonstração prova que o streaming é incremental. A estrutura (shell) é renderizada instantaneamente com um fallback do ``. Após 2 segundos, o componente assíncrono é transmitido e o substitui — sem re-renderizar o conteúdo externo. Os timestamps mostram a diferença. @@ -147,7 +147,7 @@ export default function Timestamp() { ## Tipos de Dados do Flight {/*flight-data-types*/} -Esta demonstração passa Map, Set, Date e BigInt de um componente de servidor através do stream Flight para um componente de cliente, provando que o sistema de tipos completo do protocolo Flight funciona de ponta a ponta. +Esta demonstração passa Map, Set, Date e BigInt de um componente de servidor através do stream Flight para um componente cliente, provando que o sistema de tipos completo do protocolo Flight funciona de ponta a ponta. @@ -206,9 +206,9 @@ export default function DataViewer({ map, set, date, big }) { -## Streaming de Promessas com use() {/*promise-streaming-use*/} +## Streaming de Promise com use() {/*promise-streaming-use*/} -O servidor cria uma promessa (resolve em 2s) e a passa como prop através de um componente pai assíncrono que suspende por 3s. Quando o pai revela por volta de 3s, a promessa já está resolvida — então `use()` retorna instantaneamente sem um fallback interno. O tempo decorrido deve ser de ~3000ms (o atraso do pai), não ~5000ms (o que significaria que a promessa reiniciou no cliente). +O servidor cria uma promise (resolve em 2s) e a passa como prop através de um componente pai assíncrono que suspende por 3s. Quando o pai é revelado em ~3s, a promise já está resolvida — então `use()` retorna instantaneamente sem um fallback interno. O tempo decorrido deve ser de ~3000ms (o atraso do pai), não ~5000ms (o que significaria que a promise reiniciou no cliente). @@ -286,7 +286,7 @@ export default function UserCard({ userPromise, serverTime }) { ## Tipos de Dados do Flight em Ações de Servidor {/*flight-data-types-actions*/} -Esta demonstração envia Map, Set, Date e BigInt de um componente de cliente *para* uma ação de servidor via `encodeReply`/`decodeReply`, e então verifica se os tipos sobreviveram à viagem de ida e volta. +Esta demonstração envia Map, Set, Date e BigInt de um componente cliente *para* uma ação de servidor via `encodeReply`/`decodeReply`, e então verifica se os tipos sobreviveram à viagem de ida e volta. @@ -336,4 +336,240 @@ export async function testTypes(map, set, date, big) { ok: set instanceof Set, detail: set instanceof Set ? 'values: ' + JSON.stringify([...set]) - : 'received + : 'received: ' + typeof set, + }, + { + label: 'Date', + ok: date instanceof Date, + detail: date instanceof Date + ? date.toISOString() + : 'received: ' + typeof date, + }, + { + label: 'BigInt', + ok: typeof big === 'bigint', + detail: typeof big === 'bigint' + ? big.toString() + : 'received: ' + typeof big, + }, + ]; +} + +export async function getResults() { + return results; +} +``` + +```js src/TestButton.js +'use client'; +import { useTransition } from 'react'; + +export default function TestButton({ testTypes }) { + const [pending, startTransition] = useTransition(); + + function handleClick() { + startTransition(async () => { + await testTypes( + new Map([['alice', 100], ['bob', 200]]), + new Set(['react', 'next', 'remix']), + new Date('2025-06-15T12:00:00Z'), + 9007199254740993n + ); + }); + } + + return ( + + ); +} +``` + + + +## Mutação de Ação de Servidor + Re-renderização {/*action-mutation-rerender*/} + +A ação de servidor modifica dados no lado do servidor e retorna uma string de confirmação. A lista atualizada só é visível porque o framework re-renderiza automaticamente toda a árvore de componentes do servidor após a conclusão da ação — o componente do servidor relê os dados e transmite a nova UI para o cliente. + + + +```js src/App.js +import { getTodos } from './db'; +import { createTodo } from './actions'; +import AddTodo from './AddTodo'; + +export default function App() { + const todos = getTodos(); + return ( +
+

Todo List

+

+ This list is rendered by a server component + reading server-side data. It only updates because + the server re-renders after each action. +

+
    + {todos.map((todo, i) => ( +
  • {todo}
  • + ))} +
+ +
+ ); +} +``` + +```js src/db.js +let todos = ['Buy groceries']; + +export function getTodos() { + return [...todos]; +} + +export function addTodo(text) { + todos.push(text); +} +``` + +```js src/actions.js +'use server'; +import { addTodo } from './db'; + +export async function createTodo(text) { + if (!text) return 'Please enter a todo.'; + addTodo(text); + return 'Added: ' + text; +} +``` + +```js src/AddTodo.js +'use client'; +import { useState, useTransition } from 'react'; + +export default function AddTodo({ createTodo }) { + const [text, setText] = useState(''); + const [message, setMessage] = useState(''); + const [pending, startTransition] = useTransition(); + + function handleSubmit(e) { + e.preventDefault(); + startTransition(async () => { + const result = await createTodo(text); + setMessage(result); + setText(''); + }); + } + + return ( +
+
+ setText(e.target.value)} + placeholder="New todo" + /> + +
+ {message && ( +

+ Action returned: "{message}" +

+ )} +
+ ); +} +``` + +
+ +## Ações de Servidor Inline {/*inline-server-actions*/} + +Ações de servidor definidas inline dentro de um componente de servidor com `'use server'` no corpo da função. A ação fecha sobre o estado do nível do módulo e é passada como prop — nenhum arquivo `actions.js` separado é necessário. + + + +```js src/App.js +import LikeButton from './LikeButton'; + +let count = 0; + +export default function App() { + async function addLike() { + 'use server'; + count++; + } + + return ( +
+

Inline Server Actions

+

Likes: {count}

+ +
+ ); +} +``` + +```js src/LikeButton.js +'use client'; + +export default function LikeButton({ addLike }) { + return ( +
+ +
+ ); +} +``` + +
+ +## Funções de Servidor {/*server-functions*/} + + + +```js src/App.js +import { addLike, getLikeCount } from './actions'; +import LikeButton from './LikeButton'; + +export default async function App() { + const count = await getLikeCount(); + return ( +
+

Server Functions

+

Likes: {count}

+ +
+ ); +} +``` + +```js src/actions.js +'use server'; + +let count = 0; + +export async function addLike() { + count++; +} + +export async function getLikeCount() { + return count; +} +``` + +```js src/LikeButton.js +'use client'; + +export default function LikeButton({ addLike }) { + return ( +
+ +
+ ); +} +``` + +
\ No newline at end of file