From 2bd6189d240703990a3c7452fd4124ba48e9f0d2 Mon Sep 17 00:00:00 2001 From: Soichiro Miki Date: Tue, 15 Oct 2024 03:56:53 +0900 Subject: [PATCH 001/120] Capitalize "Effect" (#7211) --- src/content/reference/react/useReducer.md | 2 +- src/content/reference/react/useState.md | 2 +- src/content/reference/react/useTransition.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/content/reference/react/useReducer.md b/src/content/reference/react/useReducer.md index cfd0fb856..ed3dc68c2 100644 --- a/src/content/reference/react/useReducer.md +++ b/src/content/reference/react/useReducer.md @@ -52,7 +52,7 @@ function MyComponent() { #### Caveats {/*caveats*/} * `useReducer` is a Hook, so you can only call it **at the top level of your component** or your own Hooks. You can't call it inside loops or conditions. If you need that, extract a new component and move the state into it. -* The `dispatch` function has a stable identity, so you will often see it omitted from effect dependencies, but including it will not cause the effect to fire. If the linter lets you omit a dependency without errors, it is safe to do. [Learn more about removing Effect dependencies.](/learn/removing-effect-dependencies#move-dynamic-objects-and-functions-inside-your-effect) +* The `dispatch` function has a stable identity, so you will often see it omitted from Effect dependencies, but including it will not cause the Effect to fire. If the linter lets you omit a dependency without errors, it is safe to do. [Learn more about removing Effect dependencies.](/learn/removing-effect-dependencies#move-dynamic-objects-and-functions-inside-your-effect) * In Strict Mode, React will **call your reducer and initializer twice** in order to [help you find accidental impurities.](#my-reducer-or-initializer-function-runs-twice) This is development-only behavior and does not affect production. If your reducer and initializer are pure (as they should be), this should not affect your logic. The result from one of the calls is ignored. --- diff --git a/src/content/reference/react/useState.md b/src/content/reference/react/useState.md index 4aa9d5911..23db1aae5 100644 --- a/src/content/reference/react/useState.md +++ b/src/content/reference/react/useState.md @@ -85,7 +85,7 @@ function handleClick() { * React [batches state updates.](/learn/queueing-a-series-of-state-updates) It updates the screen **after all the event handlers have run** and have called their `set` functions. This prevents multiple re-renders during a single event. In the rare case that you need to force React to update the screen earlier, for example to access the DOM, you can use [`flushSync`.](/reference/react-dom/flushSync) -* The `set` function has a stable identity, so you will often see it omitted from effect dependencies, but including it will not cause the effect to fire. If the linter lets you omit a dependency without errors, it is safe to do. [Learn more about removing Effect dependencies.](/learn/removing-effect-dependencies#move-dynamic-objects-and-functions-inside-your-effect) +* The `set` function has a stable identity, so you will often see it omitted from Effect dependencies, but including it will not cause the Effect to fire. If the linter lets you omit a dependency without errors, it is safe to do. [Learn more about removing Effect dependencies.](/learn/removing-effect-dependencies#move-dynamic-objects-and-functions-inside-your-effect) * Calling the `set` function *during rendering* is only allowed from within the currently rendering component. React will discard its output and immediately attempt to render it again with the new state. This pattern is rarely needed, but you can use it to **store information from the previous renders**. [See an example below.](#storing-information-from-previous-renders) diff --git a/src/content/reference/react/useTransition.md b/src/content/reference/react/useTransition.md index 5066fe637..b6dcb3c73 100644 --- a/src/content/reference/react/useTransition.md +++ b/src/content/reference/react/useTransition.md @@ -80,7 +80,7 @@ function TabContainer() { * The function you pass to `startTransition` must be synchronous. React immediately executes this function, marking all state updates that happen while it executes as Transitions. If you try to perform more state updates later (for example, in a timeout), they won't be marked as Transitions. -* The `startTransition` function has a stable identity, so you will often see it omitted from effect dependencies, but including it will not cause the effect to fire. If the linter lets you omit a dependency without errors, it is safe to do. [Learn more about removing Effect dependencies.](/learn/removing-effect-dependencies#move-dynamic-objects-and-functions-inside-your-effect) +* The `startTransition` function has a stable identity, so you will often see it omitted from Effect dependencies, but including it will not cause the Effect to fire. If the linter lets you omit a dependency without errors, it is safe to do. [Learn more about removing Effect dependencies.](/learn/removing-effect-dependencies#move-dynamic-objects-and-functions-inside-your-effect) * A state update marked as a Transition will be interrupted by other state updates. For example, if you update a chart component inside a Transition, but then start typing into an input while the chart is in the middle of a re-render, React will restart the rendering work on the chart component after handling the input update. From ee094926d54eef5cec54c9299842eeb822c7859b Mon Sep 17 00:00:00 2001 From: lauren Date: Thu, 17 Oct 2024 16:55:24 -0400 Subject: [PATCH 002/120] [compiler] Move React 17/18 section to its own subheading (#7230) Currently it's a little hidden, let's move it to its own subheading for more prominence --- src/content/learn/react-compiler.md | 54 +++++++++++++---------------- 1 file changed, 25 insertions(+), 29 deletions(-) diff --git a/src/content/learn/react-compiler.md b/src/content/learn/react-compiler.md index 5afaa4cf5..08e2e5672 100644 --- a/src/content/learn/react-compiler.md +++ b/src/content/learn/react-compiler.md @@ -192,61 +192,63 @@ export default function App() { When you have more confidence with rolling out the compiler, you can expand coverage to other directories as well and slowly roll it out to your whole app. -#### New projects {/*new-projects*/} - -If you're starting a new project, you can enable the compiler on your entire codebase, which is the default behavior. +### Using React Compiler with React 17 or 18 {/*using-react-compiler-with-react-17-or-18*/} -## Usage {/*installation*/} - -### Babel {/*usage-with-babel*/} +React Compiler works best with React 19 RC. If you are unable to upgrade, you can install the extra `react-compiler-runtime` package which will allow the compiled code to run on versions prior to 19. However, note that the minimum supported version is 17. -npm install babel-plugin-react-compiler@experimental +npm install react-compiler-runtime@experimental -The compiler includes a Babel plugin which you can use in your build pipeline to run the compiler. - -After installing, add it to your Babel config. Please note that it's critical that the compiler run **first** in the pipeline: +You should also add the correct `target` to your compiler config, where `target` is the major version of React you are targeting: -```js {7} +```js {3} // babel.config.js -const ReactCompilerConfig = { /* ... */ }; +const ReactCompilerConfig = { + target: '18' // '17' | '18' | '19' +}; module.exports = function () { return { plugins: [ - ['babel-plugin-react-compiler', ReactCompilerConfig], // must run first! - // ... + ['babel-plugin-react-compiler', ReactCompilerConfig], ], }; }; ``` -`babel-plugin-react-compiler` should run first before other Babel plugins as the compiler requires the input source information for sound analysis. +#### New projects {/*new-projects*/} -React Compiler works best with React 19 RC. If you are unable to upgrade, you can install the extra `react-compiler-runtime` package which will allow the compiled code to run on versions prior to 19. However, note that the minimum supported version is 17. +If you're starting a new project, you can enable the compiler on your entire codebase, which is the default behavior. + +## Usage {/*installation*/} + +### Babel {/*usage-with-babel*/} -npm install react-compiler-runtime@experimental +npm install babel-plugin-react-compiler@experimental -You should also add the correct `target` to your compiler config, where `target` is the major version of React you are targeting: +The compiler includes a Babel plugin which you can use in your build pipeline to run the compiler. -```js {3} +After installing, add it to your Babel config. Please note that it's critical that the compiler run **first** in the pipeline: + +```js {7} // babel.config.js -const ReactCompilerConfig = { - target: '18' // '17' | '18' | '19' -}; +const ReactCompilerConfig = { /* ... */ }; module.exports = function () { return { plugins: [ - ['babel-plugin-react-compiler', ReactCompilerConfig], + ['babel-plugin-react-compiler', ReactCompilerConfig], // must run first! + // ... ], }; }; ``` +`babel-plugin-react-compiler` should run first before other Babel plugins as the compiler requires the input source information for sound analysis. + ### Vite {/*usage-with-vite*/} If you use Vite, you can add the plugin to vite-plugin-react: @@ -392,12 +394,6 @@ To report issues, please first create a minimal repro on the [React Compiler Pla You can also provide feedback in the React Compiler Working Group by applying to be a member. Please see [the README for more details on joining](https://github.com/reactwg/react-compiler). -### `(0 , _c) is not a function` error {/*0--_c-is-not-a-function-error*/} - -This occurs if you are not using React 19 RC and up. To fix this, [upgrade your app to React 19 RC](https://react.dev/blog/2024/04/25/react-19-upgrade-guide) first. - -If you are unable to upgrade to React 19, you may try a userspace implementation of the cache function as described in the [Working Group](https://github.com/reactwg/react-compiler/discussions/6). However, please note that this is not recommended and you should upgrade to React 19 when possible. - ### How do I know my components have been optimized? {/*how-do-i-know-my-components-have-been-optimized*/} [React Devtools](/learn/react-developer-tools) (v5.0+) has built-in support for React Compiler and will display a "Memo ✨" badge next to components that have been optimized by the compiler. From 9467bc58868e66c53ca9385c8531dcf7b02178c2 Mon Sep 17 00:00:00 2001 From: lauren Date: Fri, 18 Oct 2024 00:12:01 -0400 Subject: [PATCH 003/120] [compiler] Add docs for Beta (#7231) Updates our compiler docs for the latest Beta release. --- src/content/learn/react-compiler.md | 146 +++++++++------------------- 1 file changed, 48 insertions(+), 98 deletions(-) diff --git a/src/content/learn/react-compiler.md b/src/content/learn/react-compiler.md index 08e2e5672..4fc974fa9 100644 --- a/src/content/learn/react-compiler.md +++ b/src/content/learn/react-compiler.md @@ -3,7 +3,7 @@ title: React Compiler --- -This page will give you an introduction to the new experimental React Compiler and how to try it out successfully. +This page will give you an introduction to React Compiler and how to try it out successfully. @@ -19,12 +19,28 @@ These docs are still a work in progress. More documentation is available in the -React Compiler is a new experimental compiler that we've open sourced to get early feedback from the community. It still has rough edges and is not yet fully ready for production. +React Compiler is a new compiler currently in Beta, that we've open sourced to get early feedback from the community. While it has been used in production at companies like Meta, rolling out the compiler to production for your app will depend on the health of your codebase and how well you’ve followed the [Rules of React](/reference/rules). + +The latest Beta release can be found with the `@beta` tag, and daily experimental releases with `@experimental`. -React Compiler is a new experimental compiler that we've open sourced to get early feedback from the community. It is a build-time only tool that automatically optimizes your React app. It works with plain JavaScript, and understands the [Rules of React](/reference/rules), so you don't need to rewrite any code to use it. +React Compiler is a new compiler that we've open sourced to get early feedback from the community. It is a build-time only tool that automatically optimizes your React app. It works with plain JavaScript, and understands the [Rules of React](/reference/rules), so you don't need to rewrite any code to use it. + +The compiler also includes an [eslint plugin](#installing-eslint-plugin-react-compiler) that surfaces the analysis from the compiler right in your editor. **We strongly recommend everyone use the linter today.** The linter does not require that you have the compiler installed, so you can use it even if you are not ready to try out the compiler. + +The compiler is currently released as `beta`, and is available to try out on React 17+ apps and libraries. To install the Beta: -The compiler also includes an [eslint plugin](#installing-eslint-plugin-react-compiler) that surfaces the analysis from the compiler right in your editor. The plugin runs independently of the compiler and can be used even if you aren't using the compiler in your app. We recommend all React developers to use this eslint plugin to help improve the quality of your codebase. + +npm install -D babel-plugin-react-compiler@beta eslint-plugin-react-compiler@beta + + +Or, if you're using Yarn: + + +yarn add -D babel-plugin-react-compiler@beta eslint-plugin-react-compiler@beta + + +If you are not using React 19 yet, please see [the section below](#using-react-compiler-with-react-17-or-18) for further instructions. ### What does the compiler do? {/*what-does-the-compiler-do*/} @@ -94,19 +110,9 @@ However, if `expensivelyProcessAReallyLargeArrayOfObjects` is truly an expensive So if `expensivelyProcessAReallyLargeArrayOfObjects` was used in many different components, even if the same exact items were passed down, that expensive calculation would be run repeatedly. We recommend [profiling](https://react.dev/reference/react/useMemo#how-to-tell-if-a-calculation-is-expensive) first to see if it really is that expensive before making code more complicated. -### What does the compiler assume? {/*what-does-the-compiler-assume*/} - -React Compiler assumes that your code: - -1. Is valid, semantic JavaScript -2. Tests that nullable/optional values and properties are defined before accessing them (for example, by enabling [`strictNullChecks`](https://www.typescriptlang.org/tsconfig/#strictNullChecks) if using TypeScript), i.e., `if (object.nullableProperty) { object.nullableProperty.foo }` or with optional-chaining `object.nullableProperty?.foo` -3. Follows the [Rules of React](https://react.dev/reference/rules) - -React Compiler can verify many of the Rules of React statically, and will safely skip compilation when it detects an error. To see the errors we recommend also installing [eslint-plugin-react-compiler](https://www.npmjs.com/package/eslint-plugin-react-compiler). - ### Should I try out the compiler? {/*should-i-try-out-the-compiler*/} -Please note that the compiler is still experimental and has many rough edges. While it has been used in production at companies like Meta, rolling out the compiler to production for your app will depend on the health of your codebase and how well you've followed the [Rules of React](/reference/rules). +Please note that the compiler is still in Beta and has many rough edges. While it has been used in production at companies like Meta, rolling out the compiler to production for your app will depend on the health of your codebase and how well you've followed the [Rules of React](/reference/rules). **You don't have to rush into using the compiler now. It's okay to wait until it reaches a stable release before adopting it.** However, we do appreciate trying it out in small experiments in your apps so that you can [provide feedback](#reporting-issues) to us to help make the compiler better. @@ -119,7 +125,7 @@ In addition to these docs, we recommend checking the [React Compiler Working Gro Prior to installing the compiler, you can first check to see if your codebase is compatible: -npx react-compiler-healthcheck@experimental +npx react-compiler-healthcheck@beta This script will: @@ -141,7 +147,7 @@ Found no usage of incompatible libraries. React Compiler also powers an eslint plugin. The eslint plugin can be used **independently** of the compiler, meaning you can use the eslint plugin even if you don't use the compiler. -npm install eslint-plugin-react-compiler@experimental +npm install -D eslint-plugin-react-compiler@beta Then, add it to your eslint config: @@ -176,28 +182,18 @@ const ReactCompilerConfig = { }; ``` -In rare cases, you can also configure the compiler to run in "opt-in" mode using the `compilationMode: "annotation"` option. This makes it so the compiler will only compile components and hooks annotated with a `"use memo"` directive. Please note that the `annotation` mode is a temporary one to aid early adopters, and that we don't intend for the `"use memo"` directive to be used for the long term. - -```js {2,7} -const ReactCompilerConfig = { - compilationMode: "annotation", -}; +When you have more confidence with rolling out the compiler, you can expand coverage to other directories as well and slowly roll it out to your whole app. -// src/app.jsx -export default function App() { - "use memo"; - // ... -} -``` +#### New projects {/*new-projects*/} -When you have more confidence with rolling out the compiler, you can expand coverage to other directories as well and slowly roll it out to your whole app. +If you're starting a new project, you can enable the compiler on your entire codebase, which is the default behavior. ### Using React Compiler with React 17 or 18 {/*using-react-compiler-with-react-17-or-18*/} React Compiler works best with React 19 RC. If you are unable to upgrade, you can install the extra `react-compiler-runtime` package which will allow the compiled code to run on versions prior to 19. However, note that the minimum supported version is 17. -npm install react-compiler-runtime@experimental +npm install react-compiler-runtime@beta You should also add the correct `target` to your compiler config, where `target` is the major version of React you are targeting: @@ -217,16 +213,22 @@ module.exports = function () { }; ``` -#### New projects {/*new-projects*/} +### Using the compiler on libraries {/*using-the-compiler-on-libraries*/} -If you're starting a new project, you can enable the compiler on your entire codebase, which is the default behavior. +React Compiler can also be used to compile libraries. Because React Compiler needs to run on the original source code prior to any code transformations, it is not possible for an application's build pipeline to compile the libraries they use. Hence, our recommendation is for library maintainers to independently compile and test their libraries with the compiler, and ship compiled code to npm. + +Because your code is pre-compiled, users of your library will not need to have the compiler enabled in order to benefit from the automatic memoization applied to your library. If your library targets apps not yet on React 19, specify a minimum [`target` and add `react-compiler-runtime` as a direct dependency](#using-react-compiler-with-react-17-or-18). The runtime package will use the correct implementation of APIs depending on the application's version, and polyfill the missing APIs if necessary. + +Library code can often require more complex patterns and usage of escape hatches. For this reason, we recommend ensuring that you have sufficient testing in order to identify any issues that might arise from using the compiler on your library. If you identify any issues, you can always opt-out the specific components or hooks with the [`'use no memo'` directive](#something-is-not-working-after-compilation). + +Similarly to apps, it is not necessary to fully compile 100% of your components or hooks to see benefits in your library. A good starting point might be to identify the most performance sensitive parts of your library and ensuring that they don't break the [Rules of React](/reference/rules), which you can use `eslint-plugin-react-compiler` to identify. ## Usage {/*installation*/} ### Babel {/*usage-with-babel*/} -npm install babel-plugin-react-compiler@experimental +npm install babel-plugin-react-compiler@beta The compiler includes a Babel plugin which you can use in your build pipeline to run the compiler. @@ -275,36 +277,7 @@ export default defineConfig(() => { ### Next.js {/*usage-with-nextjs*/} -Next.js has an experimental configuration to enable the React Compiler. It automatically ensures Babel is set up with `babel-plugin-react-compiler`. - -- Install Next.js canary, which uses React 19 Release Candidate -- Install `babel-plugin-react-compiler` - - -npm install next@canary babel-plugin-react-compiler@experimental - - -Then configure the experimental option in `next.config.js`: - -```js {4,5,6} -// next.config.js -/** @type {import('next').NextConfig} */ -const nextConfig = { - experimental: { - reactCompiler: true, - }, -}; - -module.exports = nextConfig; -``` - -Using the experimental option ensures support for the React Compiler in: - -- App Router -- Pages Router -- Webpack (default) -- Turbopack (opt-in through `--turbo`) - +Please refer to the [Next.js docs](https://nextjs.org/docs/canary/app/api-reference/next-config-js/reactCompiler) for more information. ### Remix {/*usage-with-remix*/} Install `vite-plugin-babel`, and add the compiler's Babel plugin to it: @@ -337,40 +310,7 @@ export default defineConfig({ ### Webpack {/*usage-with-webpack*/} -You can create your own loader for React Compiler, like so: - -```js -const ReactCompilerConfig = { /* ... */ }; -const BabelPluginReactCompiler = require('babel-plugin-react-compiler'); - -function reactCompilerLoader(sourceCode, sourceMap) { - // ... - const result = transformSync(sourceCode, { - // ... - plugins: [ - [BabelPluginReactCompiler, ReactCompilerConfig], - ], - // ... - }); - - if (result === null) { - this.callback( - Error( - `Failed to transform "${options.filename}"` - ) - ); - return; - } - - this.callback( - null, - result.code, - result.map === null ? undefined : result.map - ); -} - -module.exports = reactCompilerLoader; -``` +A community Webpack loader is [now available here](https://github.com/SukkaW/react-compiler-webpack). ### Expo {/*usage-with-expo*/} @@ -394,6 +334,16 @@ To report issues, please first create a minimal repro on the [React Compiler Pla You can also provide feedback in the React Compiler Working Group by applying to be a member. Please see [the README for more details on joining](https://github.com/reactwg/react-compiler). +### What does the compiler assume? {/*what-does-the-compiler-assume*/} + +React Compiler assumes that your code: + +1. Is valid, semantic JavaScript. +2. Tests that nullable/optional values and properties are defined before accessing them (for example, by enabling [`strictNullChecks`](https://www.typescriptlang.org/tsconfig/#strictNullChecks) if using TypeScript), i.e., `if (object.nullableProperty) { object.nullableProperty.foo }` or with optional-chaining `object.nullableProperty?.foo`. +3. Follows the [Rules of React](https://react.dev/reference/rules). + +React Compiler can verify many of the Rules of React statically, and will safely skip compilation when it detects an error. To see the errors we recommend also installing [eslint-plugin-react-compiler](https://www.npmjs.com/package/eslint-plugin-react-compiler). + ### How do I know my components have been optimized? {/*how-do-i-know-my-components-have-been-optimized*/} [React Devtools](/learn/react-developer-tools) (v5.0+) has built-in support for React Compiler and will display a "Memo ✨" badge next to components that have been optimized by the compiler. From 8f6d6a92a496ab758e03000928bdacbbbafaddd3 Mon Sep 17 00:00:00 2001 From: lauren Date: Mon, 21 Oct 2024 12:13:10 -0400 Subject: [PATCH 004/120] [compiler] Remove section on healthcheck (#7239) * [compiler] Remove section on healthcheck This package will be deprecated soon. It makes adopting the compiler confusing since it can spread the misconception that you need to have all your components successfully compiled before you can use the compiler. For now let's remove this from our docs and deprecate the package on npm. We can always choose to repurpose this in the future. * Clarify that 100% compilation is not necessary --- src/content/learn/react-compiler.md | 28 ++++++---------------------- 1 file changed, 6 insertions(+), 22 deletions(-) diff --git a/src/content/learn/react-compiler.md b/src/content/learn/react-compiler.md index 4fc974fa9..cc7d31927 100644 --- a/src/content/learn/react-compiler.md +++ b/src/content/learn/react-compiler.md @@ -48,6 +48,10 @@ In order to optimize applications, React Compiler automatically memoizes your co The compiler uses its knowledge of JavaScript and React's rules to automatically memoize values or groups of values within your components and hooks. If it detects breakages of the rules, it will automatically skip over just those components or hooks, and continue safely compiling other code. + +React Compiler can statically detect when Rules of React are broken, and safely opt-out of optimizing just the affected components or hooks. It is not necessary for the compiler to optimize 100% of your codebase. + + If your codebase is already very well-memoized, you might not expect to see major performance improvements with the compiler. However, in practice memoizing the correct dependencies that cause performance issues is tricky to get right by hand. @@ -120,28 +124,6 @@ Please note that the compiler is still in Beta and has many rough edges. While i In addition to these docs, we recommend checking the [React Compiler Working Group](https://github.com/reactwg/react-compiler) for additional information and discussion about the compiler. -### Checking compatibility {/*checking-compatibility*/} - -Prior to installing the compiler, you can first check to see if your codebase is compatible: - - -npx react-compiler-healthcheck@beta - - -This script will: - -- Check how many components can be successfully optimized: higher is better -- Check for `` usage: having this enabled and followed means a higher chance that the [Rules of React](/reference/rules) are followed -- Check for incompatible library usage: known libraries that are incompatible with the compiler - -As an example: - - -Successfully compiled 8 out of 9 components. -StrictMode usage not found. -Found no usage of incompatible libraries. - - ### Installing eslint-plugin-react-compiler {/*installing-eslint-plugin-react-compiler*/} React Compiler also powers an eslint plugin. The eslint plugin can be used **independently** of the compiler, meaning you can use the eslint plugin even if you don't use the compiler. @@ -165,7 +147,9 @@ module.exports = { The eslint plugin will display any violations of the rules of React in your editor. When it does this, it means that the compiler has skipped over optimizing that component or hook. This is perfectly okay, and the compiler can recover and continue optimizing other components in your codebase. + **You don't have to fix all eslint violations straight away.** You can address them at your own pace to increase the amount of components and hooks being optimized, but it is not required to fix everything before you can use the compiler. + ### Rolling out the compiler to your codebase {/*using-the-compiler-effectively*/} From d9e650fe6ec6a8b2da56543c54126c408705353f Mon Sep 17 00:00:00 2001 From: lauren Date: Mon, 21 Oct 2024 14:22:35 -0400 Subject: [PATCH 005/120] Add React Compiler Beta Release post (#7240) Add a new blog post announcing the React Compiler Beta release! --- .../2024/10/21/react-compiler-beta-release.md | 126 ++++++++++++++++++ src/content/blog/index.md | 6 + src/sidebarBlog.json | 7 + 3 files changed, 139 insertions(+) create mode 100644 src/content/blog/2024/10/21/react-compiler-beta-release.md diff --git a/src/content/blog/2024/10/21/react-compiler-beta-release.md b/src/content/blog/2024/10/21/react-compiler-beta-release.md new file mode 100644 index 000000000..bba93e4ee --- /dev/null +++ b/src/content/blog/2024/10/21/react-compiler-beta-release.md @@ -0,0 +1,126 @@ +--- +title: "React Compiler Beta Release" +author: Lauren Tan +date: 2024/10/21 +description: At React Conf 2024, we announced the experimental release of React Compiler, a build-time tool that optimizes your React app through automatic memoization. In this post, we want to share what's next for open source, and our progress on the compiler. + +--- + +October 21, 2024 by [Lauren Tan](https://twitter.com/potetotes). + +--- + + + +The React team is excited to share new updates: + + + +1. We're publishing React Compiler Beta today, so that early adopters and library maintainers can try it and provide feedback. +2. We're officially supporting React Compiler for apps on React 17+, through an optional `react-compiler-runtime` package. +3. We're opening up public membership of the [React Compiler Working Group](https://github.com/reactwg/react-compiler) to prepare the community for gradual adoption of the compiler. + +--- + +At [React Conf 2024](/blog/2024/05/22/react-conf-2024-recap), we announced the experimental release of React Compiler, a build-time tool that optimizes your React app through automatic memoization. [You can find an introduction to React Compiler here](/learn/react-compiler). + +Since the first release, we've fixed numerous bugs reported by the React community, received several high quality bug fixes and contributions[^1] to the compiler, made the compiler more resilient to the broad diversity of JavaScript patterns, and have continued to roll out the compiler more widely at Meta. + +In this post, we want to share what's next for React Compiler. + +## Try React Compiler Beta today {/*try-react-compiler-beta-today*/} + +At [React India 2024](https://www.youtube.com/watch?v=qd5yk2gxbtg), we shared an update on React Compiler. Today, we are excited to announce a new Beta release of React Compiler and ESLint plugin. New betas are published to npm using the `@beta` tag. + +To install React Compiler Beta: + + +npm install -D babel-plugin-react-compiler@beta eslint-plugin-react-compiler@beta + + +Or, if you're using Yarn: + + +yarn add -D babel-plugin-react-compiler@beta eslint-plugin-react-compiler@beta + + +You can watch [Sathya Gunasekaran's](https://twitter.com/_gsathya) talk at React India here: + + + +## We recommend everyone use the React Compiler linter today {/*we-recommend-everyone-use-the-react-compiler-linter-today*/} + +React Compiler’s eslint plugin helps developers proactively identify and correct [Rules of React](/reference/rules) violations. **We strongly recommend everyone use the linter today**. The linter does not require that you have the compiler installed, so you can use it independently, even if you are not ready to try out the compiler. + +To install the linter only: + + +npm install -D eslint-plugin-react-compiler@beta + + +Or, if you're using Yarn: + + +yarn add -D eslint-plugin-react-compiler@beta + + +Using the linter helps identify Rules of React breakages, making it easier to adopt the compiler when it's fully released. + +## Backwards Compatibility {/*backwards-compatibility*/} + +React Compiler produces code that depends on runtime APIs added in React 19, but we've since added support for the compiler to also work with React 17 and 18. If you are not on React 19 yet, in the Beta release you can now try out React Compiler by specifying a minimum `target` in your compiler config, and adding `react-compiler-runtime` as a dependency. [You can find docs on this here](/learn/react-compiler#using-react-compiler-with-react-17-or-18). + +## Using React Compiler in libraries {/*using-react-compiler-in-libraries*/} + +Our initial release was focused on identifying major issues with using the compiler in applications. We've gotten great feedback and have substantially improved the compiler since then. We're now ready for broad feedback from the community, and for library authors to try out the compiler to improve performance and the developer experience of maintaining your library. + +React Compiler can also be used to compile libraries. Because React Compiler needs to run on the original source code prior to any code transformations, it is not possible for an application's build pipeline to compile the libraries they use. Hence, our recommendation is for library maintainers to independently compile and test their libraries with the compiler, and ship compiled code to npm. + +Because your code is pre-compiled, users of your library will not need to have the compiler enabled in order to benefit from the automatic memoization applied to your library. If your library targets apps not yet on React 19, specify a minimum `target` and add `react-compiler-runtime` as a direct dependency. The runtime package will use the correct implementation of APIs depending on the application's version, and polyfill the missing APIs if necessary. + +[You can find more docs on this here.](/learn/react-compiler#using-the-compiler-on-libraries) + +## Opening up React Compiler Working Group to everyone {/*opening-up-react-compiler-working-group-to-everyone*/} + +We previously announced the invite-only [React Compiler Working Group](https://github.com/reactwg/react-compiler) at React Conf to provide feedback, ask questions, and collaborate on the compiler's experimental release. + +From today, together with the Beta release of React Compiler, we are opening up Working Group membership to everyone. The goal of the React Compiler Working Group is to prepare the ecosystem for a smooth, gradual adoption of React Compiler by existing applications and libraries. Please continue to file bug reports in the [React repo](https://github.com/facebook/react), but please leave feedback, ask questions, or share ideas in the [Working Group discussion forum](https://github.com/reactwg/react-compiler/discussions). + +The core team will also use the discussions repo to share our research findings. As the Stable Release gets closer, any important information will also be posted on this forum. + +## React Compiler at Meta {/*react-compiler-at-meta*/} + +At [React Conf](/blog/2024/05/22/react-conf-2024-recap), we shared that our rollout of the compiler on Quest Store and Instagram were successful. Since then, we've deployed React Compiler across several more major web apps at Meta, including [Facebook](https://www.facebook.com) and [Threads](https://www.threads.net). That means if you've used any of these apps recently, you may have had your experience powered by the compiler. We were able to onboard these apps onto the compiler with few code changes required, in a monorepo with more than 100,000 React components. + +We've seen notable performance improvements across all of these apps. As we've rolled out, we're continuing to see results on the order of [the wins we shared previously at ReactConf](https://youtu.be/lyEKhv8-3n0?t=3223). These apps have already been heavily hand tuned and optimized by Meta engineers and React experts over the years, so even improvements on the order of a few percent are a huge win for us. + +We also expected developer productivity wins from React Compiler. To measure this, we collaborated with our data science partners at Meta[^2] to conduct a thorough statistical analysis of the impact of manual memoization on productivity. Before rolling out the compiler at Meta, we discovered that only about 8% of React pull requests used manual memoization and that these pull requests took 31-46% longer to author[^3]. This confirmed our intuition that manual memoization introduces cognitive overhead, and we anticipate that React Compiler will lead to more efficient code authoring and review. Notably, React Compiler also ensures that *all* code is memoized by default, not just the (in our case) 8% where developers explicitly apply memoization. + +## Roadmap to Stable {/*roadmap-to-stable*/} + +*This is not a final roadmap, and is subject to change.* + +We intend to ship a Release Candidate of the compiler in the near future following the Beta release, when the majority of apps and libraries that follow the Rules of React have been proven to work well with the compiler. After a period of final feedback from the community, we plan on a Stable Release for the compiler. The Stable Release will mark the beginning of a new foundation for React, and all apps and libraries will be strongly recommended to use the compiler and eslint plugin. + +* ✅ Experimental: Released at React Conf 2024, primarily for feedback from early adopters. +* ✅ Public Beta: Available today, for feedback from the wider community. +* 🚧 Release Candidate (RC): React Compiler works for the majority of rule-following apps and libraries without issue. +* 🚧 General Availability: After final feedback period from the community. + +These releases also include the compiler's eslint plugin, which surfaces diagnostics statically analyzed by the compiler. We plan to combine the existing eslint-plugin-react-hooks plugin with the compiler's eslint plugin, so only one plugin needs to be installed. + +Post-Stable, we plan to add more compiler optimizations and improvements. This includes both continual improvements to automatic memoization, and new optimizations altogether, with minimal to no change of product code. Upgrading to each new release of the compiler is aimed to be straightforward, and each upgrade will continue to improve performance and add better handling of diverse JavaScript and React patterns. + +Throughout this process, we also plan to prototype an IDE extension for React. It is still very early in research, so we expect to be able to share more of our findings with you in a future React Labs blog post. + +--- + +Thanks to [Sathya Gunasekaran](https://twitter.com/_gsathya), [Joe Savona](https://twitter.com/en_JS), [Ricky Hanlon](https://twitter.com/rickhanlonii), [Alex Taylor](https://github.com/alexmckenley), [Jason Bonta](https://twitter.com/someextent), and [Eli White](https://twitter.com/Eli_White) for reviewing and editing this post. + +--- + +[^1]: Thanks [@nikeee](https://github.com/facebook/react/pulls?q=is%3Apr+author%3Anikeee), [@henryqdineen](https://github.com/facebook/react/pulls?q=is%3Apr+author%3Ahenryqdineen), [@TrickyPi](https://github.com/facebook/react/pulls?q=is%3Apr+author%3ATrickyPi), and several others for their contributions to the compiler. + +[^2]: Thanks [Vaishali Garg](https://www.linkedin.com/in/vaishaligarg09) for leading this study on React Compiler at Meta, and for reviewing this post. + +[^3]: After controlling on author tenure, diff length/complexity, and other potential confounding factors. \ No newline at end of file diff --git a/src/content/blog/index.md b/src/content/blog/index.md index 4a1a165a3..e37631e80 100644 --- a/src/content/blog/index.md +++ b/src/content/blog/index.md @@ -10,6 +10,12 @@ This blog is the official source for the updates from the React team. Anything i
+ + +We announced an experimental release of React Compiler at React Conf 2024. We've made a lot of progress since then, and in this post we want to share what's next for React Compiler ... + + + Last week we hosted React Conf 2024, a two-day conference in Henderson, Nevada where 700+ attendees gathered in-person to discuss the latest in UI engineering. This was our first in-person conference since 2019, and we were thrilled to be able to bring the community together again ... diff --git a/src/sidebarBlog.json b/src/sidebarBlog.json index 26dcdc4dd..84947fdf5 100644 --- a/src/sidebarBlog.json +++ b/src/sidebarBlog.json @@ -11,6 +11,13 @@ "path": "/blog", "skipBreadcrumb": true, "routes": [ + { + "title": "React Compiler Beta Release and Roadmap", + "titleForHomepage": "React Compiler Beta Release and Roadmap", + "icon": "blog", + "date": "October 21, 2024", + "path": "/blog/2024/10/21/react-compiler-beta-release" + }, { "title": "React Conf 2024 Recap", "titleForHomepage": "React Conf 2024 Recap", From e2b2b90c2d3a13a4997d23cff5a8a14a004b6916 Mon Sep 17 00:00:00 2001 From: lauren Date: Mon, 21 Oct 2024 15:02:06 -0400 Subject: [PATCH 006/120] Fix capitalization of eslint (#7241) --- src/content/blog/2024/10/21/react-compiler-beta-release.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/content/blog/2024/10/21/react-compiler-beta-release.md b/src/content/blog/2024/10/21/react-compiler-beta-release.md index bba93e4ee..768a2e16b 100644 --- a/src/content/blog/2024/10/21/react-compiler-beta-release.md +++ b/src/content/blog/2024/10/21/react-compiler-beta-release.md @@ -50,7 +50,7 @@ You can watch [Sathya Gunasekaran's](https://twitter.com/_gsathya) talk at React ## We recommend everyone use the React Compiler linter today {/*we-recommend-everyone-use-the-react-compiler-linter-today*/} -React Compiler’s eslint plugin helps developers proactively identify and correct [Rules of React](/reference/rules) violations. **We strongly recommend everyone use the linter today**. The linter does not require that you have the compiler installed, so you can use it independently, even if you are not ready to try out the compiler. +React Compiler’s ESLint plugin helps developers proactively identify and correct [Rules of React](/reference/rules) violations. **We strongly recommend everyone use the linter today**. The linter does not require that you have the compiler installed, so you can use it independently, even if you are not ready to try out the compiler. To install the linter only: @@ -100,14 +100,14 @@ We also expected developer productivity wins from React Compiler. To measure thi *This is not a final roadmap, and is subject to change.* -We intend to ship a Release Candidate of the compiler in the near future following the Beta release, when the majority of apps and libraries that follow the Rules of React have been proven to work well with the compiler. After a period of final feedback from the community, we plan on a Stable Release for the compiler. The Stable Release will mark the beginning of a new foundation for React, and all apps and libraries will be strongly recommended to use the compiler and eslint plugin. +We intend to ship a Release Candidate of the compiler in the near future following the Beta release, when the majority of apps and libraries that follow the Rules of React have been proven to work well with the compiler. After a period of final feedback from the community, we plan on a Stable Release for the compiler. The Stable Release will mark the beginning of a new foundation for React, and all apps and libraries will be strongly recommended to use the compiler and ESLint plugin. * ✅ Experimental: Released at React Conf 2024, primarily for feedback from early adopters. * ✅ Public Beta: Available today, for feedback from the wider community. * 🚧 Release Candidate (RC): React Compiler works for the majority of rule-following apps and libraries without issue. * 🚧 General Availability: After final feedback period from the community. -These releases also include the compiler's eslint plugin, which surfaces diagnostics statically analyzed by the compiler. We plan to combine the existing eslint-plugin-react-hooks plugin with the compiler's eslint plugin, so only one plugin needs to be installed. +These releases also include the compiler's ESLint plugin, which surfaces diagnostics statically analyzed by the compiler. We plan to combine the existing eslint-plugin-react-hooks plugin with the compiler's ESLint plugin, so only one plugin needs to be installed. Post-Stable, we plan to add more compiler optimizations and improvements. This includes both continual improvements to automatic memoization, and new optimizations altogether, with minimal to no change of product code. Upgrading to each new release of the compiler is aimed to be straightforward, and each upgrade will continue to improve performance and add better handling of diverse JavaScript and React patterns. From a3656c235e6e51d6d761705e9adad2a00cc1292a Mon Sep 17 00:00:00 2001 From: Ricky Date: Mon, 21 Oct 2024 16:07:47 -0400 Subject: [PATCH 007/120] Add atproto-did (#7242) --- public/.well-known/atproto-did | 1 + 1 file changed, 1 insertion(+) create mode 100644 public/.well-known/atproto-did diff --git a/public/.well-known/atproto-did b/public/.well-known/atproto-did new file mode 100644 index 000000000..ad8b0a36b --- /dev/null +++ b/public/.well-known/atproto-did @@ -0,0 +1 @@ +did:plc:uorpbnp2q32vuvyeruwauyhe \ No newline at end of file From 1bda70ac459659d5ec916b6c130a3e27a8a49b0f Mon Sep 17 00:00:00 2001 From: lauren Date: Tue, 22 Oct 2024 01:55:44 -0400 Subject: [PATCH 008/120] Add link to eslint configuration in compiler blog post (#7244) --- src/content/blog/2024/10/21/react-compiler-beta-release.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/blog/2024/10/21/react-compiler-beta-release.md b/src/content/blog/2024/10/21/react-compiler-beta-release.md index 768a2e16b..f5a870b22 100644 --- a/src/content/blog/2024/10/21/react-compiler-beta-release.md +++ b/src/content/blog/2024/10/21/react-compiler-beta-release.md @@ -64,7 +64,7 @@ Or, if you're using Yarn: yarn add -D eslint-plugin-react-compiler@beta -Using the linter helps identify Rules of React breakages, making it easier to adopt the compiler when it's fully released. +After installation you can enable the linter by [adding it to your ESLint config](/learn/react-compiler#installing-eslint-plugin-react-compiler). Using the linter helps identify Rules of React breakages, making it easier to adopt the compiler when it's fully released. ## Backwards Compatibility {/*backwards-compatibility*/} From e628e5df0df29611592a3a15a594f28069966a35 Mon Sep 17 00:00:00 2001 From: Karl Horky Date: Wed, 23 Oct 2024 18:11:08 +0200 Subject: [PATCH 009/120] Add ESLint flat config example, fix ESLint name (#7246) * Add ESLint flat config example, fix ESLint name * Use official terminology * Fix key --- src/content/learn/react-compiler.md | 35 +++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/src/content/learn/react-compiler.md b/src/content/learn/react-compiler.md index cc7d31927..df46954d2 100644 --- a/src/content/learn/react-compiler.md +++ b/src/content/learn/react-compiler.md @@ -13,7 +13,7 @@ These docs are still a work in progress. More documentation is available in the * Getting started with the compiler -* Installing the compiler and eslint plugin +* Installing the compiler and ESLint plugin * Troubleshooting @@ -26,7 +26,7 @@ The latest Beta release can be found with the `@beta` tag, and daily experimenta React Compiler is a new compiler that we've open sourced to get early feedback from the community. It is a build-time only tool that automatically optimizes your React app. It works with plain JavaScript, and understands the [Rules of React](/reference/rules), so you don't need to rewrite any code to use it. -The compiler also includes an [eslint plugin](#installing-eslint-plugin-react-compiler) that surfaces the analysis from the compiler right in your editor. **We strongly recommend everyone use the linter today.** The linter does not require that you have the compiler installed, so you can use it even if you are not ready to try out the compiler. +The compiler also includes an [ESLint plugin](#installing-eslint-plugin-react-compiler) that surfaces the analysis from the compiler right in your editor. **We strongly recommend everyone use the linter today.** The linter does not require that you have the compiler installed, so you can use it even if you are not ready to try out the compiler. The compiler is currently released as `beta`, and is available to try out on React 17+ apps and libraries. To install the Beta: @@ -126,13 +126,30 @@ In addition to these docs, we recommend checking the [React Compiler Working Gro ### Installing eslint-plugin-react-compiler {/*installing-eslint-plugin-react-compiler*/} -React Compiler also powers an eslint plugin. The eslint plugin can be used **independently** of the compiler, meaning you can use the eslint plugin even if you don't use the compiler. +React Compiler also powers an ESLint plugin. The ESLint plugin can be used **independently** of the compiler, meaning you can use the ESLint plugin even if you don't use the compiler. npm install -D eslint-plugin-react-compiler@beta -Then, add it to your eslint config: +Then, add it to your ESLint config: + +```js +import reactCompiler from 'eslint-plugin-react-compiler' + +export default [ + { + plugins: { + 'react-compiler': reactCompiler, + }, + rules: { + 'react-compiler/react-compiler': 'error', + }, + }, +] +``` + +Or, in the deprecated eslintrc config format: ```js module.exports = { @@ -140,15 +157,15 @@ module.exports = { 'eslint-plugin-react-compiler', ], rules: { - 'react-compiler/react-compiler': "error", + 'react-compiler/react-compiler': 'error', }, } ``` -The eslint plugin will display any violations of the rules of React in your editor. When it does this, it means that the compiler has skipped over optimizing that component or hook. This is perfectly okay, and the compiler can recover and continue optimizing other components in your codebase. +The ESLint plugin will display any violations of the rules of React in your editor. When it does this, it means that the compiler has skipped over optimizing that component or hook. This is perfectly okay, and the compiler can recover and continue optimizing other components in your codebase. -**You don't have to fix all eslint violations straight away.** You can address them at your own pace to increase the amount of components and hooks being optimized, but it is not required to fix everything before you can use the compiler. +**You don't have to fix all ESLint violations straight away.** You can address them at your own pace to increase the amount of components and hooks being optimized, but it is not required to fix everything before you can use the compiler. ### Rolling out the compiler to your codebase {/*using-the-compiler-effectively*/} @@ -333,11 +350,11 @@ React Compiler can verify many of the Rules of React statically, and will safely [React Devtools](/learn/react-developer-tools) (v5.0+) has built-in support for React Compiler and will display a "Memo ✨" badge next to components that have been optimized by the compiler. ### Something is not working after compilation {/*something-is-not-working-after-compilation*/} -If you have eslint-plugin-react-compiler installed, the compiler will display any violations of the rules of React in your editor. When it does this, it means that the compiler has skipped over optimizing that component or hook. This is perfectly okay, and the compiler can recover and continue optimizing other components in your codebase. **You don't have to fix all eslint violations straight away.** You can address them at your own pace to increase the amount of components and hooks being optimized. +If you have eslint-plugin-react-compiler installed, the compiler will display any violations of the rules of React in your editor. When it does this, it means that the compiler has skipped over optimizing that component or hook. This is perfectly okay, and the compiler can recover and continue optimizing other components in your codebase. **You don't have to fix all ESLint violations straight away.** You can address them at your own pace to increase the amount of components and hooks being optimized. Due to the flexible and dynamic nature of JavaScript however, it's not possible to comprehensively detect all cases. Bugs and undefined behavior such as infinite loops may occur in those cases. -If your app doesn't work properly after compilation and you aren't seeing any eslint errors, the compiler may be incorrectly compiling your code. To confirm this, try to make the issue go away by aggressively opting out any component or hook you think might be related via the [`"use no memo"` directive](#opt-out-of-the-compiler-for-a-component). +If your app doesn't work properly after compilation and you aren't seeing any ESLint errors, the compiler may be incorrectly compiling your code. To confirm this, try to make the issue go away by aggressively opting out any component or hook you think might be related via the [`"use no memo"` directive](#opt-out-of-the-compiler-for-a-component). ```js {2} function SuspiciousComponent() { From eb174dd932613fb0784a78ee2d9360554538cc08 Mon Sep 17 00:00:00 2001 From: Andre Sander Date: Wed, 23 Oct 2024 18:12:04 +0200 Subject: [PATCH 010/120] Update components-and-hooks-must-be-pure.md (#7245) --- .../reference/rules/components-and-hooks-must-be-pure.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/reference/rules/components-and-hooks-must-be-pure.md b/src/content/reference/rules/components-and-hooks-must-be-pure.md index 9da65d04a..d3d54560e 100644 --- a/src/content/reference/rules/components-and-hooks-must-be-pure.md +++ b/src/content/reference/rules/components-and-hooks-must-be-pure.md @@ -194,7 +194,7 @@ function ProductDetailPage({ product }) { } ``` -One way to achieve the desired result of updating `window.title` outside of render is to [synchronize the component with `window`](/learn/synchronizing-with-effects). +One way to achieve the desired result of updating `document.title` outside of render is to [synchronize the component with `document`](/learn/synchronizing-with-effects). As long as calling a component multiple times is safe and doesn’t affect the rendering of other components, React doesn’t care if it’s 100% pure in the strict functional programming sense of the word. It is more important that [components must be idempotent](/reference/rules/components-and-hooks-must-be-pure). From b4b33c49c4a78503721039ca1faf79c6959903fd Mon Sep 17 00:00:00 2001 From: Young Shung Date: Sun, 3 Nov 2024 01:07:51 +0800 Subject: [PATCH 011/120] Replace contributors dead link (#7272) --- src/content/community/acknowledgements.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/community/acknowledgements.md b/src/content/community/acknowledgements.md index 9a981efd5..760076d83 100644 --- a/src/content/community/acknowledgements.md +++ b/src/content/community/acknowledgements.md @@ -4,7 +4,7 @@ title: Acknowledgements -React was originally created by [Jordan Walke.](https://github.com/jordwalke) Today, React has a [dedicated full-time team working on it](/community/team), as well as over a thousand [open source contributors.](https://github.com/facebook/react/blob/main/AUTHORS) +React was originally created by [Jordan Walke.](https://github.com/jordwalke) Today, React has a [dedicated full-time team working on it](/community/team), as well as over a thousand [open source contributors.](https://github.com/facebook/react/graphs/contributors) From 75e4d400bedd1e200511963f26919f688ec92157 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 2 Nov 2024 17:21:25 +0000 Subject: [PATCH 012/120] Add Bluesky as profile link option to team page + footer (#7273) * Add Bluesky as profile link option to team page + footer * Remove my X It's cleaner. * Add Rick bsky --- src/components/Icon/IconBsky.tsx | 24 ++++++++++++++++++++++++ src/components/Layout/Footer.tsx | 7 +++++++ src/components/MDX/TeamMember.tsx | 20 +++++++++++++++++--- src/content/community/team.md | 4 ++-- 4 files changed, 50 insertions(+), 5 deletions(-) create mode 100644 src/components/Icon/IconBsky.tsx diff --git a/src/components/Icon/IconBsky.tsx b/src/components/Icon/IconBsky.tsx new file mode 100644 index 000000000..6645152dd --- /dev/null +++ b/src/components/Icon/IconBsky.tsx @@ -0,0 +1,24 @@ +/* + * Copyright (c) Facebook, Inc. and its affiliates. + */ + +import {memo} from 'react'; + +export const IconBsky = memo(function IconBsky( + props +) { + return ( + + + + ); +}); diff --git a/src/components/Layout/Footer.tsx b/src/components/Layout/Footer.tsx index 4e19039ed..9cdf256fb 100644 --- a/src/components/Layout/Footer.tsx +++ b/src/components/Layout/Footer.tsx @@ -8,6 +8,7 @@ import cn from 'classnames'; import {ExternalLink} from 'components/ExternalLink'; import {IconFacebookCircle} from 'components/Icon/IconFacebookCircle'; import {IconTwitter} from 'components/Icon/IconTwitter'; +import {IconBsky} from 'components/Icon/IconBsky'; import {IconGitHub} from 'components/Icon/IconGitHub'; export function Footer() { @@ -370,6 +371,12 @@ export function Footer() { className={socialLinkClasses}> + + + {title &&
{title}
} {children} -
+
{twitter && (
@@ -77,7 +80,7 @@ export function TeamMember({ {threads && (
@@ -85,6 +88,17 @@ export function TeamMember({
)} + {bsky && ( +
+ + + {bsky} + +
+ )} {github && (
- + Dan got into programming after he accidentally discovered Visual Basic inside Microsoft PowerPoint. He has found his true calling in turning [Sebastian](#sebastian-markbåge)'s tweets into long-form blog posts. Dan occasionally wins at Fortnite by hiding in a bush until the game ends. @@ -62,7 +62,7 @@ Current members of the React team are listed in alphabetical order below. Noah’s interest in UI programming sparked during his education in music technology at NYU. At Meta, he's worked on internal tools, browsers, web performance, and is currently focused on React. Outside of work, Noah can be found tinkering with synthesizers or spending time with his cat. - + Ricky majored in theoretical math and somehow found himself on the React Native team for a couple years before joining the React team. When he's not programming you can find him snowboarding, biking, climbing, golfing, or closing GitHub issues that do not match the issue template. From ab51439a549ec43ffbc9413000b7def820a8982a Mon Sep 17 00:00:00 2001 From: lauren Date: Sun, 3 Nov 2024 10:05:48 -0500 Subject: [PATCH 013/120] Add poteto bsky (#7276) --- src/content/community/team.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/community/team.md b/src/content/community/team.md index 2a5950fa7..407448f48 100644 --- a/src/content/community/team.md +++ b/src/content/community/team.md @@ -42,7 +42,7 @@ Current members of the React team are listed in alphabetical order below. Josh majored in Mathematics and discovered programming while in college. His first professional developer job was to program insurance rate calculations in Microsoft Excel, the paragon of Reactive Programming which must be why he now works on React. In between that time Josh has been an IC, Manager, and Executive at a few startups. outside of work he likes to push his limits with cooking. - + Lauren's programming career peaked when she first discovered the `` tag. She’s been chasing that high ever since. She studied Finance instead of CS in college, so she learned to code using Excel instead of Java. Lauren enjoys dropping cheeky memes in chat, playing video games with her partner, and petting her dog Zelda. From 8201e7e9203321bd1648c3ab0b76ef943c9ec3ad Mon Sep 17 00:00:00 2001 From: lauren Date: Sun, 3 Nov 2024 10:22:10 -0500 Subject: [PATCH 014/120] [ci] Speed up CI (#7277) * [ci] Speed up site lint job * fix * also speed up analyze --- .github/workflows/analyze.yml | 24 ++++++++++++++++-------- .github/workflows/site_lint.yml | 16 ++++++++++++---- 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/.github/workflows/analyze.yml b/.github/workflows/analyze.yml index 2a905a0df..b1ef428d0 100644 --- a/.github/workflows/analyze.yml +++ b/.github/workflows/analyze.yml @@ -11,18 +11,26 @@ jobs: analyze: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up node - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: '20.x' + cache: yarn + cache-dependency-path: yarn.lock - - name: Install dependencies - uses: bahmutov/npm-install@v1.7.10 + - name: Restore cached node_modules + uses: actions/cache@v4 + with: + path: "**/node_modules" + key: node_modules-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('yarn.lock') }} + + - name: Install deps + run: yarn install --frozen-lockfile - name: Restore next build - uses: actions/cache@v3 + uses: actions/cache@v4 id: restore-build-cache env: cache-name: cache-next-build @@ -41,7 +49,7 @@ jobs: run: npx -p nextjs-bundle-analysis@0.5.0 report - name: Upload bundle - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: path: .next/analyze/__bundle_analysis.json name: bundle_analysis.json @@ -73,7 +81,7 @@ jobs: run: ls -laR .next/analyze/base && npx -p nextjs-bundle-analysis compare - name: Upload analysis comment - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: analysis_comment.txt path: .next/analyze/__bundle_analysis_comment.txt @@ -82,7 +90,7 @@ jobs: run: echo ${{ github.event.number }} > ./pr_number - name: Upload PR number - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: pr_number path: ./pr_number diff --git a/.github/workflows/site_lint.yml b/.github/workflows/site_lint.yml index 34ca6d7b8..36f7642c9 100644 --- a/.github/workflows/site_lint.yml +++ b/.github/workflows/site_lint.yml @@ -14,14 +14,22 @@ jobs: name: Lint on node 20.x and ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v4 - name: Use Node.js 20.x - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 20.x + cache: yarn + cache-dependency-path: yarn.lock - - name: Install deps and build (with cache) - uses: bahmutov/npm-install@v1.8.32 + - name: Restore cached node_modules + uses: actions/cache@v4 + with: + path: "**/node_modules" + key: node_modules-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('yarn.lock') }} + + - name: Install deps + run: yarn install --frozen-lockfile - name: Lint codebase run: yarn ci-check From b214f78433756914ec32526dda48e76176dbf4fc Mon Sep 17 00:00:00 2001 From: Josh Story Date: Fri, 8 Nov 2024 13:33:37 -0800 Subject: [PATCH 015/120] Update socials for Josh Story (#7282) --- src/content/community/team.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/community/team.md b/src/content/community/team.md index 407448f48..221a8db87 100644 --- a/src/content/community/team.md +++ b/src/content/community/team.md @@ -38,7 +38,7 @@ Current members of the React team are listed in alphabetical order below. Joe was planning to major in math and philosophy but got into computer science after writing physics simulations in Matlab. Prior to React, he worked on Relay, RSocket.js, and the Skip programming language. While he’s not building some sort of reactive system he enjoys running, studying Japanese, and spending time with his family. - + Josh majored in Mathematics and discovered programming while in college. His first professional developer job was to program insurance rate calculations in Microsoft Excel, the paragon of Reactive Programming which must be why he now works on React. In between that time Josh has been an IC, Manager, and Executive at a few startups. outside of work he likes to push his limits with cooking. From 3246989c210dc5d4239b0638b2418572ba123ad4 Mon Sep 17 00:00:00 2001 From: Bartosz Kaszubowski Date: Tue, 12 Nov 2024 15:35:32 +0100 Subject: [PATCH 016/120] Compiler: Update link to Expo documentation (#7288) --- src/content/learn/react-compiler.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/learn/react-compiler.md b/src/content/learn/react-compiler.md index df46954d2..4c3d6f8fb 100644 --- a/src/content/learn/react-compiler.md +++ b/src/content/learn/react-compiler.md @@ -315,7 +315,7 @@ A community Webpack loader is [now available here](https://github.com/SukkaW/rea ### Expo {/*usage-with-expo*/} -Please refer to [Expo's docs](https://docs.expo.dev/preview/react-compiler/) to enable and use the React Compiler in Expo apps. +Please refer to [Expo's docs](https://docs.expo.dev/guides/react-compiler/) to enable and use the React Compiler in Expo apps. ### Metro (React Native) {/*usage-with-react-native-metro*/} From 891b20c935d297e84296ba63608f935acbdbf2df Mon Sep 17 00:00:00 2001 From: Josh Story Date: Wed, 13 Nov 2024 13:50:58 -0800 Subject: [PATCH 017/120] Update socials for Josh Story (#7290) --- src/content/community/team.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/community/team.md b/src/content/community/team.md index 221a8db87..b11925407 100644 --- a/src/content/community/team.md +++ b/src/content/community/team.md @@ -38,7 +38,7 @@ Current members of the React team are listed in alphabetical order below. Joe was planning to major in math and philosophy but got into computer science after writing physics simulations in Matlab. Prior to React, he worked on Relay, RSocket.js, and the Skip programming language. While he’s not building some sort of reactive system he enjoys running, studying Japanese, and spending time with his family. - + Josh majored in Mathematics and discovered programming while in college. His first professional developer job was to program insurance rate calculations in Microsoft Excel, the paragon of Reactive Programming which must be why he now works on React. In between that time Josh has been an IC, Manager, and Executive at a few startups. outside of work he likes to push his limits with cooking. From 1d1767f412f1f7f02017a53b684a8b239bdd7f00 Mon Sep 17 00:00:00 2001 From: Golamrabbi Azad <35021384+golamrabbiazad@users.noreply.github.com> Date: Fri, 15 Nov 2024 02:03:11 +0600 Subject: [PATCH 018/120] fix: broken link of react-compiler reference to nextjs docs (#7285) --- src/content/learn/react-compiler.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/learn/react-compiler.md b/src/content/learn/react-compiler.md index 4c3d6f8fb..5362d69e1 100644 --- a/src/content/learn/react-compiler.md +++ b/src/content/learn/react-compiler.md @@ -278,7 +278,7 @@ export default defineConfig(() => { ### Next.js {/*usage-with-nextjs*/} -Please refer to the [Next.js docs](https://nextjs.org/docs/canary/app/api-reference/next-config-js/reactCompiler) for more information. +Please refer to the [Next.js docs](https://nextjs.org/docs/app/api-reference/next-config-js/reactCompiler) for more information. ### Remix {/*usage-with-remix*/} Install `vite-plugin-babel`, and add the compiler's Babel plugin to it: From 84f29eb20af17e9c154b9ad71c21af4c9171e4a2 Mon Sep 17 00:00:00 2001 From: Ricky Date: Thu, 14 Nov 2024 15:46:05 -0500 Subject: [PATCH 019/120] Update React 19 Upgrade Guide with pre-warming change (#7292) * Update React 19 Upgrade Guide with pre-warming change * Better captions --- .../images/docs/diagrams/prerender.dark.png | Bin 0 -> 68802 bytes public/images/docs/diagrams/prerender.png | Bin 0 -> 70062 bytes public/images/docs/diagrams/prewarm.dark.png | Bin 0 -> 68742 bytes public/images/docs/diagrams/prewarm.png | Bin 0 -> 69316 bytes src/components/MDX/Diagram.tsx | 4 ++-- .../blog/2024/04/25/react-19-upgrade-guide.md | 18 ++++++++++++++++++ 6 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 public/images/docs/diagrams/prerender.dark.png create mode 100644 public/images/docs/diagrams/prerender.png create mode 100644 public/images/docs/diagrams/prewarm.dark.png create mode 100644 public/images/docs/diagrams/prewarm.png diff --git a/public/images/docs/diagrams/prerender.dark.png b/public/images/docs/diagrams/prerender.dark.png new file mode 100644 index 0000000000000000000000000000000000000000..1e7d67e131efb301d447a6b2eaed868d9d80b3bd GIT binary patch literal 68802 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

Kc3({S^$44p?r>$A0z32T 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


BiZKsyY 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 literal 0 HcmV?d00001 diff --git a/public/images/docs/diagrams/prerender.png b/public/images/docs/diagrams/prerender.png new file mode 100644 index 0000000000000000000000000000000000000000..ababa5493a1744e613c8aba6eb03c988fdd6f108 GIT binary patch literal 70062 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Ð7sZJF+0*)T{a06SrAA4|t(MF7xF~sZR=8+0|+% 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 z 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 J{CPL}e*o15W=jA7 literal 0 HcmV?d00001 diff --git a/public/images/docs/diagrams/prewarm.dark.png b/public/images/docs/diagrams/prewarm.dark.png new file mode 100644 index 0000000000000000000000000000000000000000..46140603907e327235964dee397b5032aafdf9a6 GIT binary patch literal 68742 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 MN8Arr96Xo!Uy0;qXaE2J literal 0 HcmV?d00001 diff --git a/public/images/docs/diagrams/prewarm.png b/public/images/docs/diagrams/prewarm.png new file mode 100644 index 0000000000000000000000000000000000000000..f6ec1c49db3c415c8ab15407c8d90072d3484df0 GIT binary patch literal 69316 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 Eg*x3R;yFC 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%0AIC){eLGaq50b91(ac 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 RR$c$f;@qXP)n{%b{|{caZtwsA literal 0 HcmV?d00001 diff --git a/src/components/MDX/Diagram.tsx b/src/components/MDX/Diagram.tsx index 7920661da..649f48dff 100644 --- a/src/components/MDX/Diagram.tsx +++ b/src/components/MDX/Diagram.tsx @@ -15,8 +15,8 @@ interface DiagramProps { function Caption({text}: {text: string}) { return ( -

-
+
+
{text}
diff --git a/src/content/blog/2024/04/25/react-19-upgrade-guide.md b/src/content/blog/2024/04/25/react-19-upgrade-guide.md index 5ead75a20..e6d76ec7b 100644 --- a/src/content/blog/2024/04/25/react-19-upgrade-guide.md +++ b/src/content/blog/2024/04/25/react-19-upgrade-guide.md @@ -536,6 +536,24 @@ When double rendering in Strict Mode in development, `useMemo` and `useCallback` As with all Strict Mode behaviors, these features are designed to proactively surface bugs in your components during development so you can fix them before they are shipped to production. For example, during development, Strict Mode will double-invoke ref callback functions on initial mount, to simulate what happens when a mounted component is replaced by a Suspense fallback. +### Improvements to Suspense {/*improvements-to-suspense*/} + +In React 19, when a component suspends, React will immediately commit the fallback of the nearest Suspense boundary without waiting for the entire sibling tree to render. After the fallback commits, React schedules another render for the suspended siblings to "pre-warm" lazy requests in the rest of the tree: + + + +Previously, when a component suspended, the suspended siblings were rendered and then the fallback was committed. + + + + + +In React 19, when a component suspends, the fallback is committed and then the suspended siblings are rendered. + + + +This change means Suspense fallbacks display faster, while still warming lazy requests in the suspended tree. + ### UMD builds removed {/*umd-builds-removed*/} UMD was widely used in the past as a convenient way to load React without a build step. Now, there are modern alternatives for loading modules as scripts in HTML documents. Starting with React 19, React will no longer produce UMD builds to reduce the complexity of its testing and release process. From 6a35e13d5e2a50b9a3b55c9c072cb8ca1679573a Mon Sep 17 00:00:00 2001 From: Sophie Alpert Date: Mon, 2 Dec 2024 14:13:32 -0800 Subject: [PATCH 020/120] Update react-19-upgrade-guide.md --- src/content/blog/2024/04/25/react-19-upgrade-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/blog/2024/04/25/react-19-upgrade-guide.md b/src/content/blog/2024/04/25/react-19-upgrade-guide.md index e6d76ec7b..3318676bd 100644 --- a/src/content/blog/2024/04/25/react-19-upgrade-guide.md +++ b/src/content/blog/2024/04/25/react-19-upgrade-guide.md @@ -735,7 +735,7 @@ const reducer = (state: State, action: Action) => state; ### Other breaking changes {/*other-breaking-changes*/} -- **react-dom**: Error for javascript URLs in src/href [#26507](https://github.com/facebook/react/pull/26507) +- **react-dom**: Error for javascript URLs in `src` and `href` [#26507](https://github.com/facebook/react/pull/26507) - **react-dom**: Remove `errorInfo.digest` from `onRecoverableError` [#28222](https://github.com/facebook/react/pull/28222) - **react-dom**: Remove `unstable_flushControlled` [#26397](https://github.com/facebook/react/pull/26397) - **react-dom**: Remove `unstable_createEventHandle` [#28271](https://github.com/facebook/react/pull/28271) From 4bae717f59787b4c741f600ee2d2decb07fba226 Mon Sep 17 00:00:00 2001 From: Sophie Alpert Date: Mon, 2 Dec 2024 14:13:55 -0800 Subject: [PATCH 021/120] Fix typo in react-19-upgrade-guide.md --- src/content/blog/2024/04/25/react-19-upgrade-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/blog/2024/04/25/react-19-upgrade-guide.md b/src/content/blog/2024/04/25/react-19-upgrade-guide.md index 3318676bd..68ef9420d 100644 --- a/src/content/blog/2024/04/25/react-19-upgrade-guide.md +++ b/src/content/blog/2024/04/25/react-19-upgrade-guide.md @@ -740,7 +740,7 @@ const reducer = (state: State, action: Action) => state; - **react-dom**: Remove `unstable_flushControlled` [#26397](https://github.com/facebook/react/pull/26397) - **react-dom**: Remove `unstable_createEventHandle` [#28271](https://github.com/facebook/react/pull/28271) - **react-dom**: Remove `unstable_renderSubtreeIntoContainer` [#28271](https://github.com/facebook/react/pull/28271) -- **react-dom**: Remove `unstable_runWithPrioirty` [#28271](https://github.com/facebook/react/pull/28271) +- **react-dom**: Remove `unstable_runWithPriority` [#28271](https://github.com/facebook/react/pull/28271) - **react-is**: Remove deprecated methods from `react-is` [28224](https://github.com/facebook/react/pull/28224) ### Other notable changes {/*other-notable-changes*/} From fd8b1e02b4fa9ecee6ba9f710976cb0cfbdb8a61 Mon Sep 17 00:00:00 2001 From: Ricky Date: Thu, 5 Dec 2024 13:53:26 -0500 Subject: [PATCH 022/120] Update React v19 blog post for stable release (#7321) * React v19 blog update * re-add sebbie's install updates Co-authored-by: Sebastian Silbermann --------- Co-authored-by: Sebastian Silbermann --- .../blog/2024/04/25/react-19-upgrade-guide.md | 31 ++++++++----------- .../blog/2024/05/22/react-conf-2024-recap.md | 4 +-- .../blog/2024/{04/25 => 12/05}/react-19.md | 27 +++++++++++----- src/content/blog/index.md | 14 ++++----- vercel.json | 5 +++ 5 files changed, 46 insertions(+), 35 deletions(-) rename src/content/blog/2024/{04/25 => 12/05}/react-19.md (96%) diff --git a/src/content/blog/2024/04/25/react-19-upgrade-guide.md b/src/content/blog/2024/04/25/react-19-upgrade-guide.md index 68ef9420d..79af8d348 100644 --- a/src/content/blog/2024/04/25/react-19-upgrade-guide.md +++ b/src/content/blog/2024/04/25/react-19-upgrade-guide.md @@ -1,5 +1,5 @@ --- -title: "React 19 RC Upgrade Guide" +title: "React 19 Upgrade Guide" author: Ricky Hanlon date: 2024/04/25 description: The improvements added to React 19 require some breaking changes, but we've worked to make the upgrade as smooth as possible and we don't expect the changes to impact most apps. In this post, we will guide you through the steps for upgrading apps and libraries to React 19. @@ -12,7 +12,7 @@ April 25, 2024 by [Ricky Hanlon](https://twitter.com/rickhanlonii) -The improvements added to React 19 RC require some breaking changes, but we've worked to make the upgrade as smooth as possible, and we don't expect the changes to impact most apps. +The improvements added to React 19 require some breaking changes, but we've worked to make the upgrade as smooth as possible, and we don't expect the changes to impact most apps. @@ -38,7 +38,7 @@ In this post, we will guide you through the steps for upgrading to React 19: - [TypeScript changes](#typescript-changes) - [Changelog](#changelog) -If you'd like to help us test React 19, follow the steps in this upgrade guide and [report any issues](https://github.com/facebook/react/issues/new?assignees=&labels=React+19&projects=&template=19.md&title=%5BReact+19%5D) you encounter. For a list of new features added to React 19, see the [React 19 release post](/blog/2024/04/25/react-19). +If you'd like to help us test React 19, follow the steps in this upgrade guide and [report any issues](https://github.com/facebook/react/issues/new?assignees=&labels=React+19&projects=&template=19.md&title=%5BReact+19%5D) you encounter. For a list of new features added to React 19, see the [React 19 release post](/blog/2024/12/05/react-19). --- ## Installing {/*installing*/} @@ -70,28 +70,23 @@ We expect most apps will not be affected since the transform is enabled in most To install the latest version of React and React DOM: ```bash -npm install --save-exact react@rc react-dom@rc +npm install --save-exact react@^19.0.0 react-dom@^19.0.0 ``` Or, if you're using Yarn: ```bash -yarn add --exact react@rc react-dom@rc +yarn add --exact react@^19.0.0 react-dom@^19.0.0 ``` -If you're using TypeScript, you also need to update the types. Once React 19 is released as stable, you can install the types as usual from `@types/react` and `@types/react-dom`. Until the stable release, the types are available in different packages which need to be enforced in your `package.json`: +If you're using TypeScript, you also need to update the types. +```bash +npm install --save-exact @types/react@^19.0.0 react-dom@^19.0.0 +``` -```json -{ - "dependencies": { - "@types/react": "npm:types-react@rc", - "@types/react-dom": "npm:types-react-dom@rc" - }, - "overrides": { - "@types/react": "npm:types-react@rc", - "@types/react-dom": "npm:types-react-dom@rc" - } -} +Or, if you're using Yarn: +```bash +yarn add --exact @†ypes/react@^19.0.0 @†ypes/react-dom@^19.0.0 ``` We're also including a codemod for the most common replacements. See [TypeScript changes](#typescript-changes) below. @@ -752,7 +747,7 @@ const reducer = (state: State, action: Action) => state; - **react-dom**: Remove layout effect warning during SSR [#26395](https://github.com/facebook/react/pull/26395) - **react-dom**: Warn and don’t set empty string for src/href (except anchor tags) [#28124](https://github.com/facebook/react/pull/28124) -We'll publish the full changelog with the stable release of React 19. +For a full list of changes, please see the [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md#1900-december-5-2024). --- diff --git a/src/content/blog/2024/05/22/react-conf-2024-recap.md b/src/content/blog/2024/05/22/react-conf-2024-recap.md index 96417fd8b..bc77f4bbb 100644 --- a/src/content/blog/2024/05/22/react-conf-2024-recap.md +++ b/src/content/blog/2024/05/22/react-conf-2024-recap.md @@ -17,7 +17,7 @@ Last week we hosted React Conf 2024, a two-day conference in Henderson, Nevada w --- -At React Conf 2024, we announced the [React 19 RC](/blog/2024/04/25/react-19), the [React Native New Architecture Beta](https://github.com/reactwg/react-native-new-architecture/discussions/189), and an experimental release of the [React Compiler](/learn/react-compiler). The community also took the stage to announce [React Router v7](https://remix.run/blog/merging-remix-and-react-router), [Universal Server Components](https://www.youtube.com/watch?v=T8TZQ6k4SLE&t=20765s) in Expo Router, React Server Components in [RedwoodJS](https://redwoodjs.com/blog/rsc-now-in-redwoodjs), and much more. +At React Conf 2024, we announced the [React 19 RC](/blog/2024/12/05/react-19), the [React Native New Architecture Beta](https://github.com/reactwg/react-native-new-architecture/discussions/189), and an experimental release of the [React Compiler](/learn/react-compiler). The community also took the stage to announce [React Router v7](https://remix.run/blog/merging-remix-and-react-router), [Universal Server Components](https://www.youtube.com/watch?v=T8TZQ6k4SLE&t=20765s) in Expo Router, React Server Components in [RedwoodJS](https://redwoodjs.com/blog/rsc-now-in-redwoodjs), and much more. The entire [day 1](https://www.youtube.com/watch?v=T8TZQ6k4SLE) and [day 2](https://www.youtube.com/watch?v=0ckOUBiuxVY) streams are available online. In this post, we'll summarize the talks and announcements from the event. @@ -36,7 +36,7 @@ For more, check out these talks from the community later in the conference: - [RedwoodJS, now with React Server Components](https://www.youtube.com/watch?v=T8TZQ6k4SLE&t=26815s) by [Amy Dutton](https://twitter.com/selfteachme) - [Introducing Universal React Server Components in Expo Router](https://www.youtube.com/watch?v=T8TZQ6k4SLE&t=20765s) by [Evan Bacon](https://twitter.com/Baconbrix) -Next in the keynote, [Josh Story](https://twitter.com/joshcstory) and [Andrew Clark](https://twitter.com/acdlite) shared new features coming in React 19, and announced the React 19 RC which is ready for testing in production. Check out all the features in the [React 19 release post](/blog/2024/04/25/react-19), and see these talks for deep dives on the new features: +Next in the keynote, [Josh Story](https://twitter.com/joshcstory) and [Andrew Clark](https://twitter.com/acdlite) shared new features coming in React 19, and announced the React 19 RC which is ready for testing in production. Check out all the features in the [React 19 release post](/blog/2024/12/05/react-19), and see these talks for deep dives on the new features: - [What's new in React 19](https://www.youtube.com/watch?v=T8TZQ6k4SLE&t=8880s) by [Lydia Hallie](https://twitter.com/lydiahallie) - [React Unpacked: A Roadmap to React 19](https://www.youtube.com/watch?v=T8TZQ6k4SLE&t=10112s) by [Sam Selikoff](https://twitter.com/samselikoff) diff --git a/src/content/blog/2024/04/25/react-19.md b/src/content/blog/2024/12/05/react-19.md similarity index 96% rename from src/content/blog/2024/04/25/react-19.md rename to src/content/blog/2024/12/05/react-19.md index 1b19c3546..afe5812cf 100644 --- a/src/content/blog/2024/04/25/react-19.md +++ b/src/content/blog/2024/12/05/react-19.md @@ -1,21 +1,33 @@ --- -title: "React 19 RC" +title: "React v19" author: The React Team -date: 2024/04/25 -description: React 19 RC is now available on npm! In this post, we'll give an overview of the new features in React 19, and how you can adopt them. +date: 2024/12/05 +description: React 19 is now available on npm! In this post, we'll give an overview of the new features in React 19, and how you can adopt them. --- -April 25, 2024 by [The React Team](/community/team) +December 05, 2024 by [The React Team](/community/team) --- + + +### React 19 is now stable! {/*react-19-is-now-stable*/} + +Additions since this post was originally shared with the React 19 RC in April: + +- **Pre-warming for suspended trees**: see [Improvements to Suspense](/blog/2024/04/25/react-19-upgrade-guide#improvements-to-suspense). +- **React DOM static APIs**: see [New React DOM Static APIs](#new-react-dom-static-apis). + +_The date for this post has been update to reflect the stable release date._ + + -React 19 RC is now available on npm! +React v19 is now available on npm! -In our [React 19 RC Upgrade Guide](/blog/2024/04/25/react-19-upgrade-guide), we shared step-by-step instructions for upgrading your app to React 19. In this post, we'll give an overview of the new features in React 19, and how you can adopt them. +In our [React 19 Upgrade Guide](/blog/2024/04/25/react-19-upgrade-guide), we shared step-by-step instructions for upgrading your app to React 19. In this post, we'll give an overview of the new features in React 19, and how you can adopt them. - [What's new in React 19](#whats-new-in-react-19) - [Improvements in React 19](#improvements-in-react-19) @@ -771,5 +783,4 @@ Thanks to [Joey Arhar](https://github.com/josepharhar) for driving the design an #### How to upgrade {/*how-to-upgrade*/} See the [React 19 Upgrade Guide](/blog/2024/04/25/react-19-upgrade-guide) for step-by-step instructions and a full list of breaking and notable changes. - - +_Note: this post was originally published 04/25/2024 and has been updated to 12/05/2024 with the stable release._ \ No newline at end of file diff --git a/src/content/blog/index.md b/src/content/blog/index.md index e37631e80..cc50b83c0 100644 --- a/src/content/blog/index.md +++ b/src/content/blog/index.md @@ -10,25 +10,25 @@ This blog is the official source for the updates from the React team. Anything i
- + -We announced an experimental release of React Compiler at React Conf 2024. We've made a lot of progress since then, and in this post we want to share what's next for React Compiler ... +In the React 19 Upgrade Guide, we shared step-by-step instructions for upgrading your app to React 19. In this post, we'll give an overview of the new features in React 19, and how you can adopt them ... - + -Last week we hosted React Conf 2024, a two-day conference in Henderson, Nevada where 700+ attendees gathered in-person to discuss the latest in UI engineering. This was our first in-person conference since 2019, and we were thrilled to be able to bring the community together again ... +We announced an experimental release of React Compiler at React Conf 2024. We've made a lot of progress since then, and in this post we want to share what's next for React Compiler ... - + -In the React 19 RC Upgrade Guide, we shared step-by-step instructions for upgrading your app to React 19. In this post, we'll give an overview of the new features in React 19, and how you can adopt them ... +Last week we hosted React Conf 2024, a two-day conference in Henderson, Nevada where 700+ attendees gathered in-person to discuss the latest in UI engineering. This was our first in-person conference since 2019, and we were thrilled to be able to bring the community together again ... - + The improvements added to React 19 require some breaking changes, but we've worked to make the upgrade as smooth as possible, and we don't expect the changes to impact most apps. In this post, we will guide you through the steps for upgrading libraries to React 19 ... diff --git a/vercel.json b/vercel.json index 8b0546e37..0de6c47e3 100644 --- a/vercel.json +++ b/vercel.json @@ -184,6 +184,11 @@ "destination": "/reference/rsc/use-server", "permanent": true }, + { + "source": "/blog/2024/04/25/react-19", + "destination": "/blog/2024/12/05/react-19", + "permanent": true + }, { "source": "/feed.xml", "destination": "/rss.xml", From 4673a050e126289c0ee20f147313326b8fec5e8d Mon Sep 17 00:00:00 2001 From: Ricky Date: Thu, 5 Dec 2024 14:03:22 -0500 Subject: [PATCH 023/120] Merge v19 docs to main (#7322) * Convert "Canary" callouts to "React 19 beta" (#6811) * Convert "Canary" callouts to "React 19 beta" * Starting in * Bump version string * Bump deploy * Bump deploy * Bump deploy * [19] Remove callouts (#6844) * Remove callouts * rm if(node) * Delete removed APIs from 19 docs (#6845) * Add information about ref handling in strict mode (#6777) * Add information about DOM ref handling in strict mode * switch order of ref object / ref callback in strictmode doc * use 'refs to components' terminology instead of 'DOM refs' * update references to canary/r19 * Expand usage example and remove badges --------- Co-authored-by: Rick Hanlon * [19] s/"Server Action"/"Server Function" (#7180) * [19] s/Server Action/Server Function * Revert /blog and change redirect * Add note * Tweak note * [v19] Update sandboxes to 19 RC (#7196) * Update transition docs for React 19 (#6837) * Add async transitions to React 19 docs * Updates from feedback * tweaks * grammar * Add startTranstion API * Apply suggestions from code review Co-authored-by: Noah Lemen * Updated * capitalization * grammar --------- Co-authored-by: Noah Lemen * [19] Add docs for prerender APIs (#7320) * Add prerender APIs * fix code blocks --------- Co-authored-by: Noah Lemen --- src/components/Icon/IconRocket.tsx | 32 + src/components/Layout/Sidebar/SidebarLink.tsx | 15 +- .../Layout/Sidebar/SidebarRouteTree.tsx | 6 +- src/components/Layout/getRouteMeta.tsx | 4 +- src/components/MDX/ExpandableCallout.tsx | 34 +- src/components/MDX/MDXComponents.tsx | 32 + src/components/MDX/Sandpack/template.ts | 4 +- src/content/blog/2024/12/05/react-19.md | 24 + .../learn/manipulating-the-dom-with-refs.md | 50 +- .../reference/react-dom/client/createRoot.md | 35 +- .../reference/react-dom/client/hydrateRoot.md | 35 +- .../reference/react-dom/components/common.md | 34 +- .../reference/react-dom/components/form.md | 86 +- .../reference/react-dom/components/input.md | 8 +- .../reference/react-dom/components/link.md | 7 - .../reference/react-dom/components/meta.md | 8 - .../reference/react-dom/components/script.md | 7 - .../reference/react-dom/components/style.md | 7 - .../reference/react-dom/components/title.md | 8 - .../reference/react-dom/findDOMNode.md | 435 ------- .../reference/react-dom/hooks/index.md | 6 - .../react-dom/hooks/useFormStatus.md | 29 - src/content/reference/react-dom/hydrate.md | 201 ---- src/content/reference/react-dom/index.md | 19 +- src/content/reference/react-dom/preconnect.md | 7 - .../reference/react-dom/prefetchDNS.md | 7 - src/content/reference/react-dom/preinit.md | 7 - .../reference/react-dom/preinitModule.md | 7 - src/content/reference/react-dom/preload.md | 7 - .../reference/react-dom/preloadModule.md | 7 - src/content/reference/react-dom/render.md | 218 ---- .../reference/react-dom/server/index.md | 17 +- .../react-dom/server/renderToNodeStream.md | 79 -- .../server/renderToStaticNodeStream.md | 83 -- .../react-dom/server/renderToString.md | 19 +- .../reference/react-dom/static/index.md | 28 + .../reference/react-dom/static/prerender.md | 297 +++++ .../react-dom/static/prerenderToNodeStream.md | 295 +++++ .../react-dom/unmountComponentAtNode.md | 113 -- src/content/reference/react/Component.md | 82 +- src/content/reference/react/StrictMode.md | 418 ++++++- src/content/reference/react/Suspense.md | 574 +-------- src/content/reference/react/cache.md | 8 +- src/content/reference/react/createElement.md | 2 +- src/content/reference/react/createFactory.md | 231 ---- .../react/experimental_taintUniqueValue.md | 2 +- src/content/reference/react/forwardRef.md | 8 + src/content/reference/react/legacy.md | 17 +- .../reference/react/startTransition.md | 14 +- src/content/reference/react/use.md | 49 +- src/content/reference/react/useActionState.md | 52 +- .../reference/react/useDeferredValue.md | 163 +-- src/content/reference/react/useOptimistic.md | 19 - src/content/reference/react/useTransition.md | 1038 ++++++++++------- src/content/reference/rsc/directives.md | 9 +- src/content/reference/rsc/server-actions.md | 213 ---- .../reference/rsc/server-components.md | 11 +- src/content/reference/rsc/server-functions.md | 222 ++++ src/content/reference/rsc/use-client.md | 10 +- src/content/reference/rsc/use-server.md | 56 +- src/content/warnings/react-dom-test-utils.md | 2 + src/content/warnings/react-test-renderer.md | 4 +- src/sidebarReference.json | 121 +- src/siteConfig.js | 3 +- vercel.json | 42 +- 65 files changed, 2319 insertions(+), 3368 deletions(-) create mode 100644 src/components/Icon/IconRocket.tsx delete mode 100644 src/content/reference/react-dom/findDOMNode.md delete mode 100644 src/content/reference/react-dom/hydrate.md delete mode 100644 src/content/reference/react-dom/render.md delete mode 100644 src/content/reference/react-dom/server/renderToNodeStream.md delete mode 100644 src/content/reference/react-dom/server/renderToStaticNodeStream.md create mode 100644 src/content/reference/react-dom/static/index.md create mode 100644 src/content/reference/react-dom/static/prerender.md create mode 100644 src/content/reference/react-dom/static/prerenderToNodeStream.md delete mode 100644 src/content/reference/react-dom/unmountComponentAtNode.md delete mode 100644 src/content/reference/react/createFactory.md delete mode 100644 src/content/reference/rsc/server-actions.md create mode 100644 src/content/reference/rsc/server-functions.md diff --git a/src/components/Icon/IconRocket.tsx b/src/components/Icon/IconRocket.tsx new file mode 100644 index 000000000..457736c7c --- /dev/null +++ b/src/components/Icon/IconRocket.tsx @@ -0,0 +1,32 @@ +/* + * Copyright (c) Facebook, Inc. and its affiliates. + */ + +import {memo} from 'react'; + +export const IconRocket = memo< + JSX.IntrinsicElements['svg'] & {title?: string; size?: 's' | 'md'} +>(function IconRocket({className, size = 'md'}) { + return ( + + ); +}); diff --git a/src/components/Layout/Sidebar/SidebarLink.tsx b/src/components/Layout/Sidebar/SidebarLink.tsx index 8a71d9e6e..4429989d2 100644 --- a/src/components/Layout/Sidebar/SidebarLink.tsx +++ b/src/components/Layout/Sidebar/SidebarLink.tsx @@ -16,7 +16,7 @@ interface SidebarLinkProps { selected?: boolean; title: string; level: number; - canary?: boolean; + version?: 'canary' | 'major'; icon?: React.ReactNode; isExpanded?: boolean; hideArrow?: boolean; @@ -27,7 +27,7 @@ export function SidebarLink({ href, selected = false, title, - canary, + version, level, isExpanded, hideArrow, @@ -75,10 +75,17 @@ export function SidebarLink({ {/* This here needs to be refactored ofc */}
{title}{' '} - {canary && ( + {version === 'major' && ( + + React 19 + + )} + {version === 'canary' && ( )}
diff --git a/src/components/Layout/Sidebar/SidebarRouteTree.tsx b/src/components/Layout/Sidebar/SidebarRouteTree.tsx index 3f058073c..54f02b925 100644 --- a/src/components/Layout/Sidebar/SidebarRouteTree.tsx +++ b/src/components/Layout/Sidebar/SidebarRouteTree.tsx @@ -87,7 +87,7 @@ export function SidebarRouteTree({ path, title, routes, - canary, + version, heading, hasSectionHeader, sectionHeader, @@ -121,7 +121,7 @@ export function SidebarRouteTree({ selected={selected} level={level} title={title} - canary={canary} + version={version} isExpanded={isExpanded} hideArrow={isForceExpanded} /> @@ -145,7 +145,7 @@ export function SidebarRouteTree({ selected={selected} level={level} title={title} - canary={canary} + version={version} /> ); diff --git a/src/components/Layout/getRouteMeta.tsx b/src/components/Layout/getRouteMeta.tsx index 3564dd738..b3d14725d 100644 --- a/src/components/Layout/getRouteMeta.tsx +++ b/src/components/Layout/getRouteMeta.tsx @@ -19,8 +19,8 @@ export type RouteTag = export interface RouteItem { /** Page title (for the sidebar) */ title: string; - /** Optional canary flag for heading */ - canary?: boolean; + /** Optional version flag for heading */ + version?: 'canary' | 'major'; /** Optional page description for heading */ description?: string; /* Additional meta info for page tagging */ diff --git a/src/components/MDX/ExpandableCallout.tsx b/src/components/MDX/ExpandableCallout.tsx index 415d5d867..5f594063d 100644 --- a/src/components/MDX/ExpandableCallout.tsx +++ b/src/components/MDX/ExpandableCallout.tsx @@ -8,8 +8,16 @@ import {IconNote} from '../Icon/IconNote'; import {IconWarning} from '../Icon/IconWarning'; import {IconPitfall} from '../Icon/IconPitfall'; import {IconCanary} from '../Icon/IconCanary'; +import {IconRocket} from '../Icon/IconRocket'; -type CalloutVariants = 'deprecated' | 'pitfall' | 'note' | 'wip' | 'canary'; +type CalloutVariants = + | 'deprecated' + | 'pitfall' + | 'note' + | 'wip' + | 'canary' + | 'major' + | 'rsc'; interface ExpandableCalloutProps { children: React.ReactNode; @@ -59,6 +67,22 @@ const variantMap = { overlayGradient: 'linear-gradient(rgba(249, 247, 243, 0), rgba(249, 247, 243, 1)', }, + major: { + title: 'React 19', + Icon: IconRocket, + containerClasses: 'bg-blue-10 dark:bg-blue-60 dark:bg-opacity-20', + textColor: 'text-blue-50 dark:text-blue-40', + overlayGradient: + 'linear-gradient(rgba(249, 247, 243, 0), rgba(249, 247, 243, 1)', + }, + rsc: { + title: 'React Server Components', + Icon: null, + containerClasses: 'bg-blue-10 dark:bg-blue-60 dark:bg-opacity-20', + textColor: 'text-blue-50 dark:text-blue-40', + overlayGradient: + 'linear-gradient(rgba(249, 247, 243, 0), rgba(249, 247, 243, 1)', + }, }; function ExpandableCallout({children, type = 'note'}: ExpandableCalloutProps) { @@ -72,9 +96,11 @@ function ExpandableCallout({children, type = 'note'}: ExpandableCalloutProps) { variant.containerClasses )}>

- + {variant.Icon && ( + + )} {variant.title}

diff --git a/src/components/MDX/MDXComponents.tsx b/src/components/MDX/MDXComponents.tsx index 6f99121f7..0e22c7921 100644 --- a/src/components/MDX/MDXComponents.tsx +++ b/src/components/MDX/MDXComponents.tsx @@ -97,6 +97,14 @@ const Canary = ({children}: {children: React.ReactNode}) => ( {children} ); +const NextMajor = ({children}: {children: React.ReactNode}) => ( + {children} +); + +const RSC = ({children}: {children: React.ReactNode}) => ( + {children} +); + const CanaryBadge = ({title}: {title: string}) => ( ( ); +const NextMajorBadge = ({title}: {title: string}) => ( + + React 19 + +); + +const RSCBadge = ({title}: {title: string}) => ( + + RSC + +); + const Blockquote = ({ children, ...props @@ -483,6 +511,10 @@ export const MDXComponents = { Note, Canary, CanaryBadge, + NextMajor, + NextMajorBadge, + RSC, + RSCBadge, PackageImport, ReadBlogPost, Recap, diff --git a/src/components/MDX/Sandpack/template.ts b/src/components/MDX/Sandpack/template.ts index 9ead18a14..42f02f6a6 100644 --- a/src/components/MDX/Sandpack/template.ts +++ b/src/components/MDX/Sandpack/template.ts @@ -28,8 +28,8 @@ root.render( eject: 'react-scripts eject', }, dependencies: { - react: '^18.0.0', - 'react-dom': '^18.0.0', + react: '19.0.0-rc-3edc000d-20240926', + 'react-dom': '19.0.0-rc-3edc000d-20240926', 'react-scripts': '^5.0.0', }, }, diff --git a/src/content/blog/2024/12/05/react-19.md b/src/content/blog/2024/12/05/react-19.md index afe5812cf..9f212209b 100644 --- a/src/content/blog/2024/12/05/react-19.md +++ b/src/content/blog/2024/12/05/react-19.md @@ -324,6 +324,30 @@ The `use` API can only be called in render, similar to hooks. Unlike hooks, `use For more information, see the docs for [`use`](/reference/react/use). +## New React DOM Static APIs {/*new-react-dom-static-apis*/} + +We've added two new APIs to `react-dom/static` for static site generation: +- [`prerender`](/reference/react-dom/static/prerender) +- [`prerenderToNodeStream`](/reference/react-dom/static/prerenderToNodeStream) + +These new APIs improve on `renderToString` by waiting for data to load for static HTML generation. They are designed to work with streaming environments like Node.js Streams and Web Streams. For example, in a Web Stream environment, you can prerender a React tree to static HTML with `prerender`: + +```js +import { prerender } from 'react-dom/static'; + +async function handler(request) { + const {prelude} = await prerender(, { + bootstrapScripts: ['/main.js'] + }); + return new Response(prelude, { + headers: { 'content-type': 'text/html' }, + }); +} +``` + +Prerender APIs will wait for all data to load before returning the static HTML stream. Streams can be converted to strings, or sent with a streaming response. They do not support streaming content as it loads, which is supported by the existing [React DOM server rendering APIs](/reference/react-dom/server). + +For more information, see [React DOM Static APIs](/reference/react-dom/static). ## React Server Components {/*react-server-components*/} diff --git a/src/content/learn/manipulating-the-dom-with-refs.md b/src/content/learn/manipulating-the-dom-with-refs.md index e881c8a1f..6d20232fb 100644 --- a/src/content/learn/manipulating-the-dom-with-refs.md +++ b/src/content/learn/manipulating-the-dom-with-refs.md @@ -256,11 +256,11 @@ export default function CatFriends() { key={cat} ref={(node) => { const map = getMap(); - if (node) { - map.set(cat, node); - } else { + map.set(cat, node); + + return () => { map.delete(cat); - } + }; }} > @@ -309,42 +309,10 @@ li { } ``` -```json package.json hidden -{ - "dependencies": { - "react": "canary", - "react-dom": "canary", - "react-scripts": "^5.0.0" - } -} -``` - In this example, `itemsRef` doesn't hold a single DOM node. Instead, it holds a [Map](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Map) from item ID to a DOM node. ([Refs can hold any values!](/learn/referencing-values-with-refs)) The [`ref` callback](/reference/react-dom/components/common#ref-callback) on every list item takes care to update the Map: -```js -
  • { - const map = getMap(); - if (node) { - // Add to the Map - map.set(cat, node); - } else { - // Remove from the Map - map.delete(cat); - } - }} -> -``` - -This lets you read individual DOM nodes from the Map later. - - - -This example shows another approach for managing the Map with a `ref` callback cleanup function. - ```js
  • ``` - +This lets you read individual DOM nodes from the Map later. + + + +When Strict Mode is enabled, ref callbacks will run twice in development. + +Read more about [how this helps find bugs](/reference/react/StrictMode#fixing-bugs-found-by-re-running-ref-callbacks-in-development) in callback refs. + + diff --git a/src/content/reference/react-dom/client/createRoot.md b/src/content/reference/react-dom/client/createRoot.md index b336b6e5e..a2bef6bf2 100644 --- a/src/content/reference/react-dom/client/createRoot.md +++ b/src/content/reference/react-dom/client/createRoot.md @@ -45,8 +45,8 @@ An app fully built with React will usually only have one `createRoot` call for i * **optional** `options`: An object with options for this React root. - * **optional** `onCaughtError`: Callback called when React catches an error in an Error Boundary. Called with the `error` caught by the Error Boundary, and an `errorInfo` object containing the `componentStack`. - * **optional** `onUncaughtError`: Callback called when an error is thrown and not caught by an Error Boundary. Called with the `error` that was thrown, and an `errorInfo` object containing the `componentStack`. + * **optional** `onCaughtError`: Callback called when React catches an error in an Error Boundary. Called with the `error` caught by the Error Boundary, and an `errorInfo` object containing the `componentStack`. + * **optional** `onUncaughtError`: Callback called when an error is thrown and not caught by an Error Boundary. Called with the `error` that was thrown, and an `errorInfo` object containing the `componentStack`. * **optional** `onRecoverableError`: Callback called when React automatically recovers from errors. Called with an `error` React throws, and an `errorInfo` object containing the `componentStack`. Some recoverable errors may include the original error cause as `error.cause`. * **optional** `identifierPrefix`: A string prefix React uses for IDs generated by [`useId`.](/reference/react/useId) Useful to avoid conflicts when using multiple roots on the same page. @@ -346,12 +346,6 @@ It is uncommon to call `render` multiple times. Usually, your components will [u ### Show a dialog for uncaught errors {/*show-a-dialog-for-uncaught-errors*/} - - -`onUncaughtError` is only available in the latest React Canary release. - - - By default, React will log all uncaught errors to the console. To implement your own error reporting, you can provide the optional `onUncaughtError` root option: ```js [[1, 6, "onUncaughtError"], [2, 6, "error", 1], [3, 6, "errorInfo"], [4, 10, "componentStack"]] @@ -578,28 +572,11 @@ export default function App() { } ``` -```json package.json hidden -{ - "dependencies": { - "react": "canary", - "react-dom": "canary", - "react-scripts": "^5.0.0" - }, - "main": "/index.js" -} -``` - ### Displaying Error Boundary errors {/*displaying-error-boundary-errors*/} - - -`onCaughtError` is only available in the latest React Canary release. - - - By default, React will log all errors caught by an Error Boundary to `console.error`. To override this behavior, you can provide the optional `onCaughtError` root option to handle errors caught by an [Error Boundary](/reference/react/Component#catching-rendering-errors-with-an-error-boundary): ```js [[1, 6, "onCaughtError"], [2, 6, "error", 1], [3, 6, "errorInfo"], [4, 10, "componentStack"]] @@ -865,8 +842,8 @@ function Throw({error}) { ```json package.json hidden { "dependencies": { - "react": "canary", - "react-dom": "canary", + "react": "19.0.0-rc-3edc000d-20240926", + "react-dom": "19.0.0-rc-3edc000d-20240926", "react-scripts": "^5.0.0", "react-error-boundary": "4.0.3" }, @@ -1123,8 +1100,8 @@ function Throw({error}) { ```json package.json hidden { "dependencies": { - "react": "canary", - "react-dom": "canary", + "react": "19.0.0-rc-3edc000d-20240926", + "react-dom": "19.0.0-rc-3edc000d-20240926", "react-scripts": "^5.0.0", "react-error-boundary": "4.0.3" }, diff --git a/src/content/reference/react-dom/client/hydrateRoot.md b/src/content/reference/react-dom/client/hydrateRoot.md index cc30ce22c..c54b6fe11 100644 --- a/src/content/reference/react-dom/client/hydrateRoot.md +++ b/src/content/reference/react-dom/client/hydrateRoot.md @@ -41,8 +41,8 @@ React will attach to the HTML that exists inside the `domNode`, and take over ma * **optional** `options`: An object with options for this React root. - * **optional** `onCaughtError`: Callback called when React catches an error in an Error Boundary. Called with the `error` caught by the Error Boundary, and an `errorInfo` object containing the `componentStack`. - * **optional** `onUncaughtError`: Callback called when an error is thrown and not caught by an Error Boundary. Called with the `error` that was thrown and an `errorInfo` object containing the `componentStack`. + * **optional** `onCaughtError`: Callback called when React catches an error in an Error Boundary. Called with the `error` caught by the Error Boundary, and an `errorInfo` object containing the `componentStack`. + * **optional** `onUncaughtError`: Callback called when an error is thrown and not caught by an Error Boundary. Called with the `error` that was thrown and an `errorInfo` object containing the `componentStack`. * **optional** `onRecoverableError`: Callback called when React automatically recovers from errors. Called with the `error` React throws, and an `errorInfo` object containing the `componentStack`. Some recoverable errors may include the original error cause as `error.cause`. * **optional** `identifierPrefix`: A string prefix React uses for IDs generated by [`useId`.](/reference/react/useId) Useful to avoid conflicts when using multiple roots on the same page. Must be the same prefix as used on the server. @@ -376,12 +376,6 @@ It is uncommon to call [`root.render`](#root-render) on a hydrated root. Usually ### Show a dialog for uncaught errors {/*show-a-dialog-for-uncaught-errors*/} - - -`onUncaughtError` is only available in the latest React Canary release. - - - By default, React will log all uncaught errors to the console. To implement your own error reporting, you can provide the optional `onUncaughtError` root option: ```js [[1, 7, "onUncaughtError"], [2, 7, "error", 1], [3, 7, "errorInfo"], [4, 11, "componentStack"]] @@ -612,28 +606,11 @@ export default function App() { } ``` -```json package.json hidden -{ - "dependencies": { - "react": "canary", - "react-dom": "canary", - "react-scripts": "^5.0.0" - }, - "main": "/index.js" -} -``` - ### Displaying Error Boundary errors {/*displaying-error-boundary-errors*/} - - -`onCaughtError` is only available in the latest React Canary release. - - - By default, React will log all errors caught by an Error Boundary to `console.error`. To override this behavior, you can provide the optional `onCaughtError` root option for errors caught by an [Error Boundary](/reference/react/Component#catching-rendering-errors-with-an-error-boundary): ```js [[1, 7, "onCaughtError"], [2, 7, "error", 1], [3, 7, "errorInfo"], [4, 11, "componentStack"]] @@ -902,8 +879,8 @@ function Throw({error}) { ```json package.json hidden { "dependencies": { - "react": "canary", - "react-dom": "canary", + "react": "19.0.0-rc-3edc000d-20240926", + "react-dom": "19.0.0-rc-3edc000d-20240926", "react-scripts": "^5.0.0", "react-error-boundary": "4.0.3" }, @@ -1164,8 +1141,8 @@ function Throw({error}) { ```json package.json hidden { "dependencies": { - "react": "canary", - "react-dom": "canary", + "react": "19.0.0-rc-3edc000d-20240926", + "react-dom": "19.0.0-rc-3edc000d-20240926", "react-scripts": "^5.0.0", "react-error-boundary": "4.0.3" }, diff --git a/src/content/reference/react-dom/components/common.md b/src/content/reference/react-dom/components/common.md index 62ee08139..9d1533213 100644 --- a/src/content/reference/react-dom/components/common.md +++ b/src/content/reference/react-dom/components/common.md @@ -246,43 +246,41 @@ These events fire for resources like [`
    console.log(node)} /> +
    { + console.log('Attached', node); + + return () => { + console.log('Clean up', node) + } +}}> ``` [See an example of using the `ref` callback.](/learn/manipulating-the-dom-with-refs#how-to-manage-a-list-of-refs-using-a-ref-callback) -When the `
    ` DOM node is added to the screen, React will call your `ref` callback with the DOM `node` as the argument. When that `
    ` DOM node is removed, React will call your `ref` callback with `null`. +When the `
    ` DOM node is added to the screen, React will call your `ref` callback with the DOM `node` as the argument. When that `
    ` DOM node is removed, React will call your the cleanup function returned from the callback. React will also call your `ref` callback whenever you pass a *different* `ref` callback. In the above example, `(node) => { ... }` is a different function on every render. When your component re-renders, the *previous* function will be called with `null` as the argument, and the *next* function will be called with the DOM node. #### Parameters {/*ref-callback-parameters*/} -* `node`: A DOM node or `null`. React will pass you the DOM node when the ref gets attached, and `null` when the `ref` gets detached. Unless you pass the same function reference for the `ref` callback on every render, the callback will get temporarily detached and re-attached during every re-render of the component. +* `node`: A DOM node. React will pass you the DOM node when the ref gets attached. Unless you pass the same function reference for the `ref` callback on every render, the callback will get temporarily cleanup and re-create during every re-render of the component. - + -#### Returns {/*returns*/} +#### React 19 added cleanup functions for `ref` callbacks. {/*react-19-added-cleanup-functions-for-ref-callbacks*/} -* **optional** `cleanup function`: When the `ref` is detached, React will call the cleanup function. If a function is not returned by the `ref` callback, React will call the callback again with `null` as the argument when the `ref` gets detached. +To support backwards compatibility, if a cleanup function is not returned from the `ref` callback, `node` will be called with `null` when the `ref` is detached. This behavior will be removed in a future version. -```js + -
    { - console.log(node); - - return () => { - console.log('Clean up', node) - } -}}> +#### Returns {/*returns*/} -``` +* **optional** `cleanup function`: When the `ref` is detached, React will call the cleanup function. If a function is not returned by the `ref` callback, React will call the callback again with `null` as the argument when the `ref` gets detached. This behavior will be removed in a future version. #### Caveats {/*caveats*/} * When Strict Mode is on, React will **run one extra development-only setup+cleanup cycle** before the first real setup. This is a stress-test that ensures that your cleanup logic "mirrors" your setup logic and that it stops or undoes whatever the setup is doing. If this causes a problem, implement the cleanup function. -* When you pass a *different* `ref` callback, React will call the *previous* callback's cleanup function if provided. If not cleanup function is defined, the `ref` callback will be called with `null` as the argument. The *next* function will be called with the DOM node. - - +* When you pass a *different* `ref` callback, React will call the *previous* callback's cleanup function if provided. If no cleanup function is defined, the `ref` callback will be called with `null` as the argument. The *next* function will be called with the DOM node. --- diff --git a/src/content/reference/react-dom/components/form.md b/src/content/reference/react-dom/components/form.md index 8f6ab00e0..047b65aa7 100644 --- a/src/content/reference/react-dom/components/form.md +++ b/src/content/reference/react-dom/components/form.md @@ -1,15 +1,7 @@ --- title: "
    " -canary: true --- - - -React's extensions to `` are currently only available in React's canary and experimental channels. In stable releases of React, `` works only as a [built-in browser HTML component](https://react.dev/reference/react-dom/components#all-html-components). Learn more about [React's release channels here](/community/versioning-policy#all-release-channels). - - - - The [built-in browser `` component](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form) lets you create interactive controls for submitting information. @@ -77,27 +69,15 @@ export default function Search() { } ``` -```json package.json hidden -{ - "dependencies": { - "react": "18.3.0-canary-6db7f4209-20231021", - "react-dom": "18.3.0-canary-6db7f4209-20231021", - "react-scripts": "^5.0.0" - }, - "main": "/index.js", - "devDependencies": {} -} -``` - -### Handle form submission with a Server Action {/*handle-form-submission-with-a-server-action*/} +### Handle form submission with a Server Function {/*handle-form-submission-with-a-server-function*/} -Render a `` with an input and submit button. Pass a Server Action (a function marked with [`'use server'`](/reference/rsc/use-server)) to the `action` prop of form to run the function when the form is submitted. +Render a `` with an input and submit button. Pass a Server Function (a function marked with [`'use server'`](/reference/rsc/use-server)) to the `action` prop of form to run the function when the form is submitted. -Passing a Server Action to `` allow users to submit forms without JavaScript enabled or before the code has loaded. This is beneficial to users who have a slow connection, device, or have JavaScript disabled and is similar to the way forms work when a URL is passed to the `action` prop. +Passing a Server Function to `` allow users to submit forms without JavaScript enabled or before the code has loaded. This is beneficial to users who have a slow connection, device, or have JavaScript disabled and is similar to the way forms work when a URL is passed to the `action` prop. -You can use hidden form fields to provide data to the ``'s action. The Server Action will be called with the hidden form field data as an instance of [`FormData`](https://developer.mozilla.org/en-US/docs/Web/API/FormData). +You can use hidden form fields to provide data to the ``'s action. The Server Function will be called with the hidden form field data as an instance of [`FormData`](https://developer.mozilla.org/en-US/docs/Web/API/FormData). ```jsx import { updateCart } from './lib.js'; @@ -137,7 +117,7 @@ function AddToCart({productId}) { } ``` -When `` is rendered by a [Server Component](/reference/rsc/use-client), and a [Server Action](/reference/rsc/use-server) is passed to the ``'s `action` prop, the form is [progressively enhanced](https://developer.mozilla.org/en-US/docs/Glossary/Progressive_Enhancement). +When `` is rendered by a [Server Component](/reference/rsc/use-client), and a [Server Function](/reference/rsc/server-function) is passed to the ``'s `action` prop, the form is [progressively enhanced](https://developer.mozilla.org/en-US/docs/Glossary/Progressive_Enhancement). ### Display a pending state during form submission {/*display-a-pending-state-during-form-submission*/} To display a pending state when a form is being submitted, you can call the `useFormStatus` Hook in a component rendered in a `` and read the `pending` property returned. @@ -178,17 +158,6 @@ export async function submitForm(query) { } ``` -```json package.json hidden -{ - "dependencies": { - "react": "canary", - "react-dom": "canary", - "react-scripts": "^5.0.0" - }, - "main": "/index.js", - "devDependencies": {} -} -``` To learn more about the `useFormStatus` Hook see the [reference documentation](/reference/react-dom/hooks/useFormStatus). @@ -258,19 +227,6 @@ export async function deliverMessage(message) { } ``` - -```json package.json hidden -{ - "dependencies": { - "react": "18.3.0-canary-6db7f4209-20231021", - "react-dom": "18.3.0-canary-6db7f4209-20231021", - "react-scripts": "^5.0.0" - }, - "main": "/index.js", - "devDependencies": {} -} -``` - [//]: # 'Uncomment the next line, and delete this line after the `useOptimistic` reference documentatino page is published' @@ -306,8 +262,8 @@ export default function Search() { ```json package.json hidden { "dependencies": { - "react": "18.3.0-canary-6db7f4209-20231021", - "react-dom": "18.3.0-canary-6db7f4209-20231021", + "react": "19.0.0-rc-3edc000d-20240926", + "react-dom": "19.0.0-rc-3edc000d-20240926", "react-scripts": "^5.0.0", "react-error-boundary": "4.0.3" }, @@ -323,10 +279,10 @@ export default function Search() { Displaying a form submission error message before the JavaScript bundle loads for progressive enhancement requires that: 1. `` be rendered by a [Server Component](/reference/rsc/use-client) -1. the function passed to the ``'s `action` prop be a [Server Action](/reference/rsc/use-server) +1. the function passed to the ``'s `action` prop be a [Server Function](/reference/rsc/server-functions) 1. the `useActionState` Hook be used to display the error message -`useActionState` takes two parameters: a [Server Action](/reference/rsc/use-server) and an initial state. `useActionState` returns two values, a state variable and an action. The action returned by `useActionState` should be passed to the `action` prop of the form. The state variable returned by `useActionState` can be used to displayed an error message. The value returned by the [Server Action](/reference/rsc/use-server) passed to `useActionState` will be used to update the state variable. +`useActionState` takes two parameters: a [Server Function](/reference/rsc/server-functions) and an initial state. `useActionState` returns two values, a state variable and an action. The action returned by `useActionState` should be passed to the `action` prop of the form. The state variable returned by `useActionState` can be used to display an error message. The value returned by the Server Function passed to `useActionState` will be used to update the state variable. @@ -372,18 +328,6 @@ export async function signUpNewUser(newEmail) { } ``` -```json package.json hidden -{ - "dependencies": { - "react": "canary", - "react-dom": "canary", - "react-scripts": "^5.0.0" - }, - "main": "/index.js", - "devDependencies": {} -} -``` - Learn more about updating state from a form action with the [`useActionState`](/reference/react/useActionState) docs @@ -420,16 +364,4 @@ export default function Search() { } ``` -```json package.json hidden -{ - "dependencies": { - "react": "18.3.0-canary-6db7f4209-20231021", - "react-dom": "18.3.0-canary-6db7f4209-20231021", - "react-scripts": "^5.0.0" - }, - "main": "/index.js", - "devDependencies": {} -} -``` - diff --git a/src/content/reference/react-dom/components/input.md b/src/content/reference/react-dom/components/input.md index 706b8ae8a..9699ce418 100644 --- a/src/content/reference/react-dom/components/input.md +++ b/src/content/reference/react-dom/components/input.md @@ -32,13 +32,7 @@ To display an input, render the [built-in browser ``](https://developer.m `` supports all [common element props.](/reference/react-dom/components/common#props) - - -React's extensions to the `formAction` prop are currently only available in React's Canary and experimental channels. In stable releases of React, `formAction` works only as a [built-in browser HTML component](/reference/react-dom/components#all-html-components). Learn more about [React's release channels here](/community/versioning-policy#all-release-channels). - - - -[`formAction`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#formaction): A string or function. Overrides the parent `` for `type="submit"` and `type="image"`. When a URL is passed to `action` the form will behave like a standard HTML form. When a function is passed to `formAction` the function will handle the form submission. See [``](/reference/react-dom/components/form#props). +- [`formAction`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#formaction): A string or function. Overrides the parent `` for `type="submit"` and `type="image"`. When a URL is passed to `action` the form will behave like a standard HTML form. When a function is passed to `formAction` the function will handle the form submission. See [``](/reference/react-dom/components/form#props). You can [make an input controlled](#controlling-an-input-with-a-state-variable) by passing one of these props: diff --git a/src/content/reference/react-dom/components/link.md b/src/content/reference/react-dom/components/link.md index 730d9e995..77da89d47 100644 --- a/src/content/reference/react-dom/components/link.md +++ b/src/content/reference/react-dom/components/link.md @@ -1,14 +1,7 @@ --- link: "" -canary: true --- - - -React's extensions to `` are currently only available in React's canary and experimental channels. In stable releases of React `` works only as a [built-in browser HTML component](https://react.dev/reference/react-dom/components#all-html-components). Learn more about [React's release channels here](/community/versioning-policy#all-release-channels). - - - The [built-in browser `` component](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link) lets you use external resources such as stylesheets or annotate the document with link metadata. diff --git a/src/content/reference/react-dom/components/meta.md b/src/content/reference/react-dom/components/meta.md index 801ca2af1..2173ce002 100644 --- a/src/content/reference/react-dom/components/meta.md +++ b/src/content/reference/react-dom/components/meta.md @@ -1,15 +1,7 @@ --- meta: "" -canary: true --- - - -React's extensions to `` are currently only available in React's canary and experimental channels. In stable releases of React `` works only as a [built-in browser HTML component](https://react.dev/reference/react-dom/components#all-html-components). Learn more about [React's release channels here](/community/versioning-policy#all-release-channels). - - - - The [built-in browser `` component](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta) lets you add metadata to the document. diff --git a/src/content/reference/react-dom/components/script.md b/src/content/reference/react-dom/components/script.md index fe020f1c6..6bf3d83c7 100644 --- a/src/content/reference/react-dom/components/script.md +++ b/src/content/reference/react-dom/components/script.md @@ -1,14 +1,7 @@ --- script: " +``` + +On the client, your bootstrap script should [hydrate the entire `document` with a call to `hydrateRoot`:](/reference/react-dom/client/hydrateRoot#hydrating-an-entire-document) + +```js [[1, 4, ""]] +import { hydrateRoot } from 'react-dom/client'; +import App from './App.js'; + +hydrateRoot(document, ); +``` + +This will attach event listeners to the static server-generated HTML and make it interactive. + + + +#### Reading CSS and JS asset paths from the build output {/*reading-css-and-js-asset-paths-from-the-build-output*/} + +The final asset URLs (like JavaScript and CSS files) are often hashed after the build. For example, instead of `styles.css` you might end up with `styles.123456.css`. Hashing static asset filenames guarantees that every distinct build of the same asset will have a different filename. This is useful because it lets you safely enable long-term caching for static assets: a file with a certain name would never change content. + +However, if you don't know the asset URLs until after the build, there's no way for you to put them in the source code. For example, hardcoding `"/styles.css"` into JSX like earlier wouldn't work. To keep them out of your source code, your root component can read the real filenames from a map passed as a prop: + +```js {1,6} +export default function App({ assetMap }) { + return ( + + + My app + + + ... + + ); +} +``` + +On the server, render `` and pass your `assetMap` with the asset URLs: + +```js {1-5,8,9} +// You'd need to get this JSON from your build tooling, e.g. read it from the build output. +const assetMap = { + 'styles.css': '/styles.123456.css', + 'main.js': '/main.123456.js' +}; + +async function handler(request) { + const {prelude} = await prerender(, { + bootstrapScripts: [assetMap['/main.js']] + }); + return new Response(prelude, { + headers: { 'content-type': 'text/html' }, + }); +} +``` + +Since your server is now rendering ``, you need to render it with `assetMap` on the client too to avoid hydration errors. You can serialize and pass `assetMap` to the client like this: + +```js {9-10} +// You'd need to get this JSON from your build tooling. +const assetMap = { + 'styles.css': '/styles.123456.css', + 'main.js': '/main.123456.js' +}; + +async function handler(request) { + const {prelude} = await prerender(, { + // Careful: It's safe to stringify() this because this data isn't user-generated. + bootstrapScriptContent: `window.assetMap = ${JSON.stringify(assetMap)};`, + bootstrapScripts: [assetMap['/main.js']], + }); + return new Response(prelude, { + headers: { 'content-type': 'text/html' }, + }); +} +``` + +In the example above, the `bootstrapScriptContent` option adds an extra inline ` +``` + +On the client, your bootstrap script should [hydrate the entire `document` with a call to `hydrateRoot`:](/reference/react-dom/client/hydrateRoot#hydrating-an-entire-document) + +```js [[1, 4, ""]] +import { hydrateRoot } from 'react-dom/client'; +import App from './App.js'; + +hydrateRoot(document, ); +``` + +This will attach event listeners to the static server-generated HTML and make it interactive. + + + +#### Reading CSS and JS asset paths from the build output {/*reading-css-and-js-asset-paths-from-the-build-output*/} + +The final asset URLs (like JavaScript and CSS files) are often hashed after the build. For example, instead of `styles.css` you might end up with `styles.123456.css`. Hashing static asset filenames guarantees that every distinct build of the same asset will have a different filename. This is useful because it lets you safely enable long-term caching for static assets: a file with a certain name would never change content. + +However, if you don't know the asset URLs until after the build, there's no way for you to put them in the source code. For example, hardcoding `"/styles.css"` into JSX like earlier wouldn't work. To keep them out of your source code, your root component can read the real filenames from a map passed as a prop: + +```js {1,6} +export default function App({ assetMap }) { + return ( + + + My app + + + ... + + ); +} +``` + +On the server, render `` and pass your `assetMap` with the asset URLs: + +```js {1-5,8,9} +// You'd need to get this JSON from your build tooling, e.g. read it from the build output. +const assetMap = { + 'styles.css': '/styles.123456.css', + 'main.js': '/main.123456.js' +}; + +app.use('/', async (request, response) => { + const { prelude } = await prerenderToNodeStream(, { + bootstrapScripts: [assetMap['/main.js']] + }); + + response.setHeader('Content-Type', 'text/html'); + prelude.pipe(response); +}); +``` + +Since your server is now rendering ``, you need to render it with `assetMap` on the client too to avoid hydration errors. You can serialize and pass `assetMap` to the client like this: + +```js {9-10} +// You'd need to get this JSON from your build tooling. +const assetMap = { + 'styles.css': '/styles.123456.css', + 'main.js': '/main.123456.js' +}; + +app.use('/', async (request, response) => { + const { prelude } = await prerenderToNodeStream(, { + // Careful: It's safe to stringify() this because this data isn't user-generated. + bootstrapScriptContent: `window.assetMap = ${JSON.stringify(assetMap)};`, + bootstrapScripts: [assetMap['/main.js']], + }); + + response.setHeader('Content-Type', 'text/html'); + prelude.pipe(response); +}); +``` + +In the example above, the `bootstrapScriptContent` option adds an extra inline ` + + ); +} diff --git a/src/components/DevContentRefresher.tsx b/src/components/DevContentRefresher.tsx new file mode 100644 index 000000000..31a0961ed --- /dev/null +++ b/src/components/DevContentRefresher.tsx @@ -0,0 +1,29 @@ +'use client'; + +import {useRouter} from 'next/navigation'; +import {useRef, useEffect} from 'react'; + +export function DevContentRefresher() { + const router = useRouter(); + const wsRef = useRef(null); + + useEffect(() => { + wsRef.current = new WebSocket('ws://localhost:3001'); + + wsRef.current.onmessage = (event) => { + const message = JSON.parse(event.data); + + if (message.event === 'refresh') { + console.log('Refreshing content...'); + // @ts-ignore + router.hmrRefresh(); // Triggers client-side refresh + } + }; + + return () => { + wsRef.current?.close(); + }; + }, [router]); + + return null; +} diff --git a/src/components/ErrorDecoderProvider.tsx b/src/components/ErrorDecoderProvider.tsx new file mode 100644 index 000000000..bad1ed2d0 --- /dev/null +++ b/src/components/ErrorDecoderProvider.tsx @@ -0,0 +1,19 @@ +'use client'; + +import {ErrorDecoderContext} from './ErrorDecoderContext'; + +export function ErrorDecoderProvider({ + children, + errorMessage, + errorCode, +}: { + children: React.ReactNode; + errorMessage: string | null; + errorCode: string | null; +}) { + return ( + + {children} + + ); +} diff --git a/src/components/Layout/Feedback.tsx b/src/components/Layout/Feedback.tsx index 34db728ce..16b974c10 100644 --- a/src/components/Layout/Feedback.tsx +++ b/src/components/Layout/Feedback.tsx @@ -3,12 +3,12 @@ */ import {useState} from 'react'; -import {useRouter} from 'next/router'; import cn from 'classnames'; +import {usePathname} from 'next/navigation'; export function Feedback({onSubmit = () => {}}: {onSubmit?: () => void}) { - const {asPath} = useRouter(); - const cleanedPath = asPath.split(/[\?\#]/)[0]; + const pathname = usePathname(); + const cleanedPath = pathname.split(/[\?\#]/)[0]; // Reset on route changes. return ; } diff --git a/src/components/Layout/Page.tsx b/src/components/Layout/Page.tsx index 24d379589..ea0c53e1c 100644 --- a/src/components/Layout/Page.tsx +++ b/src/components/Layout/Page.tsx @@ -1,16 +1,16 @@ +'use client'; + /* * Copyright (c) Facebook, Inc. and its affiliates. */ -import {Suspense} from 'react'; import * as React from 'react'; -import {useRouter} from 'next/router'; +import {Suspense} from 'react'; import {SidebarNav} from './SidebarNav'; import {Footer} from './Footer'; import {Toc} from './Toc'; -// import SocialBanner from '../SocialBanner'; import {DocsPageFooter} from 'components/DocsFooter'; -import {Seo} from 'components/Seo'; + import PageHeading from 'components/PageHeading'; import {getRouteMeta} from './getRouteMeta'; import {TocContext} from '../MDX/TocContext'; @@ -20,8 +20,8 @@ import type {RouteItem} from 'components/Layout/getRouteMeta'; import {HomeContent} from './HomeContent'; import {TopNav} from './TopNav'; import cn from 'classnames'; -import Head from 'next/head'; +// Prefetch the code block component import(/* webpackPrefetch: true */ '../MDX/CodeBlock/CodeBlock'); interface PageProps { @@ -36,6 +36,7 @@ interface PageProps { }; section: 'learn' | 'reference' | 'community' | 'blog' | 'home' | 'unknown'; languages?: Languages | null; + pathname: string; } export function Page({ @@ -44,11 +45,11 @@ export function Page({ routeTree, meta, section, + pathname, languages = null, }: PageProps) { - const {asPath} = useRouter(); - const cleanedPath = asPath.split(/[\?\#]/)[0]; - const {route, nextRoute, prevRoute, breadcrumbs, order} = getRouteMeta( + const cleanedPath = pathname.split(/[\?\#]/)[0]; + const {route, nextRoute, prevRoute, breadcrumbs} = getRouteMeta( cleanedPath, routeTree ); @@ -113,31 +114,17 @@ export function Page({ showSidebar = false; } - let searchOrder; - if (section === 'learn' || (section === 'blog' && !isBlogIndex)) { - searchOrder = order; - } - return ( <> - {(isHomePage || isBlogIndex) && ( - - - + // RSS Feed link is now handled by metadata in layout.tsx + )} - {/**/}
    -
    +
    {content}
    - {showToc && toc.length > 0 && } + {showToc && toc.length > 0 && }
    diff --git a/src/components/Layout/Sidebar/SidebarRouteTree.tsx b/src/components/Layout/Sidebar/SidebarRouteTree.tsx index 72003df74..f67b0ed2b 100644 --- a/src/components/Layout/Sidebar/SidebarRouteTree.tsx +++ b/src/components/Layout/Sidebar/SidebarRouteTree.tsx @@ -5,12 +5,12 @@ import {useRef, useLayoutEffect, Fragment} from 'react'; import cn from 'classnames'; -import {useRouter} from 'next/router'; import {SidebarLink} from './SidebarLink'; import {useCollapse} from 'react-collapsed'; import usePendingRoute from 'hooks/usePendingRoute'; import type {RouteItem} from 'components/Layout/getRouteMeta'; import {siteConfig} from 'siteConfig'; +import {usePathname} from 'next/navigation'; interface SidebarRouteTreeProps { isForceExpanded: boolean; @@ -77,7 +77,7 @@ export function SidebarRouteTree({ routeTree, level = 0, }: SidebarRouteTreeProps) { - const slug = useRouter().asPath.split(/[\?\#]/)[0]; + const slug = usePathname().split(/[\?\#]/)[0]; const pendingRoute = usePendingRoute(); const currentRoutes = routeTree.routes as RouteItem[]; return ( diff --git a/src/components/Layout/Toc.tsx b/src/components/Layout/Toc.tsx index 5308c602c..a8d269898 100644 --- a/src/components/Layout/Toc.tsx +++ b/src/components/Layout/Toc.tsx @@ -11,7 +11,11 @@ export function Toc({headings}: {headings: Toc}) { // TODO: We currently have a mismatch between the headings in the document // and the headings we find in MarkdownPage (i.e. we don't find Recap or Challenges). // Select the max TOC item we have here for now, but remove this after the fix. - const selectedIndex = Math.min(currentIndex, headings.length - 1); + const selectedIndex = + currentIndex !== undefined + ? Math.min(currentIndex, headings.length - 1) + : -1; + return (
  • ); diff --git a/src/components/Layout/TopNav/TopNav.tsx b/src/components/Layout/TopNav/TopNav.tsx index cc5c654e3..f8e9023fd 100644 --- a/src/components/Layout/TopNav/TopNav.tsx +++ b/src/components/Layout/TopNav/TopNav.tsx @@ -14,7 +14,6 @@ import Image from 'next/image'; import * as React from 'react'; import cn from 'classnames'; import NextLink from 'next/link'; -import {useRouter} from 'next/router'; import {disableBodyScroll, enableBodyScroll} from 'body-scroll-lock'; import {IconClose} from 'components/Icon/IconClose'; @@ -27,6 +26,7 @@ import {SidebarRouteTree} from '../Sidebar'; import type {RouteItem} from '../getRouteMeta'; import {siteConfig} from 'siteConfig'; import BrandMenu from './BrandMenu'; +import {usePathname} from 'next/navigation'; declare global { interface Window { @@ -162,7 +162,7 @@ export default function TopNav({ const [showSearch, setShowSearch] = useState(false); const [isScrolled, setIsScrolled] = useState(false); const scrollParentRef = useRef(null); - const {asPath} = useRouter(); + const pathname = usePathname(); // HACK. Fix up the data structures instead. if ((routeTree as any).routes.length === 1) { @@ -183,7 +183,7 @@ export default function TopNav({ // Close the overlay on any navigation. useEffect(() => { setIsMenuOpen(false); - }, [asPath]); + }, [pathname]); // Also close the overlay if the window gets resized past mobile layout. // (This is also important because we don't want to keep the body locked!) diff --git a/src/components/Layout/useTocHighlight.tsx b/src/components/Layout/useTocHighlight.tsx index 544396c68..dd10097ac 100644 --- a/src/components/Layout/useTocHighlight.tsx +++ b/src/components/Layout/useTocHighlight.tsx @@ -23,7 +23,10 @@ export function getHeaderAnchors(): HTMLAnchorElement[] { * Sets up Table of Contents highlighting. */ export function useTocHighlight() { - const [currentIndex, setCurrentIndex] = useState(0); + const [currentIndex, setCurrentIndex] = useState( + undefined + ); + const timeoutRef = useRef(null); useEffect(() => { diff --git a/src/components/MDX/Challenges/Challenges.tsx b/src/components/MDX/Challenges/Challenges.tsx index 21fc6865c..ff9586ae6 100644 --- a/src/components/MDX/Challenges/Challenges.tsx +++ b/src/components/MDX/Challenges/Challenges.tsx @@ -1,3 +1,5 @@ +'use client'; + /* * Copyright (c) Facebook, Inc. and its affiliates. */ @@ -9,7 +11,7 @@ import {H2} from 'components/MDX/Heading'; import {H4} from 'components/MDX/Heading'; import {Challenge} from './Challenge'; import {Navigation} from './Navigation'; -import {useRouter} from 'next/router'; +import {usePathname} from 'next/navigation'; interface ChallengesProps { children: React.ReactElement[]; @@ -40,11 +42,13 @@ const parseChallengeContents = ( let challenge: Partial = {}; let content: React.ReactElement[] = []; Children.forEach(children, (child) => { - const {props, type} = child as React.ReactElement<{ + const {props} = child as React.ReactElement<{ children?: string; id?: string; + 'data-mdx-name'?: string; }>; - switch ((type as any).mdxName) { + + switch (props?.['data-mdx-name']) { case 'Solution': { challenge.solution = child; challenge.content = content; @@ -90,12 +94,12 @@ export function Challenges({ const queuedScrollRef = useRef(QueuedScroll.INIT); const [activeIndex, setActiveIndex] = useState(0); const currentChallenge = challenges[activeIndex]; - const {asPath} = useRouter(); + const pathname = usePathname(); useEffect(() => { if (queuedScrollRef.current === QueuedScroll.INIT) { const initIndex = challenges.findIndex( - (challenge) => challenge.id === asPath.split('#')[1] + (challenge) => challenge.id === pathname.split('#')[1] ); if (initIndex === -1) { queuedScrollRef.current = undefined; @@ -112,7 +116,7 @@ export function Challenges({ }); queuedScrollRef.current = undefined; } - }, [activeIndex, asPath, challenges]); + }, [activeIndex, pathname, challenges]); const handleChallengeChange = (index: number) => { setActiveIndex(index); diff --git a/src/components/MDX/Challenges/index.tsx b/src/components/MDX/Challenges/index.tsx index 413fd4611..d85f5eb76 100644 --- a/src/components/MDX/Challenges/index.tsx +++ b/src/components/MDX/Challenges/index.tsx @@ -1,3 +1,5 @@ +'use client'; + /* * Copyright (c) Facebook, Inc. and its affiliates. */ diff --git a/src/components/MDX/CodeBlock/CodeBlock.tsx b/src/components/MDX/CodeBlock/CodeBlock.tsx index 1fd9a8a90..1d126530f 100644 --- a/src/components/MDX/CodeBlock/CodeBlock.tsx +++ b/src/components/MDX/CodeBlock/CodeBlock.tsx @@ -1,3 +1,5 @@ +'use client'; + /* * Copyright (c) Facebook, Inc. and its affiliates. */ diff --git a/src/components/MDX/CodeBlock/index.tsx b/src/components/MDX/CodeBlock/index.tsx index 551c1d1b6..c06fdbc81 100644 --- a/src/components/MDX/CodeBlock/index.tsx +++ b/src/components/MDX/CodeBlock/index.tsx @@ -1,3 +1,5 @@ +'use client'; + /* * Copyright (c) Facebook, Inc. and its affiliates. */ diff --git a/src/components/MDX/CodeDiagram.tsx b/src/components/MDX/CodeDiagram.tsx index 2a198fc56..41c94efc6 100644 --- a/src/components/MDX/CodeDiagram.tsx +++ b/src/components/MDX/CodeDiagram.tsx @@ -16,7 +16,7 @@ export function CodeDiagram({children, flip = false}: CodeDiagramProps) { return child.type === 'img'; }); const content = Children.toArray(children).map((child: any) => { - if (child.type?.mdxName === 'pre') { + if (child.props?.['data-mdx-name'] === 'pre') { return ( (shouldAutoExpand); const [isExpanded, setIsExpanded] = useState(false); @@ -57,8 +65,7 @@ function ExpandableExample({children, excerpt, type}: ExpandableExampleProps) { className="list-none p-8" tabIndex={-1 /* there's a button instead */} onClick={(e) => { - // We toggle using a button instead of this whole area, - // with an escape case for the header anchor link + // Toggle with a button instead of the whole area if (!(e.target instanceof SVGElement)) { e.preventDefault(); } diff --git a/src/components/MDX/Illustration.tsx b/src/components/MDX/Illustration.tsx new file mode 100644 index 000000000..ea674a865 --- /dev/null +++ b/src/components/MDX/Illustration.tsx @@ -0,0 +1,126 @@ +'use client'; + +import React, {Children} from 'react'; + +const IllustrationContext = React.createContext<{ + isInBlock?: boolean; +}>({ + isInBlock: false, +}); + +function AuthorCredit({ + author = 'Rachel Lee Nabors', + authorLink = 'https://nearestnabors.com/', +}: { + author: string; + authorLink: string; +}) { + return ( + + ); +} + +export function Illustration({ + caption, + src, + alt, + author, + authorLink, +}: { + caption: string; + src: string; + alt: string; + author: string; + authorLink: string; +}) { + const {isInBlock} = React.useContext(IllustrationContext); + + return ( +
    +
    + {alt} + {caption ? ( +
    + {caption} +
    + ) : null} +
    + {!isInBlock && } +
    + ); +} + +const isInBlockTrue = {isInBlock: true}; + +export function IllustrationBlock({ + sequential, + author, + authorLink, + children, +}: { + author: string; + authorLink: string; + sequential: boolean; + children: any; +}) { + const imageInfos = Children.toArray(children).map( + (child: any) => child.props + ); + const images = imageInfos.map((info, index) => ( +
    +
    + {info.alt} +
    + {info.caption ? ( +
    + {info.caption} +
    + ) : null} +
    + )); + return ( + +
    + {sequential ? ( +
      + {images.map((x: any, i: number) => ( +
    1. + {x} +
    2. + ))} +
    + ) : ( +
    {images}
    + )} + +
    +
    + ); +} diff --git a/src/components/MDX/InlineCode.tsx b/src/components/MDX/InlineCode.tsx index 5759a7c0a..a28c794c7 100644 --- a/src/components/MDX/InlineCode.tsx +++ b/src/components/MDX/InlineCode.tsx @@ -1,18 +1,18 @@ +'use client'; + /* * Copyright (c) Facebook, Inc. and its affiliates. */ import cn from 'classnames'; -import type {HTMLAttributes} from 'react'; +import {useContext, type HTMLAttributes} from 'react'; +import {LinkContext} from './Link'; interface InlineCodeProps { - isLink?: boolean; meta?: string; } -function InlineCode({ - isLink, - ...props -}: HTMLAttributes & InlineCodeProps) { +function InlineCode({...props}: HTMLAttributes & InlineCodeProps) { + const isLink = useContext(LinkContext); return ( in case of RTL languages to avoid like `()console.log` to be rendered as `console.log()` diff --git a/src/components/MDX/InlineToc.tsx b/src/components/MDX/InlineToc.tsx new file mode 100644 index 000000000..55c52ee3d --- /dev/null +++ b/src/components/MDX/InlineToc.tsx @@ -0,0 +1,60 @@ +'use client'; + +// import Link from 'next/link'; +import Link from './Link'; +import {useContext, useMemo} from 'react'; +import {Toc, TocContext, TocItem} from './TocContext'; +import {UL, LI} from './Primitives'; + +type NestedTocRoot = { + item: null; + children: Array; +}; + +type NestedTocNode = { + item: TocItem; + children: Array; +}; + +function calculateNestedToc(toc: Toc): NestedTocRoot { + const currentAncestors = new Map(); + const root: NestedTocRoot = { + item: null, + children: [], + }; + const startIndex = 1; // Skip "Overview" + for (let i = startIndex; i < toc.length; i++) { + const item = toc[i]; + const currentParent: NestedTocNode | NestedTocRoot = + currentAncestors.get(item.depth - 1) || root; + const node: NestedTocNode = { + item, + children: [], + }; + currentParent.children.push(node); + currentAncestors.set(item.depth, node); + } + return root; +} + +export function InlineToc() { + const toc = useContext(TocContext); + const root = useMemo(() => calculateNestedToc(toc), [toc]); + if (root.children.length < 2) { + return null; + } + return ; +} + +function InlineTocItem({items}: {items: Array}) { + return ( +
      + {items.map((node) => ( +
    • + {node.item.node} + {node.children.length > 0 && } +
    • + ))} +
    + ); +} diff --git a/src/components/MDX/LanguageList.tsx b/src/components/MDX/LanguageList.tsx new file mode 100644 index 000000000..2a1ea4c4b --- /dev/null +++ b/src/components/MDX/LanguageList.tsx @@ -0,0 +1,39 @@ +'use client'; + +import Link from './Link'; +import React from 'react'; +import {finishedTranslations} from 'utils/finishedTranslations'; +import {LanguagesContext} from './LanguagesContext'; +import {UL, LI} from './Primitives'; + +type TranslationProgress = 'complete' | 'in-progress'; + +export function LanguageList({progress}: {progress: TranslationProgress}) { + const allLanguages = React.useContext(LanguagesContext) ?? []; + const languages = allLanguages + .filter( + ({code}) => + code !== 'en' && + (progress === 'complete' + ? finishedTranslations.includes(code) + : !finishedTranslations.includes(code)) + ) + .sort((a, b) => a.enName.localeCompare(b.enName)); + return ( +
      + {languages.map(({code, name, enName}) => { + return ( +
    • + + {enName} ({name}) + {' '} + —{' '} + + Contribute + +
    • + ); + })} +
    + ); +} diff --git a/src/components/MDX/LanguagesContext.tsx b/src/components/MDX/LanguagesContext.tsx index 776a11c0d..719ea4f99 100644 --- a/src/components/MDX/LanguagesContext.tsx +++ b/src/components/MDX/LanguagesContext.tsx @@ -1,3 +1,5 @@ +'use client'; + /* * Copyright (c) Facebook, Inc. and its affiliates. */ diff --git a/src/components/MDX/Link.tsx b/src/components/MDX/Link.tsx index 7bf041e56..f6985fc48 100644 --- a/src/components/MDX/Link.tsx +++ b/src/components/MDX/Link.tsx @@ -1,13 +1,17 @@ +'use client'; + /* * Copyright (c) Facebook, Inc. and its affiliates. */ -import {Children, cloneElement} from 'react'; +import {createContext} from 'react'; import NextLink from 'next/link'; import cn from 'classnames'; import {ExternalLink} from 'components/ExternalLink'; +export const LinkContext = createContext(false); + function Link({ href, className, @@ -16,36 +20,29 @@ function Link({ }: React.AnchorHTMLAttributes) { const classes = 'inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal'; - const modifiedChildren = Children.toArray(children).map((child: any) => { - if (child.type?.mdxName && child.type?.mdxName === 'inlineCode') { - return cloneElement(child, { - isLink: true, - }); - } - return child; - }); if (!href) { // eslint-disable-next-line jsx-a11y/anchor-has-content return ; } + return ( - <> + {href.startsWith('https://') ? ( - {modifiedChildren} + {children} ) : href.startsWith('#') ? ( // eslint-disable-next-line jsx-a11y/anchor-has-content - {modifiedChildren} + {children} ) : ( - {modifiedChildren} + {children} )} - + ); } diff --git a/src/components/MDX/MDXComponents.tsx b/src/components/MDX/MDXComponents.tsx index f24fac598..bcd4c127f 100644 --- a/src/components/MDX/MDXComponents.tsx +++ b/src/components/MDX/MDXComponents.tsx @@ -1,8 +1,10 @@ +// 'use client'; + /* * Copyright (c) Facebook, Inc. and its affiliates. */ -import {Children, useContext, useMemo} from 'react'; +// import {Children, useContext, useMemo} from 'react'; import * as React from 'react'; import cn from 'classnames'; import type {HTMLAttributes} from 'react'; @@ -29,14 +31,13 @@ import YouWillLearnCard from './YouWillLearnCard'; import {Challenges, Hint, Solution} from './Challenges'; import {IconNavArrow} from '../Icon/IconNavArrow'; import ButtonLink from 'components/ButtonLink'; -import {TocContext} from './TocContext'; -import type {Toc, TocItem} from './TocContext'; import {TeamMember} from './TeamMember'; -import {LanguagesContext} from './LanguagesContext'; -import {finishedTranslations} from 'utils/finishedTranslations'; - import ErrorDecoder from './ErrorDecoder'; import {IconCanary} from '../Icon/IconCanary'; +import {InlineToc} from './InlineToc'; +import {Illustration, IllustrationBlock} from './Illustration'; +import {LanguageList} from './LanguageList'; +import {Divider, LI, OL, P, Strong, UL} from './Primitives'; function CodeStep({children, step}: {children: any; step: number}) { return ( @@ -60,27 +61,6 @@ function CodeStep({children, step}: {children: any; step: number}) { ); } -const P = (p: HTMLAttributes) => ( -

    -); - -const Strong = (strong: HTMLAttributes) => ( - -); - -const OL = (p: HTMLAttributes) => ( -

      -); -const LI = (p: HTMLAttributes) => ( -
    1. -); -const UL = (p: HTMLAttributes) => ( -
        -); - -const Divider = () => ( -
        -); const Wip = ({children}: {children: React.ReactNode}) => ( {children} ); @@ -232,214 +212,6 @@ function Recipes(props: any) { return ; } -function AuthorCredit({ - author = 'Rachel Lee Nabors', - authorLink = 'https://nearestnabors.com/', -}: { - author: string; - authorLink: string; -}) { - return ( -
        -

        - - Illustrated by{' '} - {authorLink ? ( - - {author} - - ) : ( - author - )} - -

        -
        - ); -} - -const IllustrationContext = React.createContext<{ - isInBlock?: boolean; -}>({ - isInBlock: false, -}); - -function Illustration({ - caption, - src, - alt, - author, - authorLink, -}: { - caption: string; - src: string; - alt: string; - author: string; - authorLink: string; -}) { - const {isInBlock} = React.useContext(IllustrationContext); - - return ( -
        -
        - {alt} - {caption ? ( -
        - {caption} -
        - ) : null} -
        - {!isInBlock && } -
        - ); -} - -const isInBlockTrue = {isInBlock: true}; - -function IllustrationBlock({ - sequential, - author, - authorLink, - children, -}: { - author: string; - authorLink: string; - sequential: boolean; - children: any; -}) { - const imageInfos = Children.toArray(children).map( - (child: any) => child.props - ); - const images = imageInfos.map((info, index) => ( -
        -
        - {info.alt} -
        - {info.caption ? ( -
        - {info.caption} -
        - ) : null} -
        - )); - return ( - -
        - {sequential ? ( -
          - {images.map((x: any, i: number) => ( -
        1. - {x} -
        2. - ))} -
        - ) : ( -
        {images}
        - )} - -
        -
        - ); -} - -type NestedTocRoot = { - item: null; - children: Array; -}; - -type NestedTocNode = { - item: TocItem; - children: Array; -}; - -function calculateNestedToc(toc: Toc): NestedTocRoot { - const currentAncestors = new Map(); - const root: NestedTocRoot = { - item: null, - children: [], - }; - const startIndex = 1; // Skip "Overview" - for (let i = startIndex; i < toc.length; i++) { - const item = toc[i]; - const currentParent: NestedTocNode | NestedTocRoot = - currentAncestors.get(item.depth - 1) || root; - const node: NestedTocNode = { - item, - children: [], - }; - currentParent.children.push(node); - currentAncestors.set(item.depth, node); - } - return root; -} - -function InlineToc() { - const toc = useContext(TocContext); - const root = useMemo(() => calculateNestedToc(toc), [toc]); - if (root.children.length < 2) { - return null; - } - return ; -} - -function InlineTocItem({items}: {items: Array}) { - return ( -
          - {items.map((node) => ( -
        • - {node.item.text} - {node.children.length > 0 && } -
        • - ))} -
        - ); -} - -type TranslationProgress = 'complete' | 'in-progress'; - -function LanguageList({progress}: {progress: TranslationProgress}) { - const allLanguages = React.useContext(LanguagesContext) ?? []; - const languages = allLanguages - .filter( - ({code}) => - code !== 'en' && - (progress === 'complete' - ? finishedTranslations.includes(code) - : !finishedTranslations.includes(code)) - ) - .sort((a, b) => a.enName.localeCompare(b.enName)); - return ( -
          - {languages.map(({code, name, enName}) => { - return ( -
        • - - {enName} ({name}) - {' '} - —{' '} - - Contribute - -
        • - ); - })} -
        - ); -} - function YouTubeIframe(props: any) { return (
        @@ -460,7 +232,22 @@ function Image(props: any) { return {alt}; } -export const MDXComponents = { +function annotateMDXComponents( + components: Record +): Record { + return Object.entries(components).reduce((acc, [key, Component]) => { + acc[key] = (props) => ; + acc[key].displayName = `Annotated(${key})`; // Optional, for debugging + return acc; + }, {} as Record); +} + +export const MDXComponentsToc = annotateMDXComponents({ + a: Link, + code: InlineCode, +}); + +export const MDXComponents = annotateMDXComponents({ p: P, strong: Strong, blockquote: Blockquote, @@ -529,11 +316,4 @@ export const MDXComponents = { CodeStep, YouTubeIframe, ErrorDecoder, -}; - -for (let key in MDXComponents) { - if (MDXComponents.hasOwnProperty(key)) { - const MDXComponent: any = (MDXComponents as any)[key]; - MDXComponent.mdxName = key; - } -} +}); diff --git a/src/components/MDX/PackageImport.tsx b/src/components/MDX/PackageImport.tsx index 5e2da820e..a4d5fa140 100644 --- a/src/components/MDX/PackageImport.tsx +++ b/src/components/MDX/PackageImport.tsx @@ -12,10 +12,10 @@ interface PackageImportProps { export function PackageImport({children}: PackageImportProps) { const terminal = Children.toArray(children).filter((child: any) => { - return child.type?.mdxName !== 'pre'; + return child.props?.['data-mdx-name'] !== 'pre'; }); const code = Children.toArray(children).map((child: any, i: number) => { - if (child.type?.mdxName === 'pre') { + if (child.props?.['data-mdx-name'] === 'pre') { return ( ) => ( +

        +); + +export const Strong = (strong: HTMLAttributes) => ( + +); + +export const OL = (p: HTMLAttributes) => ( +

          +); +export const LI = (p: HTMLAttributes) => ( +
        1. +); +export const UL = (p: HTMLAttributes) => ( +
            +); + +export const Divider = () => ( +
            +); diff --git a/src/components/MDX/Sandpack/CustomPreset.tsx b/src/components/MDX/Sandpack/CustomPreset.tsx index 7d6e566d2..f95d3270a 100644 --- a/src/components/MDX/Sandpack/CustomPreset.tsx +++ b/src/components/MDX/Sandpack/CustomPreset.tsx @@ -1,3 +1,5 @@ +'use client'; + /* * Copyright (c) Facebook, Inc. and its affiliates. */ diff --git a/src/components/MDX/Sandpack/SandpackRoot.tsx b/src/components/MDX/Sandpack/SandpackRoot.tsx index 67f40d0b3..1084ea647 100644 --- a/src/components/MDX/Sandpack/SandpackRoot.tsx +++ b/src/components/MDX/Sandpack/SandpackRoot.tsx @@ -1,3 +1,5 @@ +'use client'; + /* * Copyright (c) Facebook, Inc. and its affiliates. */ diff --git a/src/components/MDX/Sandpack/createFileMap.ts b/src/components/MDX/Sandpack/createFileMap.ts index 193b07be8..07bdcd377 100644 --- a/src/components/MDX/Sandpack/createFileMap.ts +++ b/src/components/MDX/Sandpack/createFileMap.ts @@ -12,19 +12,22 @@ export const SUPPORTED_FILES = [AppJSPath, StylesCSSPath]; export const createFileMap = (codeSnippets: any) => { return codeSnippets.reduce( (result: Record, codeSnippet: React.ReactElement) => { - if ( - (codeSnippet.type as any).mdxName !== 'pre' && - codeSnippet.type !== 'pre' - ) { - return result; - } + // TODO: actually fix this const {props} = ( codeSnippet.props as PropsWithChildren<{ children: ReactElement< - HTMLAttributes & {meta?: string} + HTMLAttributes & { + meta?: string; + 'data-mdx-name'?: string; + } >; }> ).children; + + if (props?.['data-mdx-name'] !== 'code') { + return result; + } + let filePath; // path in the folder structure let fileHidden = false; // if the file is available as a tab let fileActive = false; // if the file tab is shown by default diff --git a/src/components/MDX/Sandpack/index.tsx b/src/components/MDX/Sandpack/index.tsx index 6755ba8de..d90facfe8 100644 --- a/src/components/MDX/Sandpack/index.tsx +++ b/src/components/MDX/Sandpack/index.tsx @@ -1,3 +1,5 @@ +'use client'; + /* * Copyright (c) Facebook, Inc. and its affiliates. */ diff --git a/src/components/MDX/SandpackWithHTMLOutput.tsx b/src/components/MDX/SandpackWithHTMLOutput.tsx index 51ce28dc1..041d7bf9b 100644 --- a/src/components/MDX/SandpackWithHTMLOutput.tsx +++ b/src/components/MDX/SandpackWithHTMLOutput.tsx @@ -1,3 +1,5 @@ +'use client'; + import {Children, memo} from 'react'; import InlineCode from './InlineCode'; import Sandpack from './Sandpack'; diff --git a/src/components/MDX/TerminalBlock.tsx b/src/components/MDX/TerminalBlock.tsx index 475292716..73a102167 100644 --- a/src/components/MDX/TerminalBlock.tsx +++ b/src/components/MDX/TerminalBlock.tsx @@ -1,3 +1,5 @@ +'use client'; + /* * Copyright (c) Facebook, Inc. and its affiliates. */ diff --git a/src/components/MDX/TocContext.tsx b/src/components/MDX/TocContext.tsx index 8aeead370..cc7080a8b 100644 --- a/src/components/MDX/TocContext.tsx +++ b/src/components/MDX/TocContext.tsx @@ -7,7 +7,7 @@ import type {ReactNode} from 'react'; export type TocItem = { url: string; - text: ReactNode; + node: ReactNode; depth: number; }; export type Toc = Array; diff --git a/src/components/SafariScrollHandler.tsx b/src/components/SafariScrollHandler.tsx new file mode 100644 index 000000000..2cb3e4037 --- /dev/null +++ b/src/components/SafariScrollHandler.tsx @@ -0,0 +1,22 @@ +'use client'; + +import {useEffect} from 'react'; + +export function ScrollHandler() { + useEffect(() => { + // Taken from StackOverflow. Trying to detect both Safari desktop and mobile. + const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); + if (isSafari) { + // This is kind of a lie. + // We still rely on the manual Next.js scrollRestoration logic. + // However, we *also* don't want Safari grey screen during the back swipe gesture. + // Seems like it doesn't hurt to enable auto restore *and* Next.js logic at the same time. + history.scrollRestoration = 'auto'; + } else { + // For other browsers, let Next.js set scrollRestoration to 'manual'. + // It seems to work better for Chrome and Firefox which don't animate the back swipe. + } + }, []); + + return null; +} diff --git a/src/components/Search.tsx b/src/components/Search.tsx index c7401487b..3ff5c1881 100644 --- a/src/components/Search.tsx +++ b/src/components/Search.tsx @@ -4,7 +4,7 @@ import Head from 'next/head'; import Link from 'next/link'; -import Router from 'next/router'; +import {useRouter} from 'next/navigation'; import {lazy, useEffect} from 'react'; import * as React from 'react'; import {createPortal} from 'react-dom'; @@ -111,6 +111,7 @@ export function Search({ }, }: SearchProps) { useDocSearchKeyboardEvents({isOpen, onOpen, onClose}); + const router = useRouter(); return ( <> @@ -127,7 +128,7 @@ export function Search({ onClose={onClose} navigator={{ navigate({itemUrl}: any) { - Router.push(itemUrl); + router.push(itemUrl); }, }} transformItems={(items: any[]) => { diff --git a/src/components/Seo.tsx b/src/components/Seo.tsx deleted file mode 100644 index 628085744..000000000 --- a/src/components/Seo.tsx +++ /dev/null @@ -1,185 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - */ - -import * as React from 'react'; -import Head from 'next/head'; -import {withRouter, Router} from 'next/router'; -import {siteConfig} from '../siteConfig'; -import {finishedTranslations} from 'utils/finishedTranslations'; - -export interface SeoProps { - title: string; - titleForTitleTag: undefined | string; - description?: string; - image?: string; - // jsonld?: JsonLDType | Array; - children?: React.ReactNode; - isHomePage: boolean; - searchOrder?: number; -} - -// If you are a maintainer of a language fork, -// deployedTranslations has been moved to src/utils/finishedTranslations.ts. - -function getDomain(languageCode: string): string { - const subdomain = languageCode === 'en' ? '' : languageCode + '.'; - return subdomain + 'react.dev'; -} - -export const Seo = withRouter( - ({ - title, - titleForTitleTag, - image = '/images/og-default.png', - router, - children, - isHomePage, - searchOrder, - }: SeoProps & {router: Router}) => { - const siteDomain = getDomain(siteConfig.languageCode); - const canonicalUrl = `https://${siteDomain}${ - router.asPath.split(/[\?\#]/)[0] - }`; - // Allow setting a different title for Google results - const pageTitle = - (titleForTitleTag ?? title) + (isHomePage ? '' : ' – React'); - // Twitter's meta parser is not very good. - const twitterTitle = pageTitle.replace(/[<>]/g, ''); - let description = isHomePage - ? 'React is the library for web and native user interfaces. Build user interfaces out of individual pieces called components written in JavaScript. React is designed to let you seamlessly combine components written by independent people, teams, and organizations.' - : 'The library for web and native user interfaces'; - return ( - - - {title != null && {pageTitle}} - {isHomePage && ( - // Let Google figure out a good description for each page. - - )} - - - {finishedTranslations.map((languageCode) => ( - - ))} - - - - {title != null && ( - - )} - {description != null && ( - - )} - - - - - {title != null && ( - - )} - {description != null && ( - - )} - - - {searchOrder != null && ( - - )} - - - - - - - - - {children} - - ); - } -); diff --git a/src/components/ThemeScript.jsx b/src/components/ThemeScript.jsx new file mode 100644 index 000000000..66034557c --- /dev/null +++ b/src/components/ThemeScript.jsx @@ -0,0 +1,52 @@ +function ThemeInlineScript() { + function setTheme(newTheme) { + window.__theme = newTheme; + if (newTheme === 'dark') { + document.documentElement.classList.add('dark'); + } else if (newTheme === 'light') { + document.documentElement.classList.remove('dark'); + } + } + + var preferredTheme; + try { + preferredTheme = localStorage.getItem('theme'); + } catch (err) {} + + window.__setPreferredTheme = function (newTheme) { + preferredTheme = newTheme; + setTheme(newTheme); + try { + localStorage.setItem('theme', newTheme); + } catch (err) {} + }; + + var initialTheme = preferredTheme; + var darkQuery = window.matchMedia('(prefers-color-scheme: dark)'); + + if (!initialTheme) { + initialTheme = darkQuery.matches ? 'dark' : 'light'; + } + setTheme(initialTheme); + + darkQuery.addEventListener('change', function (e) { + if (!preferredTheme) { + setTheme(e.matches ? 'dark' : 'light'); + } + }); + + document.documentElement.classList.add( + window.navigator.platform.includes('Mac') ? 'platform-mac' : 'platform-win' + ); +} + +export function ThemeScript() { + return ( + - - ); -} diff --git a/src/components/DevContentRefresher.tsx b/src/components/DevContentRefresher.tsx deleted file mode 100644 index 31a0961ed..000000000 --- a/src/components/DevContentRefresher.tsx +++ /dev/null @@ -1,29 +0,0 @@ -'use client'; - -import {useRouter} from 'next/navigation'; -import {useRef, useEffect} from 'react'; - -export function DevContentRefresher() { - const router = useRouter(); - const wsRef = useRef(null); - - useEffect(() => { - wsRef.current = new WebSocket('ws://localhost:3001'); - - wsRef.current.onmessage = (event) => { - const message = JSON.parse(event.data); - - if (message.event === 'refresh') { - console.log('Refreshing content...'); - // @ts-ignore - router.hmrRefresh(); // Triggers client-side refresh - } - }; - - return () => { - wsRef.current?.close(); - }; - }, [router]); - - return null; -} diff --git a/src/components/ErrorDecoderProvider.tsx b/src/components/ErrorDecoderProvider.tsx deleted file mode 100644 index bad1ed2d0..000000000 --- a/src/components/ErrorDecoderProvider.tsx +++ /dev/null @@ -1,19 +0,0 @@ -'use client'; - -import {ErrorDecoderContext} from './ErrorDecoderContext'; - -export function ErrorDecoderProvider({ - children, - errorMessage, - errorCode, -}: { - children: React.ReactNode; - errorMessage: string | null; - errorCode: string | null; -}) { - return ( - - {children} - - ); -} diff --git a/src/components/Layout/Feedback.tsx b/src/components/Layout/Feedback.tsx index 16b974c10..34db728ce 100644 --- a/src/components/Layout/Feedback.tsx +++ b/src/components/Layout/Feedback.tsx @@ -3,12 +3,12 @@ */ import {useState} from 'react'; +import {useRouter} from 'next/router'; import cn from 'classnames'; -import {usePathname} from 'next/navigation'; export function Feedback({onSubmit = () => {}}: {onSubmit?: () => void}) { - const pathname = usePathname(); - const cleanedPath = pathname.split(/[\?\#]/)[0]; + const {asPath} = useRouter(); + const cleanedPath = asPath.split(/[\?\#]/)[0]; // Reset on route changes. return ; } diff --git a/src/components/Layout/Page.tsx b/src/components/Layout/Page.tsx index ea0c53e1c..24d379589 100644 --- a/src/components/Layout/Page.tsx +++ b/src/components/Layout/Page.tsx @@ -1,16 +1,16 @@ -'use client'; - /* * Copyright (c) Facebook, Inc. and its affiliates. */ -import * as React from 'react'; import {Suspense} from 'react'; +import * as React from 'react'; +import {useRouter} from 'next/router'; import {SidebarNav} from './SidebarNav'; import {Footer} from './Footer'; import {Toc} from './Toc'; +// import SocialBanner from '../SocialBanner'; import {DocsPageFooter} from 'components/DocsFooter'; - +import {Seo} from 'components/Seo'; import PageHeading from 'components/PageHeading'; import {getRouteMeta} from './getRouteMeta'; import {TocContext} from '../MDX/TocContext'; @@ -20,8 +20,8 @@ import type {RouteItem} from 'components/Layout/getRouteMeta'; import {HomeContent} from './HomeContent'; import {TopNav} from './TopNav'; import cn from 'classnames'; +import Head from 'next/head'; -// Prefetch the code block component import(/* webpackPrefetch: true */ '../MDX/CodeBlock/CodeBlock'); interface PageProps { @@ -36,7 +36,6 @@ interface PageProps { }; section: 'learn' | 'reference' | 'community' | 'blog' | 'home' | 'unknown'; languages?: Languages | null; - pathname: string; } export function Page({ @@ -45,11 +44,11 @@ export function Page({ routeTree, meta, section, - pathname, languages = null, }: PageProps) { - const cleanedPath = pathname.split(/[\?\#]/)[0]; - const {route, nextRoute, prevRoute, breadcrumbs} = getRouteMeta( + const {asPath} = useRouter(); + const cleanedPath = asPath.split(/[\?\#]/)[0]; + const {route, nextRoute, prevRoute, breadcrumbs, order} = getRouteMeta( cleanedPath, routeTree ); @@ -114,17 +113,31 @@ export function Page({ showSidebar = false; } + let searchOrder; + if (section === 'learn' || (section === 'blog' && !isBlogIndex)) { + searchOrder = order; + } + return ( <> + {(isHomePage || isBlogIndex) && ( - // RSS Feed link is now handled by metadata in layout.tsx - + + + )} + {/**/}
            -
            +
            {content}
            - {showToc && toc.length > 0 && } + {showToc && toc.length > 0 && }
            diff --git a/src/components/Layout/Sidebar/SidebarRouteTree.tsx b/src/components/Layout/Sidebar/SidebarRouteTree.tsx index f67b0ed2b..72003df74 100644 --- a/src/components/Layout/Sidebar/SidebarRouteTree.tsx +++ b/src/components/Layout/Sidebar/SidebarRouteTree.tsx @@ -5,12 +5,12 @@ import {useRef, useLayoutEffect, Fragment} from 'react'; import cn from 'classnames'; +import {useRouter} from 'next/router'; import {SidebarLink} from './SidebarLink'; import {useCollapse} from 'react-collapsed'; import usePendingRoute from 'hooks/usePendingRoute'; import type {RouteItem} from 'components/Layout/getRouteMeta'; import {siteConfig} from 'siteConfig'; -import {usePathname} from 'next/navigation'; interface SidebarRouteTreeProps { isForceExpanded: boolean; @@ -77,7 +77,7 @@ export function SidebarRouteTree({ routeTree, level = 0, }: SidebarRouteTreeProps) { - const slug = usePathname().split(/[\?\#]/)[0]; + const slug = useRouter().asPath.split(/[\?\#]/)[0]; const pendingRoute = usePendingRoute(); const currentRoutes = routeTree.routes as RouteItem[]; return ( diff --git a/src/components/Layout/Toc.tsx b/src/components/Layout/Toc.tsx index a8d269898..5308c602c 100644 --- a/src/components/Layout/Toc.tsx +++ b/src/components/Layout/Toc.tsx @@ -11,11 +11,7 @@ export function Toc({headings}: {headings: Toc}) { // TODO: We currently have a mismatch between the headings in the document // and the headings we find in MarkdownPage (i.e. we don't find Recap or Challenges). // Select the max TOC item we have here for now, but remove this after the fix. - const selectedIndex = - currentIndex !== undefined - ? Math.min(currentIndex, headings.length - 1) - : -1; - + const selectedIndex = Math.min(currentIndex, headings.length - 1); return (