From 3e24da41b03520ee1c52db4c536bb6de75d1c7a4 Mon Sep 17 00:00:00 2001 From: martindavila Date: Sun, 21 May 2023 22:09:29 +0200 Subject: [PATCH 1/5] =?UTF-8?q?Agregada=20traducci=C3=B3n=20de=20React=201?= =?UTF-8?q?8=20Upgrade=20Guide?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2022/03/08/es_react-18-upgrade-guide.md | 321 +++++++++++++++++ .../blog/2022/03/08/react-18-upgrade-guide.md | 328 ------------------ 2 files changed, 321 insertions(+), 328 deletions(-) create mode 100644 src/content/blog/2022/03/08/es_react-18-upgrade-guide.md delete mode 100644 src/content/blog/2022/03/08/react-18-upgrade-guide.md diff --git a/src/content/blog/2022/03/08/es_react-18-upgrade-guide.md b/src/content/blog/2022/03/08/es_react-18-upgrade-guide.md new file mode 100644 index 000000000..121ef893c --- /dev/null +++ b/src/content/blog/2022/03/08/es_react-18-upgrade-guide.md @@ -0,0 +1,321 @@ +# Cómo actualizar a React 18 +08 de marzo de 2022 por Rick Hanlon + +Como compartimos en la publicación de lanzamiento, React 18 introduce características impulsadas por nuestro nuevo renderizador concurrente, con una estrategia de adopción gradual para aplicaciones existentes. En esta publicación, te guiaremos a través de los pasos para actualizar a React 18. + +Por favor, informa cualquier problema que encuentres durante la actualización a React 18. + +Nota +Para los usuarios de React Native, React 18 se lanzará en una versión futura de React Native. Esto se debe a que React 18 depende de la nueva arquitectura de React Native para beneficiarse de las nuevas capacidades presentadas en esta publicación del blog. Para obtener más información, consulta el discurso principal de React Conf aquí. + +## Instalación +Para instalar la última versión de React: + +``` +npm install react react-dom +``` + +O si estás usando yarn: + +``` +yarn add react react-dom +``` + +## Actualizaciones en las API de renderizado en el cliente +Cuando instales React 18 por primera vez, verás una advertencia en la consola: + +``` +Console +ReactDOM.render ya no es compatible en React 18. Usa createRoot en su lugar. Hasta que cambies a la nueva API, tu aplicación se comportará como si estuviera ejecutando React 17. Más información: [enlace](https://reactjs.org/link/switch-to-createroot) +``` + +React 18 introduce una nueva API de raíz que proporciona una mejor ergonomía para administrar las raíces. La nueva API de raíz también habilita el nuevo renderizador concurrente, que te permite optar por las características concurrentes. + +```jsx +// Antes +import { render } from 'react-dom'; +const container = document.getElementById('app'); +render(, container); + +// Después +import { createRoot } from 'react-dom/client'; +const container = document.getElementById('app'); +const root = createRoot(container); // createRoot(container!) si usas TypeScript +root.render(); +``` + +También hemos cambiado unmountComponentAtNode a root.unmount: + +```jsx +// Antes +unmountComponentAtNode(container); + +// Después +root.unmount(); +``` + +También hemos eliminado la devolución de llamada de render, ya que generalmente no tiene el resultado esperado cuando se usa Suspense: + +```jsx +// Antes +const container = document.getElementById('app'); +render(, container, () => { + console.log('rendered'); +}); + +// Después +function AppWithCallbackAfterRender() { + useEffect(() => { + console.log('rendered'); + }); + + return +} + +const container = document.getElementById('app'); +const root = createRoot(container); +root.render(); +``` + +Nota +No hay un reemplazo directo de la antigua API de devolución de llamada de renderización, depende de tu caso de uso. Consulta la publicación del grupo de trabajo para Reemplazar render por createRoot para obtener más información. + +Finalmente, si tu aplicación utiliza renderizado del lado del servidor con hidratación, actualiza `hydrate` a `hydrateRoot`: + +```javascript +// Antes +import { hydrate } from 'react-dom'; +const container = document.getElementById('app'); +hydrate(, container); + +// Después +import { hydrateRoot } from 'react-dom/client'; +const container = document.getElementById('app'); +const root = hydrateRoot(container, ); +// A diferencia de `createRoot`, aquí no necesitas llamar a `root.render()` por separado. +``` + +Para obtener más información, consulta la discusión del grupo de trabajo aquí. + +**Nota** +Si tu aplicación deja de funcionar después de la actualización, verifica si está envuelta en ``. Strict Mode se ha vuelto más estricto en React 18, y es posible que no todos tus componentes sean resistentes a las nuevas comprobaciones que agrega en el modo de desarrollo. Si al quitar Strict Mode se soluciona el problema de tu aplicación, puedes eliminarlo durante la actualización y luego agregarlo nuevamente (ya sea en la parte superior o para una parte del árbol) después de corregir los problemas que señala. + +Actualizaciones de las API de Renderizado del Servidor + +En esta versión, estamos renovando nuestras API de `react-dom/server` para admitir por completo Suspense en el servidor y el renderizado de transmisión. Como parte de estos cambios, estamos deprecando la antigua API de transmisión de nodo (`Node streaming API`), que no admite la transmisión incremental de Suspense en el servidor. + +El uso de esta API ahora mostrará una advertencia: + +`renderToNodeStream`: Deprecado ⛔️️ + +En su lugar, para transmisión en entornos Node, usa: + +`renderToPipeableStream`: Nuevo ✨ + +También estamos introduciendo una nueva API para admitir el renderizado de transmisión con Suspense en entornos de tiempo de ejecución de vanguardia, como Deno y Cloudflare Workers: + +`renderToReadableStream`: Nuevo ✨ + +Las siguientes API seguirán funcionando, pero con soporte limitado para Suspense: + +`renderToString`: Limitado ⚠️ +`renderToStaticMarkup`: Limitado ⚠️ + +Finalmente, esta API seguirá funcionando para el renderizado de correos electrónicos: + +`renderToStaticNodeStream` + +Para obtener más información sobre los cambios en las API de renderizado del servidor, consulta la publicación del grupo de trabajo sobre la actualización a React 18 en el servidor, una descripción detallada de la nueva arquitectura de Suspense SSR y la charla de Shaundai Person sobre el renderizado de servidor de transmisión con Suspense en React Conf 2021. + +Actualizaciones de las Definiciones de TypeScript + +Si tu proyecto utiliza TypeScript, deberás actualizar las dependencias de `@types/react` y `@types/react-dom` a las últimas versiones. Los nuevos tipos son más seguros y detectan problemas que solían ser ignorados por el comprobador de tipos. El cambio más notable es que ahora es necesario listar explícitamente la propiedad `children` al definir props, por ejemplo: + +```typescript +interface MyButtonProps { + color: string; + children?: React.ReactNode; +} +``` + +## Cambios en los tipos + +Consulta la solicitud de extracción de los tipos de React 18 para obtener una lista completa de los cambios exclusivos en los tipos. También incluye enlaces a correcciones de ejemplo en los tipos de biblioteca para que puedas ver cómo ajustar tu código. Puedes utilizar el script de migración automática para ayudar a adaptar tu código de aplicación a los nuevos tipos más rápidos y seguros. + +Si encuentras un error en los tipos, por favor, crea un problema en el repositorio DefinitelyTyped. + +## Batching automático + +React 18 agrega mejoras de rendimiento incorporadas realizando más agrupaciones de actualizaciones automáticamente. La agrupación (batching) es cuando React agrupa múltiples actualizaciones de estado en una sola re-renderización para mejorar el rendimiento. Antes de React 18, solo se agrupaban las actualizaciones dentro de los controladores de eventos de React. Las actualizaciones dentro de promesas, setTimeout, controladores de eventos nativos u otros eventos no se agrupaban en React de forma predeterminada: + +Antes de React 18, solo se agrupaban los eventos de React: + +```javascript +function handleClick() { + setCount(c => c + 1); + setFlag(f => !f); + // React solo volverá a renderizar una vez al final (¡eso es agrupación!) +} + +setTimeout(() => { + setCount(c => c + 1); + setFlag(f => !f); + // React renderizará dos veces, una vez por cada actualización de estado (sin agrupación) +}, 1000); +``` + +A partir de React 18 y con `createRoot`, todas las actualizaciones se agruparán automáticamente, sin importar su origen. Esto significa que las actualizaciones dentro de `setTimeout`, promesas, controladores de eventos nativos u otros eventos se agruparán de la misma manera que las actualizaciones dentro de eventos de React: + +Después de React 18, las actualizaciones dentro de `setTimeout`, promesas, controladores de eventos nativos u otros eventos se agrupan: + +```javascript +function handleClick() { + setCount(c => c + 1); + setFlag(f => !f); + // React solo volverá a renderizar una vez al final (¡eso es agrupación!) +} + +setTimeout(() => { + setCount(c => c + 1); + setFlag(f => !f); + // React solo volverá a renderizar una vez al final (¡eso es agrupación!) +}, 1000); +``` + +Este es un cambio que rompe la compatibilidad, pero esperamos que resulte en menos trabajo de renderización y, por lo tanto, en un mejor rendimiento en tus aplicaciones. Si deseas desactivar la agrupación automática, puedes utilizar `flushSync`: + +```javascript +import { flushSync } from 'react-dom'; + +function handleClick() { + flushSync(() => { + setCounter(c => c + 1); + }); + // React ya ha actualizado el DOM en este punto + flushSync(() => { + setFlag(f => !f); + }); + // React ya ha actualizado el DOM en este punto +} +``` + +Para obtener más información, consulta la explicación detallada sobre la agrupación automática. + +## Nuevas API para bibliotecas + +En el Grupo de Trabajo de React 18, trabajamos con los + + mantenedores de bibliotecas para crear nuevas API necesarias para admitir la representación concurrente en casos de uso específicos de las bibliotecas, como estilos y almacenes externos. Para admitir React 18, algunas bibliotecas deberán cambiar a una de las siguientes API: + +- `useSyncExternalStore` es un nuevo hook que permite a los almacenes externos admitir lecturas concurrentes forzando que las actualizaciones del almacén sean síncronas. Esta nueva API se recomienda para cualquier biblioteca que se integre con el estado externo a React. Para obtener más información, consulta la publicación general y los detalles de la API de `useSyncExternalStore`. + +- `useInsertionEffect` es un nuevo hook que permite a las bibliotecas de CSS-in-JS abordar problemas de rendimiento al inyectar estilos en la representación. A menos que ya hayas creado una biblioteca de CSS-in-JS, no esperamos que uses esto. Este hook se ejecutará después de que el DOM haya sufrido mutaciones, pero antes de que los efectos de diseño lean el nuevo diseño. Esto soluciona un problema que ya existía en React 17 y versiones anteriores, pero es aún más importante en React 18 porque React le da prioridad al navegador durante la representación concurrente, lo que le permite volver a calcular el diseño. Para obtener más información, consulta la Guía de actualización de bibliotecas para `