From e3ae2d14355477f72677e1455a4fc7931a8a633c Mon Sep 17 00:00:00 2001 From: Rick Hanlon Date: Fri, 25 Feb 2022 16:33:32 -0500 Subject: [PATCH 01/23] Blog Draft: React 18 RC Upgrade Guide --- content/blog/2022-02-25-react-v18-rc.md | 213 ++++++++++++++++++ .../blog/react-v18-rc/reactdom_warning.png | Bin 0 -> 48368 bytes 2 files changed, 213 insertions(+) create mode 100644 content/blog/2022-02-25-react-v18-rc.md create mode 100644 content/images/blog/react-v18-rc/reactdom_warning.png diff --git a/content/blog/2022-02-25-react-v18-rc.md b/content/blog/2022-02-25-react-v18-rc.md new file mode 100644 index 00000000000..a3b9a65de90 --- /dev/null +++ b/content/blog/2022-02-25-react-v18-rc.md @@ -0,0 +1,213 @@ +--- +title: "React v18.0 Release Candidate: Upgrade Guide" +author: [rickhanlonii] +--- + +Today we’re publishing the second release candidate for React 18. With this release, we’re encouraging users to install and test React 18 to [raise any issues](https://github.com/facebook/react/issues) for any problems you encounter in the upgrade before we publish the full stable release. + +As we shared at [React Conf](https://reactjs.org/blog/2021/12/17/react-conf-2021-recap.html), React 18 will include our new concurrent renderer and a gradual migration strategy for concurrent features. React 18 also includes a small number of breaking changes and features outside of concurrent rendering. In this post we will describe the changes to expect when upgrading to React 18. + +*Note for React Native users: React 18 will ship in React Native with the New React Native Architecture. For more information, see the [React Conf keynote here](https://www.youtube.com/watch?v=FZ0cG47msEk&t=1530s).* + +## Installing + +To install the latest React 18 RC, use the `@rc` tag: + +```bash +npm install react@rc react-dom@rc +``` + +Or if you’re using yarn: + +```bash +yarn add react@rc react-dom@rc +``` + +## New client root APIs + +When you first install React 18, you will see a warning in the console: + +![Screenshot of React error with text "Warning: ReactDOM.render is no longer supported in React 18. Use createRoot instead. Until you switch to the new API, your app will behave as if it's running React 17."](../images/blog/react-v18-rc/reactdom_warning.png) + +React 18 introduces a new root API which provides better ergonomics for managing roots. The new root API also enables the new concurrent renderer, which allows you to opt-into concurrent features. + +To upgrade `ReactDOM.render`: + +```js +// Before +const container = document.getElementById('app'); +ReactDOM.render(, container); +unmountComponentAtNode(containter); // ...some time later + +// After +const container = document.getElementById('app'); +const root = ReactDOM.createRoot(container); +root.render(); + +``` + +We’ve also changed `unmountComponentAtNode` to `root.unmount`: + +```js +// Before +unmountComponentAtNode(containter); + +// After +root.unmount(); +``` + +And removed the callback from `render`: + +```js +// Before +const container = document.getElementById('app'); +ReactDOM.render(, container, () => { + console.log('rendered'); +}); + +// After +function AppWithCallbackAfterRender() { + useEffect(() => { + console.log('rendered'); + }); + + return +} + +const container = document.getElementById('app'); +const root = ReactDOM.createRoot(container); +root.render(); +``` + +Finally, to upgrade `ReactDOM.hydrate`: + +```js +// Before +const container = document.getElementById('app'); +ReactDOM.hydrate(, container); + +// After +const container = document.getElementById('app'); +const root = ReactDOM.hydrateRoot(container, ); +// Unlike with createRoot, you don't need a separate root.render() call here. +``` + +For more information, see the [working group discussion here](https://github.com/reactwg/react-18/discussions/5). + +## Updates to server rendering APIs + +In this release, we’re revamping our server rendering APIs to support Suspense on the server and Streaming SSR. + +As part of these changes, the following APIs will continue working, but with limited support for Suspense. Instead of erroring, these APIs will server render the nearest fallback for any subtree that suspends, and retry rendering on the client: + +* `renderToString` +* `renderToStaticMarkup` + +For full support of Suspense on the server, React 18 introduces a new recommended API. This API will retry suspended Suspense boundaries on the server, streaming the server-rendered content to the client when it is available: + +* `renderToPipeableStream` + +This new streaming API replaces the old streaming APIs, which are now deprecated and will warn: + +* `renderToNodeStream` +* `renderToStaticNodeStream` + +For more information on the changes to these APIs, see the working group post [here](https://github.com/reactwg/react-18/discussions/22), a deep dive on the new Suspense SSR Architecture [here](https://github.com/reactwg/react-18/discussions/37), and [Shaundai Person’s](https://twitter.com/shaundai) talk on [Streaming Server Rendering with Suspense](https://www.youtube.com/watch?v=pj5N-Khihgc) at React Conf 2021. + +## Automatic batching + +React 18 adds out-of-the-box performance improvements by doing more batching by default. Batching is when React groups multiple state updates into a single re-render for better performance. Before React 18, we only batched updates inside React event handlers. Updates inside of promises, setTimeout, native event handlers, or any other event were not batched in React by default: + +```js +// Before React 18 only React events were batched + +function handleClick() { + setCount(c => c + 1); + setFlag(f => !f); + // React will only re-render once at the end (that's batching!) +} + +setTimeout(() => { + setCount(c => c + 1); + setFlag(f => !f); + // React will render twice, once for each state update (no batching) +}, 1000); +``` + + +Starting in React 18 with `createRoot`, all updates will be automatically batched, no matter where they originate from. This means that updates inside of timeouts, promises, native event handlers or any other event will batch the same way as updates inside of React events: + +```js +// After React 18 updates inside of timeouts, promises, +// native event handlers or any other event are batched. + +function handleClick() { + setCount(c => c + 1); + setFlag(f => !f); + // React will only re-render once at the end (that's batching!) +} + +setTimeout(() => { + setCount(c => c + 1); + setFlag(f => !f); + // React will only re-render once at the end (that's batching!) +}, 1000); +``` + +This is a breaking change, but we expect this to result in less work rendering, and therefore better performance in your applications. To opt-out of automatic batching, you can use `ReactDOM.flushSync`: + +```js +function handleClick() { + flushSync(() => { + setCounter(c => c + 1); + }); + // React has updated the DOM by now + flushSync(() => { + setFlag(f => !f); + }); + // React has updated the DOM by now +} +``` + +For more information, see the deep dive in the [working group here.](https://github.com/reactwg/react-18/discussions/21) + +## New APIs for libraries + +In the React 18 Working Group we worked with library maintainers to create new APIs needed to support concurrent rendering for use cases specific to their use case in areas like styles, external stores, and accessibility. To support React 18, some libraries may need to switch to one of the following APIs: + +* `useID` is a new hook for generating unique IDs on both the client and server, while avoiding hydration mismatches. This solves an issue that already exists in React 17 and below, but it's even more important in React 18 because of how our streaming server renderer delivers HTML out-of-order. For more information see the post [here](https://github.com/reactwg/react-18/discussions/111). +* `useSyncExternalStore` is a new hook that allows external stores to support concurrent reads by forcing updates to the store to be synchronous. This new API is recommended for any library that integrates with state external to React. For more information, see the overview [here](https://github.com/reactwg/react-18/discussions/70) and API details [here](https://github.com/reactwg/react-18/discussions/86). +* `useInsertionEffect` is a new hook that allows CSS-in-JS libraries to address performance issues of injecting styles in render. This hook will run after the DOM is mutated, but before layout effects read the new layout. This solves an issue that already exists in React 17 and below, but is even more important in React 18 because React yields to the browser during concurrent rendering, giving it a chance to recalculate layout. For more information, see the post [here](https://github.com/reactwg/react-18/discussions/110). + +React 18 also introduces new APIs for concurrent rendering such as `startTransition` and `useDeferredValue`, which we will share more about in the upcoming stable release post. + +## Adding Strict Effects to Strict Mode + +In the future, we'd like to add features to React which would allow a component to mount without immediately creating effects (such as pre-rendering), or to destroy effects in already-mounted components (such as when a component becomes no longer visible). These features will add better performance and resource management out-of-the-box to React, but require effects to be decoupled from the component lifecycle and resilient to being created and destroyed multiple times in a component. + +To help surface these issues, React 18 introduced Strict Effects to Strict Mode. With Strict Effects, React will automatically destroy and re-create every effect in development, whenever a component mounts. + +For more information, see the Working Group posts for [Adding Strict Effects to Strict Mode](https://github.com/reactwg/react-18/discussions/19) and [How to Support Strict Effects](https://github.com/reactwg/react-18/discussions/18). + +## Testing + +TODO: +* `IS_REACT_ACT_ENVIRONMENT` https://github.com/reactwg/react-18/discussions/102 + +## Dropping support for Internet Explorer + +In this release, React dropping support for Internet Explorer, which is going end of life on June 15, 2022. We’re making this change now because new features introduced in React 18 are built using modern browser features such as microtasks which cannot be adequately polyfilled in IE. + +If you need to support Internet Explorer we recommend you stay with React 17. + +## Other Changes + +* [Update to remove the "setState on unmounted component" warning](https://github.com/reactwg/react-18/discussions/82) +* [Suspense no longer requires a `fallback` prop to capture](https://github.com/reactwg/react-18/discussions/72) +* [Components can now render undefined](https://github.com/reactwg/react-18/discussions/75) +* [Deprecated renderSubtreeIntoContainer](https://github.com/facebook/react/pull/23355) +* [StrictMode updated to not silence double logging by default](https://github.com/reactwg/react-18/discussions/96) + +## Changelog + +TODO diff --git a/content/images/blog/react-v18-rc/reactdom_warning.png b/content/images/blog/react-v18-rc/reactdom_warning.png new file mode 100644 index 0000000000000000000000000000000000000000..6b2afba97bdb6047bd037bb72ac978cd1be2e833 GIT binary patch literal 48368 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 R8J_@ulA>}Vl|uTy{|7G7-wXf% literal 0 HcmV?d00001 From fb51e553ca48ee67b9cff6ba94ffb36960a4e599 Mon Sep 17 00:00:00 2001 From: Ricky Date: Mon, 28 Feb 2022 13:11:59 -0500 Subject: [PATCH 02/23] Update content/blog/2022-02-25-react-v18-rc.md Co-authored-by: Sebastian Silbermann --- content/blog/2022-02-25-react-v18-rc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/blog/2022-02-25-react-v18-rc.md b/content/blog/2022-02-25-react-v18-rc.md index a3b9a65de90..0a408bfe671 100644 --- a/content/blog/2022-02-25-react-v18-rc.md +++ b/content/blog/2022-02-25-react-v18-rc.md @@ -3,7 +3,7 @@ title: "React v18.0 Release Candidate: Upgrade Guide" author: [rickhanlonii] --- -Today we’re publishing the second release candidate for React 18. With this release, we’re encouraging users to install and test React 18 to [raise any issues](https://github.com/facebook/react/issues) for any problems you encounter in the upgrade before we publish the full stable release. +Today we’re publishing the second release candidate for React 18. With this release, we’re encouraging users to install and test React 18 to [raise any issues](https://github.com/facebook/react/issues/new/choose) for any problems you encounter in the upgrade before we publish the full stable release. As we shared at [React Conf](https://reactjs.org/blog/2021/12/17/react-conf-2021-recap.html), React 18 will include our new concurrent renderer and a gradual migration strategy for concurrent features. React 18 also includes a small number of breaking changes and features outside of concurrent rendering. In this post we will describe the changes to expect when upgrading to React 18. From 97122964cafcdf3d1b03f550037b86edaf2a48d0 Mon Sep 17 00:00:00 2001 From: Ricky Date: Mon, 28 Feb 2022 13:12:18 -0500 Subject: [PATCH 03/23] Update content/blog/2022-02-25-react-v18-rc.md Co-authored-by: Sebastian Silbermann --- content/blog/2022-02-25-react-v18-rc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/blog/2022-02-25-react-v18-rc.md b/content/blog/2022-02-25-react-v18-rc.md index 0a408bfe671..c8eb0a31b2d 100644 --- a/content/blog/2022-02-25-react-v18-rc.md +++ b/content/blog/2022-02-25-react-v18-rc.md @@ -112,7 +112,7 @@ This new streaming API replaces the old streaming APIs, which are now deprecated * `renderToNodeStream` * `renderToStaticNodeStream` -For more information on the changes to these APIs, see the working group post [here](https://github.com/reactwg/react-18/discussions/22), a deep dive on the new Suspense SSR Architecture [here](https://github.com/reactwg/react-18/discussions/37), and [Shaundai Person’s](https://twitter.com/shaundai) talk on [Streaming Server Rendering with Suspense](https://www.youtube.com/watch?v=pj5N-Khihgc) at React Conf 2021. +For more information on the changes to these APIs, see the working group post on [Upgrading to React 18 on the server](https://github.com/reactwg/react-18/discussions/22), a [deep dive on the new Suspense SSR Architecture](https://github.com/reactwg/react-18/discussions/37), and [Shaundai Person’s](https://twitter.com/shaundai) talk on [Streaming Server Rendering with Suspense](https://www.youtube.com/watch?v=pj5N-Khihgc) at React Conf 2021. ## Automatic batching From 56f7ed39e2da2760945eef8f5e1f754bbb95ad89 Mon Sep 17 00:00:00 2001 From: Ricky Date: Mon, 28 Feb 2022 13:12:24 -0500 Subject: [PATCH 04/23] Update content/blog/2022-02-25-react-v18-rc.md Co-authored-by: Sebastian Silbermann --- content/blog/2022-02-25-react-v18-rc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/blog/2022-02-25-react-v18-rc.md b/content/blog/2022-02-25-react-v18-rc.md index c8eb0a31b2d..ef3b11f3772 100644 --- a/content/blog/2022-02-25-react-v18-rc.md +++ b/content/blog/2022-02-25-react-v18-rc.md @@ -169,7 +169,7 @@ function handleClick() { } ``` -For more information, see the deep dive in the [working group here.](https://github.com/reactwg/react-18/discussions/21) +For more information, see the [Automatic batching deep dive](https://github.com/reactwg/react-18/discussions/21). ## New APIs for libraries From 84890dc77202e7044e161d6c29e4abbe05c3247f Mon Sep 17 00:00:00 2001 From: Ricky Date: Mon, 28 Feb 2022 13:12:38 -0500 Subject: [PATCH 05/23] Update content/blog/2022-02-25-react-v18-rc.md Co-authored-by: Sebastian Silbermann --- content/blog/2022-02-25-react-v18-rc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/blog/2022-02-25-react-v18-rc.md b/content/blog/2022-02-25-react-v18-rc.md index ef3b11f3772..fcbcc46ac84 100644 --- a/content/blog/2022-02-25-react-v18-rc.md +++ b/content/blog/2022-02-25-react-v18-rc.md @@ -175,7 +175,7 @@ For more information, see the [Automatic batching deep dive](https://github.com/ In the React 18 Working Group we worked with library maintainers to create new APIs needed to support concurrent rendering for use cases specific to their use case in areas like styles, external stores, and accessibility. To support React 18, some libraries may need to switch to one of the following APIs: -* `useID` is a new hook for generating unique IDs on both the client and server, while avoiding hydration mismatches. This solves an issue that already exists in React 17 and below, but it's even more important in React 18 because of how our streaming server renderer delivers HTML out-of-order. For more information see the post [here](https://github.com/reactwg/react-18/discussions/111). +* `useID` is a new hook for generating unique IDs on both the client and server, while avoiding hydration mismatches. This solves an issue that already exists in React 17 and below, but it's even more important in React 18 because of how our streaming server renderer delivers HTML out-of-order. For more information see the [useId post in the working group](https://github.com/reactwg/react-18/discussions/111). * `useSyncExternalStore` is a new hook that allows external stores to support concurrent reads by forcing updates to the store to be synchronous. This new API is recommended for any library that integrates with state external to React. For more information, see the overview [here](https://github.com/reactwg/react-18/discussions/70) and API details [here](https://github.com/reactwg/react-18/discussions/86). * `useInsertionEffect` is a new hook that allows CSS-in-JS libraries to address performance issues of injecting styles in render. This hook will run after the DOM is mutated, but before layout effects read the new layout. This solves an issue that already exists in React 17 and below, but is even more important in React 18 because React yields to the browser during concurrent rendering, giving it a chance to recalculate layout. For more information, see the post [here](https://github.com/reactwg/react-18/discussions/110). From ede8f3b1f9768a2cb8e8aeb60e43c18fdb77eb1f Mon Sep 17 00:00:00 2001 From: Ricky Date: Mon, 28 Feb 2022 13:12:46 -0500 Subject: [PATCH 06/23] Update content/blog/2022-02-25-react-v18-rc.md Co-authored-by: Sebastian Silbermann --- content/blog/2022-02-25-react-v18-rc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/blog/2022-02-25-react-v18-rc.md b/content/blog/2022-02-25-react-v18-rc.md index fcbcc46ac84..de1b6714e67 100644 --- a/content/blog/2022-02-25-react-v18-rc.md +++ b/content/blog/2022-02-25-react-v18-rc.md @@ -176,7 +176,7 @@ For more information, see the [Automatic batching deep dive](https://github.com/ In the React 18 Working Group we worked with library maintainers to create new APIs needed to support concurrent rendering for use cases specific to their use case in areas like styles, external stores, and accessibility. To support React 18, some libraries may need to switch to one of the following APIs: * `useID` is a new hook for generating unique IDs on both the client and server, while avoiding hydration mismatches. This solves an issue that already exists in React 17 and below, but it's even more important in React 18 because of how our streaming server renderer delivers HTML out-of-order. For more information see the [useId post in the working group](https://github.com/reactwg/react-18/discussions/111). -* `useSyncExternalStore` is a new hook that allows external stores to support concurrent reads by forcing updates to the store to be synchronous. This new API is recommended for any library that integrates with state external to React. For more information, see the overview [here](https://github.com/reactwg/react-18/discussions/70) and API details [here](https://github.com/reactwg/react-18/discussions/86). +* `useSyncExternalStore` is a new hook that allows external stores to support concurrent reads by forcing updates to the store to be synchronous. This new API is recommended for any library that integrates with state external to React. For more information, see the [useSyncExternalStore overview post](https://github.com/reactwg/react-18/discussions/70) and [useSyncExternalStore API details](https://github.com/reactwg/react-18/discussions/86). * `useInsertionEffect` is a new hook that allows CSS-in-JS libraries to address performance issues of injecting styles in render. This hook will run after the DOM is mutated, but before layout effects read the new layout. This solves an issue that already exists in React 17 and below, but is even more important in React 18 because React yields to the browser during concurrent rendering, giving it a chance to recalculate layout. For more information, see the post [here](https://github.com/reactwg/react-18/discussions/110). React 18 also introduces new APIs for concurrent rendering such as `startTransition` and `useDeferredValue`, which we will share more about in the upcoming stable release post. From 16a4e93b9cef7e9348cb3b21092b9d87b5e3658a Mon Sep 17 00:00:00 2001 From: Ricky Date: Mon, 28 Feb 2022 13:12:52 -0500 Subject: [PATCH 07/23] Update content/blog/2022-02-25-react-v18-rc.md Co-authored-by: Sebastian Silbermann --- content/blog/2022-02-25-react-v18-rc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/blog/2022-02-25-react-v18-rc.md b/content/blog/2022-02-25-react-v18-rc.md index de1b6714e67..ca20696d1bb 100644 --- a/content/blog/2022-02-25-react-v18-rc.md +++ b/content/blog/2022-02-25-react-v18-rc.md @@ -177,7 +177,7 @@ In the React 18 Working Group we worked with library maintainers to create new A * `useID` is a new hook for generating unique IDs on both the client and server, while avoiding hydration mismatches. This solves an issue that already exists in React 17 and below, but it's even more important in React 18 because of how our streaming server renderer delivers HTML out-of-order. For more information see the [useId post in the working group](https://github.com/reactwg/react-18/discussions/111). * `useSyncExternalStore` is a new hook that allows external stores to support concurrent reads by forcing updates to the store to be synchronous. This new API is recommended for any library that integrates with state external to React. For more information, see the [useSyncExternalStore overview post](https://github.com/reactwg/react-18/discussions/70) and [useSyncExternalStore API details](https://github.com/reactwg/react-18/discussions/86). -* `useInsertionEffect` is a new hook that allows CSS-in-JS libraries to address performance issues of injecting styles in render. This hook will run after the DOM is mutated, but before layout effects read the new layout. This solves an issue that already exists in React 17 and below, but is even more important in React 18 because React yields to the browser during concurrent rendering, giving it a chance to recalculate layout. For more information, see the post [here](https://github.com/reactwg/react-18/discussions/110). +* `useInsertionEffect` is a new hook that allows CSS-in-JS libraries to address performance issues of injecting styles in render. This hook will run after the DOM is mutated, but before layout effects read the new layout. This solves an issue that already exists in React 17 and below, but is even more important in React 18 because React yields to the browser during concurrent rendering, giving it a chance to recalculate layout. For more information, see the [Library Upgrade Guide for `