From 54a331d7eff285b87b6865b3ad65a5fea1a86547 Mon Sep 17 00:00:00 2001 From: William Wong Date: Fri, 12 Mar 2021 04:38:34 -0800 Subject: [PATCH 01/60] Mention useReducer as a cause of rerender in React.memo (#3576) --- content/docs/reference-react.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/reference-react.md b/content/docs/reference-react.md index 65c513e9d..36d6cddfb 100644 --- a/content/docs/reference-react.md +++ b/content/docs/reference-react.md @@ -128,7 +128,7 @@ const MyComponent = React.memo(function MyComponent(props) { If your component renders the same result given the same props, you can wrap it in a call to `React.memo` for a performance boost in some cases by memoizing the result. This means that React will skip rendering the component, and reuse the last rendered result. -`React.memo` only checks for prop changes. If your function component wrapped in `React.memo` has a [`useState`](/docs/hooks-state.html) or [`useContext`](/docs/hooks-reference.html#usecontext) Hook in its implementation, it will still rerender when state or context change. +`React.memo` only checks for prop changes. If your function component wrapped in `React.memo` has a [`useState`](/docs/hooks-state.html), [`useReducer`](/docs/hooks-reference.html#usereducer) or [`useContext`](/docs/hooks-reference.html#usecontext) Hook in its implementation, it will still rerender when state or context change. By default it will only shallowly compare complex objects in the props object. If you want control over the comparison, you can also provide a custom comparison function as the second argument. From df2fbde3b52336229eee550debd692184c427691 Mon Sep 17 00:00:00 2001 From: Juno Tesoro <38450133+jmtes@users.noreply.github.com> Date: Mon, 22 Mar 2021 01:46:44 -0700 Subject: [PATCH 02/60] Fix typos in error-boundaries.md (#3586) Add missing "how" and "an" --- content/docs/error-boundaries.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/docs/error-boundaries.md b/content/docs/error-boundaries.md index ecfa8409c..ef9a6d58f 100644 --- a/content/docs/error-boundaries.md +++ b/content/docs/error-boundaries.md @@ -71,7 +71,7 @@ Check out [this example of declaring and using an error boundary](https://codepe ## Where to Place Error Boundaries {#where-to-place-error-boundaries} -The granularity of error boundaries is up to you. You may wrap top-level route components to display a “Something went wrong” message to the user, just like server-side frameworks often handle crashes. You may also wrap individual widgets in an error boundary to protect them from crashing the rest of the application. +The granularity of error boundaries is up to you. You may wrap top-level route components to display a “Something went wrong” message to the user, just like how server-side frameworks often handle crashes. You may also wrap individual widgets in an error boundary to protect them from crashing the rest of the application. ## New Behavior for Uncaught Errors {#new-behavior-for-uncaught-errors} @@ -130,7 +130,7 @@ Error boundaries **do not** catch errors inside event handlers. React doesn't need error boundaries to recover from errors in event handlers. Unlike the render method and lifecycle methods, the event handlers don't happen during rendering. So if they throw, React still knows what to display on the screen. -If you need to catch an error inside event handler, use the regular JavaScript `try` / `catch` statement: +If you need to catch an error inside an event handler, use the regular JavaScript `try` / `catch` statement: ```js{9-13,17-20} class MyComponent extends React.Component { From f5784cb1386c5568b0007019a60e0a6e4e666544 Mon Sep 17 00:00:00 2001 From: Dan Abramov Date: Mon, 22 Mar 2021 23:00:32 +0000 Subject: [PATCH 03/60] Use React 17.0.2 (#3590) --- content/versions.yml | 2 ++ package.json | 6 +++--- src/site-constants.js | 2 +- yarn.lock | 26 +++++++++++++------------- 4 files changed, 19 insertions(+), 17 deletions(-) diff --git a/content/versions.yml b/content/versions.yml index ffbc479ed..510d4a3db 100644 --- a/content/versions.yml +++ b/content/versions.yml @@ -1,3 +1,5 @@ +- title: '17.0.2' + changelog: https://github.com/facebook/react/blob/master/CHANGELOG.md#1702-march-22-2021 - title: '17.0.1' changelog: https://github.com/facebook/react/blob/master/CHANGELOG.md#1701-october-22-2020 - title: '17.0.0' diff --git a/package.json b/package.json index 0d9566128..ac897667c 100644 --- a/package.json +++ b/package.json @@ -47,8 +47,8 @@ "normalize.css": "^8.0.0", "prettier": "^1.7.4", "prismjs": "^1.15.0", - "react": "^17.0.1", - "react-dom": "^17.0.1", + "react": "^17.0.2", + "react-dom": "^17.0.2", "react-helmet": "^5.2.0", "react-live": "1.8.0-0", "remarkable": "^1.7.1", @@ -58,7 +58,7 @@ "unist-util-visit": "^1.1.3" }, "engines": { - "node": "12.x.x || 14.x.x", + "node": "12.x.x || 14.x.x || 15.x.x", "yarn": "^1.3.2" }, "homepage": "https://reactjs.org/", diff --git a/src/site-constants.js b/src/site-constants.js index 54870ab1d..e9f79d431 100644 --- a/src/site-constants.js +++ b/src/site-constants.js @@ -8,7 +8,7 @@ // NOTE: We can't just use `location.toString()` because when we are rendering // the SSR part in node.js we won't have a proper location. const urlRoot = 'https://reactjs.org'; -const version = '17.0.1'; +const version = '17.0.2'; const babelURL = 'https://unpkg.com/babel-standalone@6.26.0/babel.min.js'; export {babelURL, urlRoot, version}; diff --git a/yarn.lock b/yarn.lock index 8a13aaf70..be08f8d6c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12448,14 +12448,14 @@ react-dev-utils@^4.2.3: strip-ansi "3.0.1" text-table "0.2.0" -react-dom@^17.0.1: - version "17.0.1" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.1.tgz#1de2560474ec9f0e334285662ede52dbc5426fc6" - integrity sha512-6eV150oJZ9U2t9svnsspTMrWNyHc6chX0KzDeAOXftRa8bNeOKTTfCJ7KorIwenkHd2xqVTBTCZd79yk/lx/Ug== +react-dom@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" + integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" - scheduler "^0.20.1" + scheduler "^0.20.2" react-error-overlay@^3.0.0: version "3.0.0" @@ -12601,10 +12601,10 @@ react@^16.8.0: object-assign "^4.1.1" prop-types "^15.6.2" -react@^17.0.1: - version "17.0.1" - resolved "https://registry.yarnpkg.com/react/-/react-17.0.1.tgz#6e0600416bd57574e3f86d92edba3d9008726127" - integrity sha512-lG9c9UuMHdcAexXtigOZLX8exLWkW0Ku29qPRU8uhF2R9BN96dLCt0psvzPLlHc5OWkgymP3qwTRgbnw5BKx3w== +react@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" + integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" @@ -13433,10 +13433,10 @@ scheduler@^0.19.1: loose-envify "^1.1.0" object-assign "^4.1.1" -scheduler@^0.20.1: - version "0.20.1" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.1.tgz#da0b907e24026b01181ecbc75efdc7f27b5a000c" - integrity sha512-LKTe+2xNJBNxu/QhHvDR14wUXHRQbVY5ZOYpOGWRzhydZUqrLb2JBvLPY7cAqFmqrWuDED0Mjk7013SZiOz6Bw== +scheduler@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" + integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" From 8aee286cc8c63a9d2794a8a2f4574f6a44d0917c Mon Sep 17 00:00:00 2001 From: Pradip Date: Tue, 23 Mar 2021 09:59:26 +0100 Subject: [PATCH 04/60] Testing Recipes - Timers: call useFakeTimers/userRealTimers before/after each test (#3591) --- content/docs/testing-recipes.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/docs/testing-recipes.md b/content/docs/testing-recipes.md index 875522591..1fa4a6969 100644 --- a/content/docs/testing-recipes.md +++ b/content/docs/testing-recipes.md @@ -465,13 +465,12 @@ import { act } from "react-dom/test-utils"; import Card from "./card"; -jest.useFakeTimers(); - let container = null; beforeEach(() => { // setup a DOM element as a render target container = document.createElement("div"); document.body.appendChild(container); + jest.useFakeTimers(); }); afterEach(() => { @@ -479,6 +478,7 @@ afterEach(() => { unmountComponentAtNode(container); container.remove(); container = null; + jest.useRealTimers(); }); it("should select null after timing out", () => { From 7626d6ce8233f5ce583522621a01af19c107538d Mon Sep 17 00:00:00 2001 From: OliverPrada <49795876+OliverPradaLara@users.noreply.github.com> Date: Tue, 23 Mar 2021 19:15:56 -0300 Subject: [PATCH 05/60] Add Chile Meetup Group (#3584) --- content/community/meetups.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/content/community/meetups.md b/content/community/meetups.md index cff04ae1f..8403d6d8a 100644 --- a/content/community/meetups.md +++ b/content/community/meetups.md @@ -50,6 +50,9 @@ Do you have a local React.js meetup? Add it here! (Please keep the list alphabet * [Ottawa, ON](https://www.meetup.com/Ottawa-ReactJS-Meetup/) * [Toronto, ON](https://www.meetup.com/Toronto-React-Native/events/) +## Chile {#chile} +* [Santiago](https://www.meetup.com/es-ES/react-santiago/) + ## China {#china} * [Beijing](https://www.meetup.com/Beijing-ReactJS-Meetup/) From c970f75a0ac3513f50e7a4989757c50cde0b7396 Mon Sep 17 00:00:00 2001 From: vikram menon Date: Fri, 26 Mar 2021 12:30:18 -0700 Subject: [PATCH 06/60] Fix 404 broken link for createFragmentContainer (#3598) --- content/docs/higher-order-components.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/higher-order-components.md b/content/docs/higher-order-components.md index 8d97b61ce..07dc90c38 100644 --- a/content/docs/higher-order-components.md +++ b/content/docs/higher-order-components.md @@ -14,7 +14,7 @@ const EnhancedComponent = higherOrderComponent(WrappedComponent); Whereas a component transforms props into UI, a higher-order component transforms a component into another component. -HOCs are common in third-party React libraries, such as Redux's [`connect`](https://github.com/reduxjs/react-redux/blob/master/docs/api/connect.md#connect) and Relay's [`createFragmentContainer`](http://facebook.github.io/relay/docs/en/fragment-container.html). +HOCs are common in third-party React libraries, such as Redux's [`connect`](https://github.com/reduxjs/react-redux/blob/master/docs/api/connect.md#connect) and Relay's [`createFragmentContainer`](https://relay.dev/docs/v10.1.3/fragment-container/#createfragmentcontainer). In this document, we'll discuss why higher-order components are useful, and how to write your own. From c9efa5e2661ad9cd7a07021a429e063e410afe03 Mon Sep 17 00:00:00 2001 From: ilovepullrequests <79510995+ilovepullrequests@users.noreply.github.com> Date: Mon, 5 Apr 2021 09:29:48 +0000 Subject: [PATCH 07/60] Correct grammar (#3608) Change 'was' to 'were'. --- content/docs/strict-mode.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/strict-mode.md b/content/docs/strict-mode.md index 5e213d9e3..590ed7b7d 100644 --- a/content/docs/strict-mode.md +++ b/content/docs/strict-mode.md @@ -55,7 +55,7 @@ Since object refs were largely added as a replacement for string refs, strict mo React used to support `findDOMNode` to search the tree for a DOM node given a class instance. Normally you don't need this because you can [attach a ref directly to a DOM node](/docs/refs-and-the-dom.html#creating-refs). -`findDOMNode` can also be used on class components but this was breaking abstraction levels by allowing a parent to demand that certain children was rendered. It creates a refactoring hazard where you can't change the implementation details of a component because a parent might be reaching into its DOM node. `findDOMNode` only returns the first child, but with the use of Fragments, it is possible for a component to render multiple DOM nodes. `findDOMNode` is a one time read API. It only gave you an answer when you asked for it. If a child component renders a different node, there is no way to handle this change. Therefore `findDOMNode` only worked if components always return a single DOM node that never changes. +`findDOMNode` can also be used on class components but this was breaking abstraction levels by allowing a parent to demand that certain children were rendered. It creates a refactoring hazard where you can't change the implementation details of a component because a parent might be reaching into its DOM node. `findDOMNode` only returns the first child, but with the use of Fragments, it is possible for a component to render multiple DOM nodes. `findDOMNode` is a one time read API. It only gave you an answer when you asked for it. If a child component renders a different node, there is no way to handle this change. Therefore `findDOMNode` only worked if components always return a single DOM node that never changes. You can instead make this explicit by passing a ref to your custom component and pass that along to the DOM using [ref forwarding](/docs/forwarding-refs.html#forwarding-refs-to-dom-components). From 49fd7d5f115378e3663b049f108a2d29b31290c8 Mon Sep 17 00:00:00 2001 From: Niklas P Date: Mon, 5 Apr 2021 11:31:03 +0200 Subject: [PATCH 08/60] Update reference-caveats-solution.js (#3609) As referenced in https://reactjs.org/docs/context.html update the example to use the naming conventions used across the page. --- examples/context/reference-caveats-solution.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/context/reference-caveats-solution.js b/examples/context/reference-caveats-solution.js index deefabd46..a06f5da21 100644 --- a/examples/context/reference-caveats-solution.js +++ b/examples/context/reference-caveats-solution.js @@ -10,9 +10,9 @@ class App extends React.Component { render() { // highlight-range{2} return ( - + - + ); } } From 3bff1ac3fb87d4757ba069bcd9ae229b1bdb0327 Mon Sep 17 00:00:00 2001 From: Pavlos Vinieratos Date: Thu, 8 Apr 2021 14:53:23 +0100 Subject: [PATCH 09/60] update on RN and react 17 (#3620) --- content/blog/2020-10-20-react-v17.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/blog/2020-10-20-react-v17.md b/content/blog/2020-10-20-react-v17.md index 83a1f7481..e25282140 100644 --- a/content/blog/2020-10-20-react-v17.md +++ b/content/blog/2020-10-20-react-v17.md @@ -58,7 +58,7 @@ React 17 supports the [new JSX transform](/blog/2020/09/22/introducing-the-new-j ## React Native {#react-native} -React Native has a separate release schedule. We currently expect the support for React 17 to land in React Native 0.65, but the exact version is subject to change. As always, you can track the release discussions on the React Native Community releases [issue tracker](https://github.com/react-native-community/releases). +React Native has a separate release schedule. We landed the support for React 17 in React Native 0.64. As always, you can track the release discussions on the React Native Community releases [issue tracker](https://github.com/react-native-community/releases). ## Installation {#installation} From 968f09159512b59afd5246a928789ae52592c923 Mon Sep 17 00:00:00 2001 From: Yuxiang Yang Date: Mon, 12 Apr 2021 14:46:51 +0800 Subject: [PATCH 10/60] update Optimizing Performance section (#3605) (#3623) Co-authored-by: Ethan Yang --- content/docs/optimizing-performance.md | 31 +++++--------------------- 1 file changed, 5 insertions(+), 26 deletions(-) diff --git a/content/docs/optimizing-performance.md b/content/docs/optimizing-performance.md index a3270959c..a78a7904a 100644 --- a/content/docs/optimizing-performance.md +++ b/content/docs/optimizing-performance.md @@ -156,32 +156,6 @@ You can learn more about this in [webpack documentation](https://webpack.js.org/ Remember that you only need to do this for production builds. You shouldn't apply `TerserPlugin` in development because it will hide useful React warnings, and make the builds much slower. -## Profiling Components with the Chrome Performance Tab {#profiling-components-with-the-chrome-performance-tab} - -In the **development** mode, you can visualize how components mount, update, and unmount, using the performance tools in supported browsers. For example: - -
React components in Chrome timeline
- -To do this in Chrome: - -1. Temporarily **disable all Chrome extensions, especially React DevTools**. They can significantly skew the results! - -2. Make sure you're running the application in the development mode. - -3. Open the Chrome DevTools **[Performance](https://developers.google.com/web/tools/chrome-devtools/evaluate-performance/timeline-tool)** tab and press **Record**. - -4. Perform the actions you want to profile. Don't record more than 20 seconds or Chrome might hang. - -5. Stop recording. - -6. React events will be grouped under the **User Timing** label. - -For a more detailed walkthrough, check out [this article by Ben Schwarz](https://calibreapp.com/blog/react-performance-profiling-optimization). - -Note that **the numbers are relative so components will render faster in production**. Still, this should help you realize when unrelated UI gets updated by mistake, and how deep and how often your UI updates occur. - -Currently Chrome, Edge, and IE are the only browsers supporting this feature, but we use the standard [User Timing API](https://developer.mozilla.org/en-US/docs/Web/API/User_Timing_API) so we expect more browsers to add support for it. - ## Profiling Components with the DevTools Profiler {#profiling-components-with-the-devtools-profiler} `react-dom` 16.5+ and `react-native` 0.57+ provide enhanced profiling capabilities in DEV mode with the React DevTools Profiler. @@ -199,6 +173,11 @@ If you haven't yet installed the React DevTools, you can find them here: > A production profiling bundle of `react-dom` is also available as `react-dom/profiling`. > Read more about how to use this bundle at [fb.me/react-profiling](https://fb.me/react-profiling) +> Note +> +> Before React 17, we use the standard [User Timing API](https://developer.mozilla.org/en-US/docs/Web/API/User_Timing_API) to profile components with the chrome performance tab. +> For a more detailed walkthrough, check out [this article by Ben Schwarz](https://calibreapp.com/blog/react-performance-profiling-optimization). + ## Virtualize Long Lists {#virtualize-long-lists} If your application renders long lists of data (hundreds or thousands of rows), we recommended using a technique known as "windowing". This technique only renders a small subset of your rows at any given time, and can dramatically reduce the time it takes to re-render the components as well as the number of DOM nodes created. From cf0f0f9375008130ed2da1fea0afc6d737f598b0 Mon Sep 17 00:00:00 2001 From: ramadevsign <50571688+orama254@users.noreply.github.com> Date: Wed, 14 Apr 2021 16:57:40 +0300 Subject: [PATCH 11/60] docs: Fix broken links to React Conf videos (#3629) Co-authored-by: Sebastian Silbermann --- content/community/videos.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/community/videos.md b/content/community/videos.md index a99dc80c7..b59ddfb98 100644 --- a/content/community/videos.md +++ b/content/community/videos.md @@ -13,12 +13,12 @@ Videos dedicated to the discussion of React and the React ecosystem. ### React Conf 2019 {#react-conf-2019} A playlist of videos from React Conf 2019. - + ### React Conf 2018 {#react-conf-2018} A playlist of videos from React Conf 2018. - + ### React.js Conf 2017 {#reactjs-conf-2017} From cde17832a49273a013428a9a33dae21d9c543157 Mon Sep 17 00:00:00 2001 From: ramadevsign <50571688+orama254@users.noreply.github.com> Date: Thu, 15 Apr 2021 11:24:28 +0300 Subject: [PATCH 12/60] docs: Add react learning path on frontend masters link (#3628) Co-authored-by: Sebastian Silbermann --- content/community/courses.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/community/courses.md b/content/community/courses.md index 47883c50a..1a9e66e5a 100644 --- a/content/community/courses.md +++ b/content/community/courses.md @@ -28,7 +28,7 @@ permalink: community/courses.html - [Egghead.io](https://egghead.io/browse/frameworks/react) - Short instructional videos on React and many other topics. -- [Frontend Masters](https://frontendmasters.com/courses/) - Video courses on React and other frontend frameworks. +- [Frontend Masters](https://frontendmasters.com/learn/react/) - Video courses on React. - [Fullstack React](https://www.fullstackreact.com/) - The up-to-date, in-depth, complete guide to React and friends. From 446345cfba91b62546f46f88fad893937a826cdc Mon Sep 17 00:00:00 2001 From: Nancy Heiss <6857695+nancyheiss@users.noreply.github.com> Date: Fri, 16 Apr 2021 13:28:38 -0700 Subject: [PATCH 13/60] fixing typo in tutorial readme (#3639) Co-authored-by: Nancy Heiss --- content/tutorial/tutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/tutorial/tutorial.md b/content/tutorial/tutorial.md index 772695181..a79c91584 100644 --- a/content/tutorial/tutorial.md +++ b/content/tutorial/tutorial.md @@ -524,7 +524,7 @@ Note how in `handleClick`, we call `.slice()` to create a copy of the `squares` ### Why Immutability Is Important {#why-immutability-is-important} -In the previous code example, we suggested that you use the `.slice()` method to create a copy of the `squares` array to modify instead of modifying the existing array. We'll now discuss immutability and why immutability is important to learn. +In the previous code example, we suggested that you use the `.slice()` method to create a copy of the `squares` array to copy instead of modifying the existing array. We'll now discuss immutability and why immutability is important to learn. There are generally two approaches to changing data. The first approach is to *mutate* the data by directly changing the data's values. The second approach is to replace the data with a new copy which has the desired changes. From 8e0ed8f8990d58f1b5abe8de74cbf1896295f91e Mon Sep 17 00:00:00 2001 From: Brian Vaughn Date: Mon, 19 Apr 2021 17:01:37 -0400 Subject: [PATCH 14/60] Removed createBlockingRoot API docs and added a warning note (#3642) --- content/docs/concurrent-mode-adoption.md | 4 ++++ content/docs/concurrent-mode-reference.md | 13 ------------- 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/content/docs/concurrent-mode-adoption.md b/content/docs/concurrent-mode-adoption.md index 720c34c17..f5b8d9db1 100644 --- a/content/docs/concurrent-mode-adoption.md +++ b/content/docs/concurrent-mode-adoption.md @@ -21,6 +21,10 @@ next: concurrent-mode-reference.html > >This documentation is aimed at early adopters and people who are curious. **If you're new to React, don't worry about these features** -- you don't need to learn them right now. +>Caution: +> +>All references below to "blocking mode" and `createBlockingRoot` are outdated and should be ignored. + - [Installation](#installation) diff --git a/content/docs/concurrent-mode-reference.md b/content/docs/concurrent-mode-reference.md index 663af1b3b..e36bb0532 100644 --- a/content/docs/concurrent-mode-reference.md +++ b/content/docs/concurrent-mode-reference.md @@ -28,7 +28,6 @@ This page is an API reference for the React [Concurrent Mode](/docs/concurrent-m - [Enabling Concurrent Mode](#concurrent-mode) - [`createRoot`](#createroot) - - [`createBlockingRoot`](#createblockingroot) - [Suspense](#suspense) - [`Suspense`](#suspensecomponent) - [`SuspenseList`](#suspenselist) @@ -47,18 +46,6 @@ Replaces `ReactDOM.render(, rootNode)` and enables Concurrent Mode. For more information on Concurrent Mode, check out the [Concurrent Mode documentation.](/docs/concurrent-mode-intro.html) -### `createBlockingRoot` {#createblockingroot} - -```js -ReactDOM.createBlockingRoot(rootNode).render() -``` - -Replaces `ReactDOM.render(, rootNode)` and enables [Blocking Mode](/docs/concurrent-mode-adoption.html#migration-step-blocking-mode). - -Opting into Concurrent Mode introduces semantic changes to how React works. This means that you can't use Concurrent Mode in just a few components. Because of this, some apps may not be able to migrate directly to Concurrent Mode. - -Blocking Mode only contains a small subset of Concurrent Mode features and is intended as an intermediary migration step for apps that are unable to migrate directly. - ## Suspense API {#suspense} ### `Suspense` {#suspensecomponent} From 420c3974830052a6e438e75254f4584a56d7c125 Mon Sep 17 00:00:00 2001 From: Bryn Dyment Date: Tue, 20 Apr 2021 16:26:24 +0900 Subject: [PATCH 15/60] =?UTF-8?q?Update=20code-splitting.md=20(setup=20?= =?UTF-8?q?=E2=86=92=20=20set=20up)=20(#3643)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (`setup` is the noun form and `set up` is the verb form.) --- content/docs/code-splitting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/code-splitting.md b/content/docs/code-splitting.md index 5d7591cb1..0d1a90b98 100644 --- a/content/docs/code-splitting.md +++ b/content/docs/code-splitting.md @@ -42,7 +42,7 @@ console.log(add(16, 26)); // 42 If you're using [Create React App](https://create-react-app.dev/), [Next.js](https://nextjs.org/), [Gatsby](https://www.gatsbyjs.org/), or a similar tool, you will have a Webpack setup out of the box to bundle your app. -If you aren't, you'll need to setup bundling yourself. For example, see the [Installation](https://webpack.js.org/guides/installation/) and [Getting Started](https://webpack.js.org/guides/getting-started/) guides on the Webpack docs. +If you aren't, you'll need to set up bundling yourself. For example, see the [Installation](https://webpack.js.org/guides/installation/) and [Getting Started](https://webpack.js.org/guides/getting-started/) guides on the Webpack docs. ## Code Splitting {#code-splitting} From 8251eabd38ecc29fca1a890c2381f5663f476f38 Mon Sep 17 00:00:00 2001 From: danield770 Date: Thu, 22 Apr 2021 12:19:27 +0300 Subject: [PATCH 16/60] `lifecycle` -> `lifecycle method` (#3650) --- content/docs/reference-react-component.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/reference-react-component.md b/content/docs/reference-react-component.md index 510a73a2c..a5dabb5d8 100644 --- a/content/docs/reference-react-component.md +++ b/content/docs/reference-react-component.md @@ -299,7 +299,7 @@ Note that this method is fired on *every* render, regardless of the cause. This getSnapshotBeforeUpdate(prevProps, prevState) ``` -`getSnapshotBeforeUpdate()` is invoked right before the most recently rendered output is committed to e.g. the DOM. It enables your component to capture some information from the DOM (e.g. scroll position) before it is potentially changed. Any value returned by this lifecycle will be passed as a parameter to `componentDidUpdate()`. +`getSnapshotBeforeUpdate()` is invoked right before the most recently rendered output is committed to e.g. the DOM. It enables your component to capture some information from the DOM (e.g. scroll position) before it is potentially changed. Any value returned by this lifecycle method will be passed as a parameter to `componentDidUpdate()`. This use case is not common, but it may occur in UIs like a chat thread that need to handle scroll position in a special way. From 5119600cf6f7a5dcbd4d2cc23f6b4ff55d2969b2 Mon Sep 17 00:00:00 2001 From: m019m1 <50258878+m019m1@users.noreply.github.com> Date: Thu, 22 Apr 2021 16:53:02 +0700 Subject: [PATCH 17/60] Include where `setState` is comming from (#3652) Co-authored-by: Sebastian Silbermann --- content/docs/hooks-reference.md | 1 + 1 file changed, 1 insertion(+) diff --git a/content/docs/hooks-reference.md b/content/docs/hooks-reference.md index 1aa14c7f2..1343cc90c 100644 --- a/content/docs/hooks-reference.md +++ b/content/docs/hooks-reference.md @@ -76,6 +76,7 @@ If your update function returns the exact same value as the current state, the s > Unlike the `setState` method found in class components, `useState` does not automatically merge update objects. You can replicate this behavior by combining the function updater form with object spread syntax: > > ```js +> const [state, setState] = useState({}); > setState(prevState => { > // Object.assign would also work > return {...prevState, ...updatedValues}; From c3c93e2a7ff1b1f7b8735a3a87d4b10937eaaf91 Mon Sep 17 00:00:00 2001 From: nkalinos Date: Tue, 27 Apr 2021 04:13:24 -0700 Subject: [PATCH 18/60] added hyperlink for Netlify (#3445) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a10ba5f0d..5d6618963 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ The documentation is divided into several sections with a different tone and pur 1. `git push my-fork-name the-name-of-my-branch` 1. Go to the [reactjs.org repo](https://github.com/reactjs/reactjs.org) and you should see recently pushed branches. 1. Follow GitHub's instructions. -1. If possible, include screenshots of visual changes. A Netlify build will also be automatically created once you make your PR so other people can see your change. +1. If possible, include screenshots of visual changes. A [Netlify](https://www.netlify.com/) build will also be automatically created once you make your PR so other people can see your change. ## Translation From 16158f195a86fc2dbb59b3ea5a5c32ce161dccb9 Mon Sep 17 00:00:00 2001 From: Skaidra Bake Date: Thu, 6 May 2021 12:11:22 +0100 Subject: [PATCH 19/60] Update devtools screenshot to latest version (#3670) --- content/images/tutorial/devtools.png | Bin 23994 -> 35001 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/content/images/tutorial/devtools.png b/content/images/tutorial/devtools.png index 6c47657030ce26571b0684f0c154d44204f02864..59cea8db66782e84c0ce9839a7b491a30a54baad 100644 GIT binary patch literal 35001 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
e}>0Z)qMirl4+W+Kwn9~oy>LmgWTe#lf7n!X& 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 z z3yenoSwVED`z(Tnbt!cL$LR26EsZk}6Xt&I@pbH?Y&K6%s19MVjPd5D=Mm}Be_8sZ zwOw;~!fG`QggI6C=G36!DxGzcj421!QqnZ&A7@5OReI!y$ijF3x;oX2l z^vPxS*NJU=BnM@@l-e;d$X_3W_NSx|w{HqBisNBQCZnmxQ@X=i`-Yn!AG1$j&D&jc z8vNe0GrOYl;0&E=$%^*|-(H7>CkN=f;3|!lmDy2(T73G#aM0M#{=*{f^QzN)ThrfP zIfS9+ruPXuruUpZ4I71s>xd3A3qPhW8nV6E#erDoLGi1P!(+4-0PIdp ziuOlJ5>OO2N;feCh0e15lqiw%(XY?sN)m>B(~SSeL>gI>jiHFn4}t(u_(9r$kIASX zQ3t|FA*28bAP0a00E7OcD}r%lpROnSe~kf{Ko|@d5TG0`0H(}_0r>x*h?1V5{^N%~ z>77tz6lE016W)Ii|ECvR2q*;bgPuZw`-Ol`=)Yi{&U`_>Yv*Eku^xBhq4H*biLouP zNfm(XF$I7ges%_SbcLs5X!ovr*Px;X7r!x-IV2K*18C0`rGYPKw>59cq zzF5(U6fVaT%f}_89U?-eBOHG7q5zqptx=be6xMDe zKznKv+61R!`@?n17)@W|DY9lxzC58m5fRXjmk?vOkavP;RB@BSoeTtn#K~t zbKl7pjT{|~y584L8o%e|Y*schdM$SSYT$G`6JZpv((_IF1~_o_9QP)bHPg0~;LhZ5 z_cegyUFNlnqKz@*cUoNV5qk8Xx7xv57n#i1!4~P2+QjGIeN$-F0g5KGdc=>_}I2`pR0@j!d5VK)3N$ zNrRywWXU>eWf)qxd8pzMWR-VCoMQ2-Zu`9yuWL!E+F|TW^p_YUBg6Zy3>FPScBbj8 z=(D#+-$ea0U)5{yObXM&y>IV2kF8|h2J;(#A@=6>b}O<;iB>x zj|b@GP@is-bx5ltfajSzthfeUZ{I(?!iy4ZrAR#<&lsRK6O>1Con@xvT)Ow{+G(X- zx~%wd&cGeR_{t@eN#Z92*3x!0chodd&9rYMF`y-`=XXWoU3_m4-e87|t1J=Km6#Oj zWiz5zHFPTrBVy*8Y3|$l&)JJwnUNr-3#UJHaC%zVy&dFgJ5G`zbMiqfG`$5VzW4zO zwMPs6+KzXM0Vs7`$dw`qpP+AMv$Z2d257NOpPOlE`GLmnQ3Zk0J{JPB&xb8P0EdHy z`QHkwOz#NIQ$^04f<|h$t>f>-LF=7%h2%CyREbBU>1TWya$LSnt%2$u=8l=6eO%}p z7ggOb#CHGHwcik)k618zdOVV?*jUPy?DzVaZY51BPo$@LDU_n`SxzOCUPq+tXOyfu z;#vZvvPCf+06kj;K+$_$r)exg}Euf*aH_yF0Q88Q28)5F0fJEsPW<* zhO;l6H|@Z8mRlDag4#_6Zi+HSBUs7(LAki6r}eHbtuVrel+{lyM^1g?Lk&v?JX1X8 zW8JE_muJ=zv#6@uDKEcFjOUI&9m(+B-w=Dx;zzFc&9z}>K4t?4f%UTOFs1+}$-jze z2$qZO>HC{DbF^%6F|l4v{zO6o!7V>bd*keBW!9DUWrQ}XBP>HoIh_JG;M&8urwgv! zgi}a{J5*hN%XMaY9p`ePur_)gF7B4KhrcuM>EdJ`ZE~@mG{7yfRdg=K&gbH7s!z<#+HfqeU>r5tWn{+k3$opK!JuP4v&!V zv5cV9xj5VS_6S+tF-0Kra@=k_{zHqIqhP2mJ4+}aj$(B2yJ6YbWdyjly)%vn{vaxl zFS?H$=BTbHcf*|#MYl9Vi-RUj)Px`MMqO8xSGXbme*ZCgQKp+4>^c>>f16N-Ug>r{ z-1AjQ7Llni*B`ezV}@8;Q)bQ@ol!;StPUiTJr~<6F;~Buba@Qrg>O7Wjqlzd=^sl; ze(u~n#652fu7bA1HN%D1zyzZKi+wT;@hdA1#3V6{SWYZS1UCp#_x$r8G@nV6+{igo zpM4hAh%V@W?ZoXF=G^LE$~W=Q2)M+J2*m9TTU*&qL9Hgv>_=P!yetc!I;?%uvwB`D zzA{{ro@%7tq{(iOZ!1ac(d5s(;d!o%&epJ&8x`0<-GpUkjcQn}$Wr<_*8Udqru=s4 zQrBG-&CkJ7BFz%PS}Zl-Do*{9Rb8Mb^0z77{)z+agBv0HZLl-B+=6mO1@F|hd=Bc@ zIB;zc8tpad)R5dt0$9RSia0!wDvp$NZaqpgb!j_Q)XRMaoGTTe?Ls8h_E!&Z`S$cd zGvVVsJzFD~6Zv4B7}B0EPa$4^EHjKw5&>oTu5rN5@@Xx>G_LR&`r+giPa6nWqz~%5 zS*&$U8Qu~kyRK&}#$$0erMdM(*}4CiMi#nTHIY}G@BOv>9VWA<4o%9|b{KS}#v~Q| zW^37x^4YZicWLfG`n`#oY8S?&G_)5Ak5jKvt2jS0fpc4Vudxz&hkGaT5a_0kh-!Meq<=u^yxCyFy=3FQ7r`TLvM@dxi}x1%20J+~p?qW^&tY6kT86%GOMu zdt)^}pZWf6TA*1;+4n12Q%OBfx_&(NL??6Ml9*lBoLXNRhUM}dsk*E=$?$WQhh0feZPeM3e*~#2pxw}TJf>o9f{ztVptCi z+P?ZECPsYw=X~>cvB4!$7UfNKFqy1e;o{lR@B2*JW_Mm`)HvOaAK3fei!w*32|3Au zd+IBEzm(W@K_S23P{vr)($z@JmR(sAHS|-v(+CJTYf))M4Fu51_c+6QeZ@Pt&!47mb(JwzLr7)noC!WlM z+@&0r|;Wmo-UNd0k#GF3i$rfRRGuZoz&(&CDx zQJ9-ax(Par#FpzqSlPfbHjOjVLZrEgoFamBXI>}g^%mB|AP}7?q;1@vxq!)SQQqOE zx3lCuItOfoxwddEi8z}&7L)Vf+0N0K%}W=Goqa4J`*cM(jS6A4Y0J5KH1({ja;$zi z@$1QNpjIyjDm~Qtl8fRD+t@*??2&n+D|laF26)Hs-OhHe z6HB-0tJjdaZjN~2f?&9w=)?dM6#OU-#N+4}-&j*FqztqCe!&TFM|DQV3X8Y!NN*9Z zJ5{Qj!B1GgjDCk%Fnvtd{QknNiD-}SY%M!7x};@j#G>Ekan+QxN~-d!jQHgh&IR}Lax&<|K|oyT;8w6K&w z24DD%1IPe_9IN*^$A3%CMBpL1b*HO|*EriWx9dkp>nTzZVKpHP-wGD~^|j*+6#aP~ z^N;eLUI`87`N(4jMcXnJzal16y>&tl#+>z3zlJ2koMZCSMPf#_Lu<`(y7P@a|DtL_ zTt7LG)6JrRbDWxB+>*UMXR$%>1dN_<{lXZt#L86a%A!4AFZPRR>kfG#TSF<>wdoxQ z&ifJjxMle_hgU$=da*|IJ5L%>i%*BiV3Qo`U;Apa-;ICW_^_Q0=zC>7hDbiqQ-ySV ze00NA_ zEU--!fF1v-hz9`oZM6UfBK>&a!bb&^4s(vp^?tKN zVp;HCGt#sB2Gz|C%W-}Q{u$_HEBhKURq(|8>2Hr*A&)lp`3qkmItEY(AFlsZH7wo@ zX&qcU>UolR#s4>$vhY>|ANB<9rPX=(L+~W;=I^wq*`l@)I2uzC0=@jszUJfOLUGfQ z9GmkkbPi6vcr`m&KMhbMg6EQBw7wTS$@R;Lr5zS_D_+s5q4R_DnW|4Bp+CjSNWpKiVux{N3g4FsU`5bvoe?CAwFZZ|)y;Eu%l5dc-b z5N>c&=zWiSKep1L+aYx~!2_s3E#03%c0{=KKct>-N7p=Jc5(u8Zco6yr0`pvibs7# zd!`NZukmht#$J(hr8T$=*+y2Q$?|SrilE%d7hj-v>s*_vBDKT#fB(5tb;-vU7BTyP z3@jlFc&v(9>CdpQ;LQ2)KdxfT$>vK3o7FgRioyWe{s}zS zAkhK~!2?!82^5$MK>%RD;}Q^AZ)i3d`ZoS0Tw(H--Y7GbUaILE06+nya-Qn|O6F|( zC}^(^iS!Y}U+bj#?;AJNACGJlgZ7;Tjee?I7DR9U$@+ZqfTsBhA4$)ms#Kv+m8ku+ zumbH}u7(d#-uF_bZ*$g{-8lvE6RPFwq0gVcTE551$E3J+V=-Us|G0USP4+8L1EW~9jOWr@$zUf1}0)p z+cDH(vl@x;3K_{6IgCfWafdrY?9W7#oOhuHgXeE3EbVp#Ru;n0%>`FXQRp&WjMdKf zR^nM9m0irmlV^RM_tBleFmudY7ZPzd8kB;A+)q_4kqY3f$w4Mk(BMwrX|rHR&+l4E znq&UD#$?bcOrWT{*rEt90l?p3cBts@Qrq`NIP#z1??QD3|Lpn951tRXlM@t`{>5gp z>>e;L__^E8Wf&6Mh?8gBSNnmwK_>S^m{|UeAUML8BP6-Hoi~)l-^R?cl??1p0di0? zMT}pgsR{>_21O?YX{Ethj?3`jQ$pSMO^(X$zf$y8rH8kpgaznWw?W>{6_GP|`Uy)qd-ZlfhXkCB!6;*w__A~4DRJ*<=&;E#Tc}$Au z22WMsEN<&#zy8Apb|ugEJ@)6tjzl6SrATb zt6eL(^ZADZvc|^dWycSJM%JxBu-u3E4Zx2#1@QhxDQx)e!doaaD}-hR*`zLcC5mka z`I_9Yh)C{;M3*6w-{UeXB6^XS>+UM*k7tLU%#`pl`W*nLm7uV$I%NsfuSKWjXpTrc z9Zcl0{lX>dWu6;Z0ctcoAtNbhrg`Tqv*TxnRz4}99YqHvIPVw+AYqQ07+=A8az_!# zGs-_Do-s-jN+iz?#%A1_D-l+Hc+MDghsokKMU*L{fBMvu9q?M=4Y*3)BI3UQClLPF From 5201abf69c5786062b8718502b7aa014646f5a7b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 12 May 2021 08:00:14 +0000 Subject: [PATCH 20/60] Bump lodash from 4.17.20 to 4.17.21 (#3680) --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index be08f8d6c..7a646028e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9780,9 +9780,9 @@ lodash.uniq@4.5.0, lodash.uniq@^4.5.0: integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= lodash@^4.11.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.3.0: - version "4.17.20" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" - integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== log-update@^3.0.0: version "3.4.0" From 12b08e47bf3e6c9204cb35b9b670fd60439b70d0 Mon Sep 17 00:00:00 2001 From: Marisha Parker Date: Fri, 14 May 2021 06:48:48 -0600 Subject: [PATCH 21/60] Update addons-test-utils.md (#3660) Co-authored-by: Sebastian Silbermann --- content/docs/addons-test-utils.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/content/docs/addons-test-utils.md b/content/docs/addons-test-utils.md index d269eaa73..ea92f3eb9 100644 --- a/content/docs/addons-test-utils.md +++ b/content/docs/addons-test-utils.md @@ -20,8 +20,10 @@ var ReactTestUtils = require('react-dom/test-utils'); // ES5 with npm > Note: > > We recommend using [React Testing Library](https://testing-library.com/react) which is designed to enable and encourage writing tests that use your components as the end users do. -> -> Alternatively, Airbnb has released a testing utility called [Enzyme](https://airbnb.io/enzyme/), which makes it easy to assert, manipulate, and traverse your React Components' output. +> +> For React versions <= 16, the [Enzyme](https://airbnb.io/enzyme/) library makes it easy to assert, manipulate, and traverse your React Components' output. + + - [`act()`](#act) - [`mockComponent()`](#mockcomponent) From abcf0358d43caa0772e599949458df9e6578489a Mon Sep 17 00:00:00 2001 From: Robert Haritonov <1260461+operatino@users.noreply.github.com> Date: Fri, 14 May 2021 22:47:15 +0100 Subject: [PATCH 22/60] Add React Advanced London 2021 - in-person + remote (#3686) --- content/community/conferences.md | 33 ++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/content/community/conferences.md b/content/community/conferences.md index a5889d900..27fc9c0b6 100644 --- a/content/community/conferences.md +++ b/content/community/conferences.md @@ -12,32 +12,37 @@ Do you know of a local React.js conference? Add it here! (Please keep the list c ## Upcoming Conferences {#upcoming-conferences} -### React fwdays’21 {#react-fwdays-2021} -March 27, 2021 - remote event +### render(ATL) 2021 {#render-atlanta-2021} +September 13-15, 2021. Atlanta, GA, USA -[Website](https://fwdays.com/en/event/react-fwdays-2021) - [Twitter](https://twitter.com/fwdays) - [Facebook](https://www.facebook.com/events/1133828147054286) - [LinkedIn](https://www.linkedin.com/events/reactfwdays-21onlineconference6758046347334582273) - [Meetup](https://www.meetup.com/ru-RU/Fwdays/events/275764431/) +[Website](https://renderatl.com) - [Twitter](https://twitter.com/renderATL) - [Instagram](https://www.instagram.com/renderatl/) - [Facebook](https://www.facebook.com/renderatl/) - [LinkedIn](https://www.linkedin.com/company/renderatl) -### React Summit - Remote Edition 2021 {#react-summit-remote-2021} -April 14-16, 2021, 7am PST / 10am EST / 4pm CEST - remote event +### React Advanced 2021 {#react-advanced-2021} +October 22-23, 2021. In-person in London, UK + remote (hybrid event) -[Website](https://remote.reactsummit.com) - [Twitter](https://twitter.com/reactsummit) - [Facebook](https://www.facebook.com/reactamsterdam) - [Videos](https://youtube.com/c/ReactConferences) +[Website](https://reactadvanced.com) - [Twitter](http://twitter.com/reactadvanced) - [Facebook](https://www.facebook.com/ReactAdvanced) - [Videos](https://youtube.com/c/ReactConferences) + +### React India 2021 {#react-india-2021} +November 12-13, 2021 in Mumbai, India + +[Website](https://www.reactindia.io) - [Twitter](https://twitter.com/react_india) - [Facebook](https://www.facebook.com/ReactJSIndia/) - [LinkedIn](https://www.linkedin.com/showcase/14545585) - [YouTube](https://www.youtube.com/channel/UCaFbHCBkPvVv1bWs_jwYt3w/videos) + +## Past Conferences {#past-conferences} ### React Case Study Festival 2021 {#react-case-study-festival-2021} April 27-28, 2021 - remote event [Website](https://link.geekle.us/react/offsite) - [LinkedIn](https://www.linkedin.com/events/reactcasestudyfestival6721300943411015680/) - [Facebook](https://www.facebook.com/events/255715435820203) -### render(ATL) 2021 {#render-atlanta-2021} -September 13-15, 2021. Atlanta, GA, USA - -[Website](https://renderatl.com) - [Twitter](https://twitter.com/renderATL) - [Instagram](https://www.instagram.com/renderatl/) - [Facebook](https://www.facebook.com/renderatl/) - [LinkedIn](https://www.linkedin.com/company/renderatl) +### React Summit - Remote Edition 2021 {#react-summit-remote-2021} +April 14-16, 2021, 7am PST / 10am EST / 4pm CEST - remote event -### React India 2021 {#react-india-2021} -November 12-13, 2021 in Mumbai, India +[Website](https://remote.reactsummit.com) - [Twitter](https://twitter.com/reactsummit) - [Facebook](https://www.facebook.com/reactamsterdam) - [Videos](https://youtube.com/c/ReactConferences) -[Website](https://www.reactindia.io) - [Twitter](https://twitter.com/react_india) - [Facebook](https://www.facebook.com/ReactJSIndia/) - [LinkedIn](https://www.linkedin.com/showcase/14545585) - [YouTube](https://www.youtube.com/channel/UCaFbHCBkPvVv1bWs_jwYt3w/videos) +### React fwdays’21 {#react-fwdays-2021} +March 27, 2021 - remote event -## Past Conferences {#past-conferences} +[Website](https://fwdays.com/en/event/react-fwdays-2021) - [Twitter](https://twitter.com/fwdays) - [Facebook](https://www.facebook.com/events/1133828147054286) - [LinkedIn](https://www.linkedin.com/events/reactfwdays-21onlineconference6758046347334582273) - [Meetup](https://www.meetup.com/ru-RU/Fwdays/events/275764431/) ### React Next 2020 {#react-next-2020} December 1-2, 2020 - remote event From a5e0bf4d8d2725cea3ceaf8e23e14bc7f80e204d Mon Sep 17 00:00:00 2001 From: "Jabir K.H" Date: Wed, 19 May 2021 14:25:15 +0530 Subject: [PATCH 23/60] grammatical typo fix on allowlist (#3689) --- content/blog/2017-09-08-dom-attributes-in-react-16.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/blog/2017-09-08-dom-attributes-in-react-16.md b/content/blog/2017-09-08-dom-attributes-in-react-16.md index 19483fa79..03172bc00 100644 --- a/content/blog/2017-09-08-dom-attributes-in-react-16.md +++ b/content/blog/2017-09-08-dom-attributes-in-react-16.md @@ -32,7 +32,7 @@ React has always provided a JavaScript-centric API to the DOM. Since React compo
``` -This has not changed. However, the way we enforced it in the past forced us to maintain a allowlist of all valid React DOM attributes in the bundle: +This has not changed. However, the way we enforced it in the past forced us to maintain an allowlist of all valid React DOM attributes in the bundle: ```js // ... From e60bca04f3da690256ce019bd8907c2b368589ee Mon Sep 17 00:00:00 2001 From: Asher Oloo <63627538+miosher@users.noreply.github.com> Date: Fri, 21 May 2021 09:55:32 +0300 Subject: [PATCH 24/60] Fixed a minor typo in a comment (#3685) --- content/docs/testing-recipes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/testing-recipes.md b/content/docs/testing-recipes.md index 1fa4a6969..45669d127 100644 --- a/content/docs/testing-recipes.md +++ b/content/docs/testing-recipes.md @@ -393,7 +393,7 @@ it("changes value when clicked", () => { render(, container); }); - // get ahold of the button element, and trigger some clicks on it + // get a hold of the button element, and trigger some clicks on it const button = document.querySelector("[data-testid=toggle]"); expect(button.innerHTML).toBe("Turn on"); From 91cfb4e72c583f0d2a4905ca0bc3adee636c23e4 Mon Sep 17 00:00:00 2001 From: Dan Abramov Date: Tue, 25 May 2021 14:56:48 +0100 Subject: [PATCH 25/60] Change example to use a
(#3697) --- content/docs/handling-events.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/content/docs/handling-events.md b/content/docs/handling-events.md index bef0178b9..f0b4e6015 100644 --- a/content/docs/handling-events.md +++ b/content/docs/handling-events.md @@ -29,27 +29,27 @@ is slightly different in React: ``` -Another difference is that you cannot return `false` to prevent default behavior in React. You must call `preventDefault` explicitly. For example, with plain HTML, to prevent the default link behavior of opening a new page, you can write: +Another difference is that you cannot return `false` to prevent default behavior in React. You must call `preventDefault` explicitly. For example, with plain HTML, to prevent the default form behavior of submitting, you can write: ```html - - Click me - + + +
``` In React, this could instead be: -```js{2-5,8} -function ActionLink() { - function handleClick(e) { +```js{3} +function Form() { + function handleSubmit(e) { e.preventDefault(); - console.log('The link was clicked.'); + console.log('You clicked submit.'); } return ( - - Click me - +
+ +
); } ``` From f6c2e0690e654c8d9ef8e98efb9ec5923cfa8cbe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 May 2021 20:56:56 +0000 Subject: [PATCH 26/60] Bump browserslist from 4.14.3 to 4.16.6 (#3699) --- yarn.lock | 55 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/yarn.lock b/yarn.lock index 7a646028e..47b33bb97 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3417,14 +3417,15 @@ browserify-zlib@^0.2.0: pako "~1.0.5" browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.12.2, browserslist@^4.8.5: - version "4.14.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.3.tgz#381f9e7f13794b2eb17e1761b4f118e8ae665a53" - integrity sha512-GcZPC5+YqyPO4SFnz48/B0YaCwS47Q9iPChRGi6t7HhflKBcINzFrJvRfC+jp30sRMKxF+d4EHGs27Z0XP1NaQ== + version "4.16.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" + integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== dependencies: - caniuse-lite "^1.0.30001131" - electron-to-chromium "^1.3.570" - escalade "^3.1.0" - node-releases "^1.1.61" + caniuse-lite "^1.0.30001219" + colorette "^1.2.2" + electron-to-chromium "^1.3.723" + escalade "^3.1.1" + node-releases "^1.1.71" buble-jsx-only@^0.19.8: version "0.19.8" @@ -3726,10 +3727,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001131: - version "1.0.30001135" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001135.tgz#995b1eb94404a3c9a0d7600c113c9bb27f2cd8aa" - integrity sha512-ziNcheTGTHlu9g34EVoHQdIu5g4foc8EsxMGC7Xkokmvw0dqNtX8BS8RgCgFBaAiSp2IdjvBxNdh0ssib28eVQ== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001219: + version "1.0.30001230" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz#8135c57459854b2240b57a4a6786044bdc5a9f71" + integrity sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ== case@^1.6.2: version "1.6.3" @@ -4085,10 +4086,10 @@ color@^3.0.0, color@^3.1.2: color-convert "^1.9.1" color-string "^1.5.2" -colorette@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" - integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== +colorette@^1.2.1, colorette@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" + integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== colors@^1.1.2: version "1.4.0" @@ -5335,10 +5336,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.570: - version "1.3.570" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.570.tgz#3f5141cc39b4e3892a276b4889980dabf1d29c7f" - integrity sha512-Y6OCoVQgFQBP5py6A/06+yWxUZHDlNr/gNDGatjH8AZqXl8X0tE4LfjLJsXGz/JmWJz8a6K7bR1k+QzZ+k//fg== +electron-to-chromium@^1.3.723: + version "1.3.739" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.739.tgz#f07756aa92cabd5a6eec6f491525a64fe62f98b9" + integrity sha512-+LPJVRsN7hGZ9EIUUiWCpO7l4E3qBYHNadazlucBfsXBbccDFNKUBAgzE68FnkWGJPwD/AfKhSzL+G+Iqb8A4A== elliptic@^6.5.3: version "6.5.3" @@ -5548,10 +5549,10 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -escalade@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.0.tgz#e8e2d7c7a8b76f6ee64c2181d6b8151441602d4e" - integrity sha512-mAk+hPSO8fLDkhV7V0dXazH5pDc6MrjBTPyD3VeKzxnVFjH1MIxbCdqGZB9O8+EwWakZs3ZCbDS4IpRt79V1ig== +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== escape-goat@^2.0.0: version "2.1.1" @@ -10636,10 +10637,10 @@ node-object-hash@^2.0.0: resolved "https://registry.yarnpkg.com/node-object-hash/-/node-object-hash-2.0.0.tgz#9971fcdb7d254f05016bd9ccf508352bee11116b" integrity sha512-VZR0zroAusy1ETZMZiGeLkdu50LGjG5U1KHZqTruqtTyQ2wfWhHG2Ow4nsUbfTFGlaREgNHcCWoM/OzEm6p+NQ== -node-releases@^1.1.61: - version "1.1.61" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.61.tgz#707b0fca9ce4e11783612ba4a2fcba09047af16e" - integrity sha512-DD5vebQLg8jLCOzwupn954fbIiZht05DAZs0k2u8NStSe6h9XdsuIQL8hSRKYiU8WUQRznmSDrKGbv3ObOmC7g== +node-releases@^1.1.71: + version "1.1.72" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.72.tgz#14802ab6b1039a79a0c7d662b610a5bbd76eacbe" + integrity sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw== noms@0.0.0: version "0.0.0" From ec2d0adcb44d6394f4e6282d8bf52f0e25dbfec3 Mon Sep 17 00:00:00 2001 From: CodeChari Date: Fri, 28 May 2021 11:51:10 +0530 Subject: [PATCH 27/60] Updating name of variable to which returned value of setState is assigned (#3701) in CodePen it is 'prevState' and in the tutorial, it is 'state', which creates confusion. --- content/docs/handling-events.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/docs/handling-events.md b/content/docs/handling-events.md index f0b4e6015..5a746ee61 100644 --- a/content/docs/handling-events.md +++ b/content/docs/handling-events.md @@ -71,8 +71,8 @@ class Toggle extends React.Component { } handleClick() { - this.setState(state => ({ - isToggleOn: !state.isToggleOn + this.setState(prevState => ({ + isToggleOn: !prevState.isToggleOn })); } From 6618bcc7348c3e4a16ede1a53049ac4c3afdd216 Mon Sep 17 00:00:00 2001 From: Andrea Tupini Date: Mon, 31 May 2021 17:53:56 +0200 Subject: [PATCH 28/60] Fix broken link to devtools (#3715) --- content/docs/higher-order-components.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/higher-order-components.md b/content/docs/higher-order-components.md index 07dc90c38..08d4b76cc 100644 --- a/content/docs/higher-order-components.md +++ b/content/docs/higher-order-components.md @@ -297,7 +297,7 @@ The `compose` utility function is provided by many third-party libraries includi ## Convention: Wrap the Display Name for Easy Debugging {#convention-wrap-the-display-name-for-easy-debugging} -The container components created by HOCs show up in the [React Developer Tools](https://github.com/facebook/react-devtools) like any other component. To ease debugging, choose a display name that communicates that it's the result of a HOC. +The container components created by HOCs show up in the [React Developer Tools](https://github.com/facebook/react/tree/master/packages/react-devtools) like any other component. To ease debugging, choose a display name that communicates that it's the result of a HOC. The most common technique is to wrap the display name of the wrapped component. So if your higher-order component is named `withSubscription`, and the wrapped component's display name is `CommentList`, use the display name `WithSubscription(CommentList)`: From ff68780a27f96b0e488437832aa56f88e8349667 Mon Sep 17 00:00:00 2001 From: tfrank11 <77943795+tfrank11@users.noreply.github.com> Date: Mon, 31 May 2021 14:26:53 -0400 Subject: [PATCH 29/60] Fixed typo inside concurrent-mode-reference.md (#3716) --- content/docs/concurrent-mode-reference.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/concurrent-mode-reference.md b/content/docs/concurrent-mode-reference.md index e36bb0532..a40ad1b44 100644 --- a/content/docs/concurrent-mode-reference.md +++ b/content/docs/concurrent-mode-reference.md @@ -59,7 +59,7 @@ For more information on Concurrent Mode, check out the [Concurrent Mode document `Suspense` lets your components "wait" for something before they can render, showing a fallback while waiting. -In this example, `ProfileDetails` is waiting for an asynchronous API call to fetch some data. While we wait for `ProfileDetails` and `ProfilePhoto`, we will show the `Loading...` fallback instead. It is important to note that until all children inside `` has loaded, we will continue to show the fallback. +In this example, `ProfileDetails` is waiting for an asynchronous API call to fetch some data. While we wait for `ProfileDetails` and `ProfilePhoto`, we will show the `Loading...` fallback instead. It is important to note that until all children inside `` have loaded, we will continue to show the fallback. `Suspense` takes two props: * **fallback** takes a loading indicator. The fallback is shown until all of the children of the `Suspense` component have finished rendering. From 68e4efcf93b6e589355f6aa3cbc3f3c811c0ad37 Mon Sep 17 00:00:00 2001 From: Luke Ingalls <45518011+lukeingalls@users.noreply.github.com> Date: Mon, 7 Jun 2021 04:18:45 -0600 Subject: [PATCH 30/60] Added missing comma and removed a few redundant words (#3725) --- content/docs/forms.md | 2 +- content/docs/hello-world.md | 2 +- content/docs/lists-and-keys.md | 2 +- content/docs/thinking-in-react.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/content/docs/forms.md b/content/docs/forms.md index 82a0ab99b..19ff42fe6 100644 --- a/content/docs/forms.md +++ b/content/docs/forms.md @@ -9,7 +9,7 @@ redirect_from: - "docs/forms-zh-CN.html" --- -HTML form elements work a little bit differently from other DOM elements in React, because form elements naturally keep some internal state. For example, this form in plain HTML accepts a single name: +HTML form elements work a bit differently from other DOM elements in React, because form elements naturally keep some internal state. For example, this form in plain HTML accepts a single name: ```html
diff --git a/content/docs/hello-world.md b/content/docs/hello-world.md index 2fff80254..d72454f0b 100644 --- a/content/docs/hello-world.md +++ b/content/docs/hello-world.md @@ -40,7 +40,7 @@ React is a JavaScript library, and so we'll assume you have a basic understandin >Note > ->This guide occasionally uses some of the newer JavaScript syntax in the examples. If you haven't worked with JavaScript in the last few years, [these three points](https://gist.github.com/gaearon/683e676101005de0add59e8bb345340c) should get you most of the way. +>This guide occasionally uses some newer JavaScript syntax in the examples. If you haven't worked with JavaScript in the last few years, [these three points](https://gist.github.com/gaearon/683e676101005de0add59e8bb345340c) should get you most of the way. ## Let's Get Started! {#lets-get-started} diff --git a/content/docs/lists-and-keys.md b/content/docs/lists-and-keys.md index 65f52af19..5bba3dcc8 100644 --- a/content/docs/lists-and-keys.md +++ b/content/docs/lists-and-keys.md @@ -207,7 +207,7 @@ A good rule of thumb is that elements inside the `map()` call need keys. ### Keys Must Only Be Unique Among Siblings {#keys-must-only-be-unique-among-siblings} -Keys used within arrays should be unique among their siblings. However they don't need to be globally unique. We can use the same keys when we produce two different arrays: +Keys used within arrays should be unique among their siblings. However, they don't need to be globally unique. We can use the same keys when we produce two different arrays: ```js{2,5,11,12,19,21} function Blog(props) { diff --git a/content/docs/thinking-in-react.md b/content/docs/thinking-in-react.md index 6e5e7ed94..886187c3d 100644 --- a/content/docs/thinking-in-react.md +++ b/content/docs/thinking-in-react.md @@ -84,7 +84,7 @@ To make your UI interactive, you need to be able to trigger changes to your unde To build your app correctly, you first need to think of the minimal set of mutable state that your app needs. The key here is [DRY: *Don't Repeat Yourself*](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself). Figure out the absolute minimal representation of the state your application needs and compute everything else you need on-demand. For example, if you're building a TODO list, keep an array of the TODO items around; don't keep a separate state variable for the count. Instead, when you want to render the TODO count, take the length of the TODO items array. -Think of all of the pieces of data in our example application. We have: +Think of all the pieces of data in our example application. We have: * The original list of products * The search text the user has entered From 6e6500e7668255c34e44f27b6cb74f367dbf8074 Mon Sep 17 00:00:00 2001 From: Gift Egwuenu Date: Tue, 8 Jun 2021 11:04:17 +0200 Subject: [PATCH 31/60] Add React Conference Live 2021 (#3718) * Add React Conference Live 2021 * Update conferences.md Co-authored-by: Alexey Pyltsyn --- content/community/conferences.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/content/community/conferences.md b/content/community/conferences.md index 27fc9c0b6..22beffe00 100644 --- a/content/community/conferences.md +++ b/content/community/conferences.md @@ -17,10 +17,15 @@ September 13-15, 2021. Atlanta, GA, USA [Website](https://renderatl.com) - [Twitter](https://twitter.com/renderATL) - [Instagram](https://www.instagram.com/renderatl/) - [Facebook](https://www.facebook.com/renderatl/) - [LinkedIn](https://www.linkedin.com/company/renderatl) +### React Conference Live 2021 {#react-conference-live-2021} +October 7-8, 2021. In-person in Amsterdam, Netherlands + remote (hybrid event) + +[Website](https://www.reactlive.nl/) - [Twitter](https://twitter.com/reactlivenl) - [LinkedIn](https://www.linkedin.com/company/frontendlove/) + ### React Advanced 2021 {#react-advanced-2021} October 22-23, 2021. In-person in London, UK + remote (hybrid event) -[Website](https://reactadvanced.com) - [Twitter](http://twitter.com/reactadvanced) - [Facebook](https://www.facebook.com/ReactAdvanced) - [Videos](https://youtube.com/c/ReactConferences) +[Website](https://reactadvanced.com) - [Twitter](https://twitter.com/reactadvanced) - [Facebook](https://www.facebook.com/ReactAdvanced) - [Videos](https://youtube.com/c/ReactConferences) ### React India 2021 {#react-india-2021} November 12-13, 2021 in Mumbai, India From 7b0aecbe6d6537bfcc37d5ae6dc036a945f97728 Mon Sep 17 00:00:00 2001 From: Andrew Clark Date: Tue, 8 Jun 2021 13:25:54 -0400 Subject: [PATCH 32/60] New post: The Plan for React 18 (#3729) * New post: The Plan for React 18 * Mark CM docs as stale * Update content/blog/2021-06-08-the-plan-for-react-18.md Co-authored-by: Ricky * Simplify Co-authored-by: Dan Abramov Co-authored-by: Dan Abramov Co-authored-by: Ricky --- content/authors.yml | 9 +++ .../blog/2021-06-08-the-plan-for-react-18.md | 59 +++++++++++++++++++ content/docs/concurrent-mode-adoption.md | 9 ++- content/docs/concurrent-mode-intro.md | 7 ++- content/docs/concurrent-mode-patterns.md | 7 ++- content/docs/concurrent-mode-reference.md | 7 ++- content/docs/concurrent-mode-suspense.md | 7 ++- content/docs/nav.yml | 13 ---- src/components/MarkdownPage/MarkdownPage.js | 2 +- 9 files changed, 93 insertions(+), 27 deletions(-) create mode 100644 content/blog/2021-06-08-the-plan-for-react-18.md diff --git a/content/authors.yml b/content/authors.yml index b5e14fb25..af35c620a 100644 --- a/content/authors.yml +++ b/content/authors.yml @@ -1,6 +1,9 @@ # Map of short name to more information. `name` will be used but if you don't # want to use your real name, just use whatever. If url is included, your name # will be a link to the provided url. +abernathyca: + name: Christine Abernathy + url: https://twitter.com/abernathyca acdlite: name: Andrew Clark url: https://twitter.com/acdlite @@ -70,12 +73,18 @@ petehunt: rachelnabors: name: Rachel Nabors url: https://twitter.com/rachelnabors +rickhanlonii: + name: Rick Hanlon + url: https://twitter.com/rickhanlonii schrockn: name: Nick Schrock url: https://twitter.com/schrockn sebmarkbage: name: Sebastian Markbåge url: https://twitter.com/sebmarkbage +sethwebster: + name: Seth Webster + url: https://twitter.com/sethwebster sophiebits: name: Sophie Alpert url: https://sophiebits.com/ diff --git a/content/blog/2021-06-08-the-plan-for-react-18.md b/content/blog/2021-06-08-the-plan-for-react-18.md new file mode 100644 index 000000000..c4ae6a76e --- /dev/null +++ b/content/blog/2021-06-08-the-plan-for-react-18.md @@ -0,0 +1,59 @@ +--- +title: "The Plan for React 18" +author: [acdlite, bvaughn, abernathyca, gaearon, rachelnabors, rickhanlonii, sebmarkbage, sethwebster] +--- + +The React team is excited to share a few updates: + +1. We’ve started work on the React 18 release, which will be our next major version. +2. We’ve created a Working Group to prepare the community for gradual adoption of new features in React 18. +3. We’ve published a React 18 Alpha so that library authors can try it and provide feedback. + +These updates are primarily aimed at maintainers of third-party libraries. If you’re learning, teaching, or using React to build user-facing applications, you can safely ignore this post. But you are welcome to follow the discussions in the React 18 Working Group if you're curious! + +## What’s coming in React 18 + +When it’s released, React 18 will include out-of-the-box improvements (like [automatic batching](https://github.com/reactwg/react-18/discussions/21)), new APIs (like [`startTransition`](https://github.com/reactwg/react-18/discussions/41)), and a [new streaming server renderer](https://github.com/reactwg/react-18/discussions/37) with built-in support for `React.lazy`. + +These features are possible thanks to a new opt-in mechanism we’re adding in React 18. It’s called “concurrent rendering” and it lets React prepare multiple versions of the UI at the same time. This change is mostly behind-the-scenes, but it unlocks new possibilities to improve both real and perceived performance of your app. + +If you've been following our research into the future of React (we don't expect you to!), you might have previously heard of something called “concurrent mode” or that it might break your app. In response to this feedback from the community, we’ve redesigned the upgrade strategy for gradual adoption. Instead of an all-or-nothing “mode”, concurrent rendering will only be enabled for updates triggered by one of the new features. In practice, this means that **you will be able to adopt React 18 without rewrites and try the new features at your own pace.** + +## A gradual adoption strategy + +Since concurrency in React 18 is opt-in, there are no significant out-of-the-box breaking changes to component behavior. **You can upgrade to React 18 with minimal or no changes to your application code, with a level of effort comparable to a typical major React release**. Based on our experience converting several apps to React 18, we expect that many users will be able to upgrade within a single afternoon. + +We successfully shipped concurrent features to tens of thousands of components at Facebook, and in our experience, we've found that most React components “just work” without additional changes. We're committed to making sure this is a smooth upgrade for the entire community, so today we're announcing the React 18 Working Group. + +## Working with the community + +We’re trying something new for this release: We've invited a panel of experts, developers, library authors, and educators from across the React community to participate in our [React 18 Working Group](https://github.com/reactwg/react-18) to provide feedback, ask questions, and collaborate on the release. We couldn't invite everyone we wanted to this initial, small group, but if this experiment works out, we hope there will be more in the future! + +**The goal of the React 18 Working Group is to prepare the ecosystem for a smooth, gradual adoption of React 18 by existing applications and libraries.** The Working Group is hosted on [GitHub Discussions](https://github.com/reactwg/react-18/discussions) and is available for the public to read. Members of the working group can leave feedback, ask questions, and share ideas. 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 blog. + +For more information on upgrading to React 18, or additional resources about the release, see the [React 18 announcement post](https://github.com/reactwg/react-18/discussions/4). + +## Accessing the React 18 Working Group + +Everyone can read the discussions in the [React 18 Working Group repo](https://github.com/reactwg/react-18). + +Because we expect an initial surge of interest in the Working Group, only invited members will be allowed to create or comment on threads. However, the threads are fully visible to the public, so everyone has access to the same information. We believe this is a good compromise between creating a productive environment for working group members, while maintaining transparency with the wider community. + +As always, you can submit bug reports, questions, and general feedback to our [issue tracker](https://github.com/facebook/react/issues). + +## How to try React 18 Alpha today + +New alphas are [regularly published to npm using the `@alpha` tag](https://github.com/reactwg/react-18/discussions/9). These releases are built using the most recent commit to our main repo. When a feature or bugfix is merged, it will appear in an alpha the following weekday. + +There may be significant behavioral or API changes between alpha releases. Please remember that **alpha releases are not recommended for user-facing, production applications**. + +## Projected React 18 release timeline + +We don't have a specific release date scheduled, but we expect it will take several months of feedback and iteration before React 18 is ready for most production applications. + +* Library Alpha: Available today +* Public Beta: At least several months +* Release Candidate (RC): At least several weeks after Beta +* General Availability: At least several weeks after RC + +More details about our projected release timeline are [available in the Working Group](https://github.com/reactwg/react-18/discussions/9). We'll post updates on this blog when we're closer to a public release. diff --git a/content/docs/concurrent-mode-adoption.md b/content/docs/concurrent-mode-adoption.md index f5b8d9db1..54806d60b 100644 --- a/content/docs/concurrent-mode-adoption.md +++ b/content/docs/concurrent-mode-adoption.md @@ -17,13 +17,12 @@ next: concurrent-mode-reference.html >Caution: > ->This page describes **experimental features that are not yet available in a stable release**. Don't rely on experimental builds of React in production apps. These features may change significantly and without a warning before they become a part of React. +>This page was about experimental features that aren't yet available in a stable release. It was aimed at early adopters and people who are curious. > ->This documentation is aimed at early adopters and people who are curious. **If you're new to React, don't worry about these features** -- you don't need to learn them right now. - ->Caution: +>Much of the information on this page is now outdated and exists only for archival purposes. **Please refer to the [React 18 Alpha announcement post](/blog/2021/06/08/the-plan-for-react-18.html +) for the up-to-date information.** > ->All references below to "blocking mode" and `createBlockingRoot` are outdated and should be ignored. +>Before React 18 is released, we will replace this page with stable documentation.
diff --git a/content/docs/concurrent-mode-intro.md b/content/docs/concurrent-mode-intro.md index b2980ce3d..90b050c5c 100644 --- a/content/docs/concurrent-mode-intro.md +++ b/content/docs/concurrent-mode-intro.md @@ -16,9 +16,12 @@ next: concurrent-mode-suspense.html >Caution: > ->This page describes **experimental features that are [not yet available](/docs/concurrent-mode-adoption.html) in a stable release**. Don't rely on experimental builds of React in production apps. These features may change significantly and without a warning before they become a part of React. +>This page was about experimental features that aren't yet available in a stable release. It was aimed at early adopters and people who are curious. > ->This documentation is aimed at early adopters and people who are curious. **If you're new to React, don't worry about these features** -- you don't need to learn them right now. +>Much of the information on this page is now outdated and exists only for archival purposes. **Please refer to the [React 18 Alpha announcement post](/blog/2021/06/08/the-plan-for-react-18.html +) for the up-to-date information.** +> +>Before React 18 is released, we will replace this page with stable documentation. diff --git a/content/docs/concurrent-mode-patterns.md b/content/docs/concurrent-mode-patterns.md index f38fe595f..ac5e29173 100644 --- a/content/docs/concurrent-mode-patterns.md +++ b/content/docs/concurrent-mode-patterns.md @@ -17,9 +17,12 @@ next: concurrent-mode-adoption.html >Caution: > ->This page describes **experimental features that are [not yet available](/docs/concurrent-mode-adoption.html) in a stable release**. Don't rely on experimental builds of React in production apps. These features may change significantly and without a warning before they become a part of React. +>This page was about experimental features that aren't yet available in a stable release. It was aimed at early adopters and people who are curious. > ->This documentation is aimed at early adopters and people who are curious. **If you're new to React, don't worry about these features** -- you don't need to learn them right now. For example, if you're looking for a data fetching tutorial that works today, read [this article](https://www.robinwieruch.de/react-hooks-fetch-data/) instead. +>Much of the information on this page is now outdated and exists only for archival purposes. **Please refer to the [React 18 Alpha announcement post](/blog/2021/06/08/the-plan-for-react-18.html +) for the up-to-date information.** +> +>Before React 18 is released, we will replace this page with stable documentation. diff --git a/content/docs/concurrent-mode-reference.md b/content/docs/concurrent-mode-reference.md index a40ad1b44..09fb109f7 100644 --- a/content/docs/concurrent-mode-reference.md +++ b/content/docs/concurrent-mode-reference.md @@ -16,9 +16,12 @@ prev: concurrent-mode-adoption.html >Caution: > ->This page describes **experimental features that are [not yet available](/docs/concurrent-mode-adoption.html) in a stable release**. Don't rely on experimental builds of React in production apps. These features may change significantly and without a warning before they become a part of React. +>This page was about experimental features that aren't yet available in a stable release. It was aimed at early adopters and people who are curious. > ->This documentation is aimed at early adopters and people who are curious. **If you're new to React, don't worry about these features** -- you don't need to learn them right now. +>Much of the information on this page is now outdated and exists only for archival purposes. **Please refer to the [React 18 Alpha announcement post](/blog/2021/06/08/the-plan-for-react-18.html +) for the up-to-date information.** +> +>Before React 18 is released, we will replace this page with stable documentation. diff --git a/content/docs/concurrent-mode-suspense.md b/content/docs/concurrent-mode-suspense.md index 12ad112b2..4e1e8c538 100644 --- a/content/docs/concurrent-mode-suspense.md +++ b/content/docs/concurrent-mode-suspense.md @@ -17,9 +17,12 @@ next: concurrent-mode-patterns.html >Caution: > ->This page describes **experimental features that are [not yet available](/docs/concurrent-mode-adoption.html) in a stable release**. Don't rely on experimental builds of React in production apps. These features may change significantly and without a warning before they become a part of React. +>This page was about experimental features that aren't yet available in a stable release. It was aimed at early adopters and people who are curious. > ->This documentation is aimed at early adopters and people who are curious. **If you're new to React, don't worry about these features** -- you don't need to learn them right now. For example, if you're looking for a data fetching tutorial that works today, read [this article](https://www.robinwieruch.de/react-hooks-fetch-data/) instead. +>Much of the information on this page is now outdated and exists only for archival purposes. **Please refer to the [React 18 Alpha announcement post](/blog/2021/06/08/the-plan-for-react-18.html +) for the up-to-date information.** +> +>Before React 18 is released, we will replace this page with stable documentation. diff --git a/content/docs/nav.yml b/content/docs/nav.yml index 09f73ca6a..dbedc5f5f 100644 --- a/content/docs/nav.yml +++ b/content/docs/nav.yml @@ -133,19 +133,6 @@ title: Testing Recipes - id: testing-environments title: Testing Environments -- title: Concurrent Mode (Experimental) - isOrdered: true - items: - - id: concurrent-mode-intro - title: Introducing Concurrent Mode - - id: concurrent-mode-suspense - title: Suspense for Data Fetching - - id: concurrent-mode-patterns - title: Concurrent UI Patterns - - id: concurrent-mode-adoption - title: Adopting Concurrent Mode - - id: concurrent-mode-reference - title: Concurrent Mode API Reference - title: Contributing items: - id: how-to-contribute diff --git a/src/components/MarkdownPage/MarkdownPage.js b/src/components/MarkdownPage/MarkdownPage.js index ab1f3af3a..0965f360e 100644 --- a/src/components/MarkdownPage/MarkdownPage.js +++ b/src/components/MarkdownPage/MarkdownPage.js @@ -97,7 +97,7 @@ const MarkdownPage = ({
{date}{' '} {hasAuthors && ( - + by{' '} {toCommaSeparatedList(authors, author => ( Date: Tue, 8 Jun 2021 18:53:54 +0100 Subject: [PATCH 33/60] Fix hanging word --- content/blog/2021-06-08-the-plan-for-react-18.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/blog/2021-06-08-the-plan-for-react-18.md b/content/blog/2021-06-08-the-plan-for-react-18.md index c4ae6a76e..00eff4743 100644 --- a/content/blog/2021-06-08-the-plan-for-react-18.md +++ b/content/blog/2021-06-08-the-plan-for-react-18.md @@ -17,7 +17,7 @@ When it’s released, React 18 will include out-of-the-box improvements (like [a These features are possible thanks to a new opt-in mechanism we’re adding in React 18. It’s called “concurrent rendering” and it lets React prepare multiple versions of the UI at the same time. This change is mostly behind-the-scenes, but it unlocks new possibilities to improve both real and perceived performance of your app. -If you've been following our research into the future of React (we don't expect you to!), you might have previously heard of something called “concurrent mode” or that it might break your app. In response to this feedback from the community, we’ve redesigned the upgrade strategy for gradual adoption. Instead of an all-or-nothing “mode”, concurrent rendering will only be enabled for updates triggered by one of the new features. In practice, this means that **you will be able to adopt React 18 without rewrites and try the new features at your own pace.** +If you've been following our research into the future of React (we don't expect you to!), you might have heard of something called “concurrent mode” or that it might break your app. In response to this feedback from the community, we’ve redesigned the upgrade strategy for gradual adoption. Instead of an all-or-nothing “mode”, concurrent rendering will only be enabled for updates triggered by one of the new features. In practice, this means **you will be able to adopt React 18 without rewrites and try the new features at your own pace.** ## A gradual adoption strategy From 589c0338c59bf08bceb26bd00d28ec7225d1215f Mon Sep 17 00:00:00 2001 From: Andrew Clark Date: Wed, 9 Jun 2021 16:16:53 -0400 Subject: [PATCH 34/60] Add /link/switch-to-createroot (#3730) Redirects to the working group document that explains how to upgrade from ReactDOM.render to ReactDOM.createRoot. https://github.com/reactwg/react-18/discussions/5 --- static/_redirects | 1 + 1 file changed, 1 insertion(+) diff --git a/static/_redirects b/static/_redirects index 992353033..f3f7146bd 100644 --- a/static/_redirects +++ b/static/_redirects @@ -41,3 +41,4 @@ https://en.reactjs.org/* https://reactjs.org/:splat 301! /link/uselayouteffect-ssr https://gist.github.com/gaearon/e7d97cdf38a2907924ea12e4ebdf3c85 301 /link/react-devtools-faq https://github.com/facebook/react/tree/master/packages/react-devtools#faq 301 /link/setstate-in-render https://github.com/facebook/react/issues/18178#issuecomment-595846312 301 +/link/switch-to-createroot https://github.com/reactwg/react-18/discussions/5 From bb3702da72cb2f2732143a04ab490ea26600c9d3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 13 Jun 2021 19:48:40 +0000 Subject: [PATCH 35/60] Bump dns-packet from 1.3.1 to 1.3.4 (#3700) --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 47b33bb97..a70e45f50 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5121,9 +5121,9 @@ dns-equal@^1.0.0: integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= dns-packet@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a" - integrity sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg== + version "1.3.4" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" + integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA== dependencies: ip "^1.1.0" safe-buffer "^5.0.1" From f3baa6d075c8de475b688abf035d7054bc8a9606 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 13 Jun 2021 20:02:22 +0000 Subject: [PATCH 36/60] Bump ws from 5.2.2 to 5.2.3 (#3735) --- yarn.lock | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/yarn.lock b/yarn.lock index a70e45f50..11e1b5087 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15921,9 +15921,9 @@ write@^0.2.1: mkdirp "^0.5.1" ws@^5.2.0: - version "5.2.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" - integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== + version "5.2.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.3.tgz#05541053414921bc29c63bee14b8b0dd50b07b3d" + integrity sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA== dependencies: async-limiter "~1.0.0" @@ -15934,10 +15934,10 @@ ws@^6.2.1: dependencies: async-limiter "~1.0.0" -ws@^7.3.0: - version "7.3.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.1.tgz#d0547bf67f7ce4f12a72dfe31262c68d7dc551c8" - integrity sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA== +ws@^7.3.0, ws@~7.4.2: + version "7.4.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.2.tgz#782100048e54eb36fe9843363ab1c68672b261dd" + integrity sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA== ws@~6.1.0: version "6.1.4" @@ -15946,11 +15946,6 @@ ws@~6.1.0: dependencies: async-limiter "~1.0.0" -ws@~7.4.2: - version "7.4.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.2.tgz#782100048e54eb36fe9843363ab1c68672b261dd" - integrity sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA== - x-is-string@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/x-is-string/-/x-is-string-0.1.0.tgz#474b50865af3a49a9c4657f05acd145458f77d82" From 07e58b4b5f475365907ac564533a42b2de37b260 Mon Sep 17 00:00:00 2001 From: Sam Chillcott <59138876+samchillcott@users.noreply.github.com> Date: Tue, 22 Jun 2021 10:30:11 +0100 Subject: [PATCH 37/60] Fix typo in optimizing-performance (#3746) Remove spelling error from "recommended" to "recommend". --- content/docs/optimizing-performance.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/optimizing-performance.md b/content/docs/optimizing-performance.md index a78a7904a..bec1215de 100644 --- a/content/docs/optimizing-performance.md +++ b/content/docs/optimizing-performance.md @@ -180,7 +180,7 @@ If you haven't yet installed the React DevTools, you can find them here: ## Virtualize Long Lists {#virtualize-long-lists} -If your application renders long lists of data (hundreds or thousands of rows), we recommended using a technique known as "windowing". This technique only renders a small subset of your rows at any given time, and can dramatically reduce the time it takes to re-render the components as well as the number of DOM nodes created. +If your application renders long lists of data (hundreds or thousands of rows), we recommend using a technique known as "windowing". This technique only renders a small subset of your rows at any given time, and can dramatically reduce the time it takes to re-render the components as well as the number of DOM nodes created. [react-window](https://react-window.now.sh/) and [react-virtualized](https://bvaughn.github.io/react-virtualized/) are popular windowing libraries. They provide several reusable components for displaying lists, grids, and tabular data. You can also create your own windowing component, like [Twitter did](https://medium.com/@paularmstrong/twitter-lite-and-high-performance-react-progressive-web-apps-at-scale-d28a00e780a3), if you want something more tailored to your application's specific use case. From d47476312d9967ec1a2ff9bef7b495767a7247d4 Mon Sep 17 00:00:00 2001 From: Brian Vaughn Date: Wed, 23 Jun 2021 14:44:37 -0400 Subject: [PATCH 38/60] Updated next/experimental release version docs (#3748) To account for changes made in PR facebook/react/pull/21700 --- content/docs/release-channels.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/docs/release-channels.md b/content/docs/release-channels.md index 910649943..abce4934c 100644 --- a/content/docs/release-channels.md +++ b/content/docs/release-channels.md @@ -18,7 +18,7 @@ Each of React's release channels is designed for a distinct use case: - [**Next**](#next-channel) tracks the master branch of the React source code repository. Think of these as release candidates for the next minor semver release. Use this for integration testing between React and third party projects. - [**Experimental**](#experimental-channel) includes experimental APIs and features that aren't available in the stable releases. These also track the master branch, but with additional feature flags turned on. Use this to try out upcoming features before they are released. -All releases are published to npm, but only Latest uses [semantic versioning](/docs/faq-versioning.html). Prereleases (those in the Next and Experimental channels) have versions generated from a hash of their contents, e.g. `0.0.0-1022ee0ec` for Next and `0.0.0-experimental-1022ee0ec` for Experimental. +All releases are published to npm, but only Latest uses [semantic versioning](/docs/faq-versioning.html). Prereleases (those in the Next and Experimental channels) have versions generated from a hash of their contents and the commit date, e.g. `0.0.0-68053d940-20210623` for Next and `0.0.0-experimental-68053d940-20210623` for Experimental. **The only officially supported release channel for user-facing applications is Latest**. Next and Experimental releases are provided for testing purposes only, and we provide no guarantees that behavior won't change between releases. They do not follow the semver protocol that we use for releases from Latest. @@ -40,7 +40,7 @@ The degree of change between the most recent Next release and the most recent La **Do not use prereleases in user-facing applications.** -Releases in Next are published with the `next` tag on npm. Versions are generated from a hash of the build's contents, e.g. `0.0.0-1022ee0ec`. +Releases in Next are published with the `next` tag on npm. Versions are generated from a hash of the build's contents and the commit date, e.g. `0.0.0-68053d940-20210623`. #### Using the Next Channel for Integration Testing {#using-the-next-channel-for-integration-testing} @@ -76,7 +76,7 @@ Usually, an update to Next is accompanied by a corresponding update to Experimen Experimental releases may be significantly different than releases to Next and Latest. **Do not use Experimental releases in user-facing applications.** You should expect frequent breaking changes between releases in the Experimental channel. -Releases in Experimental are published with the `experimental` tag on npm. Versions are generated from a hash of the build's contents, e.g. `0.0.0-experimental-1022ee0ec`. +Releases in Experimental are published with the `experimental` tag on npm. Versions are generated from a hash of the build's contents and the commit date, e.g. `0.0.0-experimental-68053d940-20210623`. #### What Goes Into an Experimental Release? {#what-goes-into-an-experimental-release} From 25f756d8e3800afb032cb31ce3626d6134e31e38 Mon Sep 17 00:00:00 2001 From: Alexey Pyltsyn Date: Sat, 26 Jun 2021 22:21:08 +0300 Subject: [PATCH 39/60] Update outdated link on Static Type Checking page --- content/docs/static-type-checking.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/docs/static-type-checking.md b/content/docs/static-type-checking.md index c95820240..79be464b6 100644 --- a/content/docs/static-type-checking.md +++ b/content/docs/static-type-checking.md @@ -312,8 +312,8 @@ declare module 'querystring' { You are now ready to code! We recommend to check out the following resources to learn more about TypeScript: -* [TypeScript Documentation: Basic Types](https://www.typescriptlang.org/docs/handbook/basic-types.html) -* [TypeScript Documentation: Migrating from Javascript](https://www.typescriptlang.org/docs/handbook/migrating-from-javascript.html) +* [TypeScript Documentation: Everyday Types](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html) +* [TypeScript Documentation: Migrating from JavaScript](https://www.typescriptlang.org/docs/handbook/migrating-from-javascript.html) * [TypeScript Documentation: React and Webpack](https://www.typescriptlang.org/docs/handbook/react-&-webpack.html) ## Reason {#reason} From d456dfbd29e9c49a4d997a95b34fa90488befa78 Mon Sep 17 00:00:00 2001 From: Brian Vaughn Date: Tue, 29 Jun 2021 13:35:55 -0400 Subject: [PATCH 40/60] Update docs and config to replace "master" with "main" branch https://github.com/facebook/react/issues/21767 --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- README.md | 8 ++-- .../blog/2013-07-03-community-roundup-4.md | 2 +- .../blog/2013-08-05-community-roundup-6.md | 2 +- ...se-react-and-jsx-in-python-applications.md | 2 +- .../blog/2013-08-26-community-roundup-7.md | 4 +- content/blog/2013-10-16-react-v0.5.0.md | 2 +- .../blog/2013-11-06-community-roundup-10.md | 2 +- .../blog/2014-02-05-community-roundup-15.md | 2 +- content/blog/2014-02-16-react-v0.9-rc1.md | 2 +- content/blog/2014-02-20-react-v0.9.md | 2 +- content/blog/2014-04-04-reactnet.md | 2 +- content/blog/2014-05-06-flux.md | 2 +- .../blog/2014-06-27-community-roundup-19.md | 2 +- ...4-07-30-flux-actions-and-the-dispatcher.md | 4 +- .../2014-09-24-testing-flux-applications.md | 6 +-- content/blog/2014-10-28-react-v0.12.md | 2 +- content/blog/2015-09-10-react-v0.14-rc1.md | 4 +- content/blog/2015-10-07-react-v0.14.md | 6 +-- ...11-introducing-reacts-error-code-system.md | 2 +- content/blog/2016-11-16-react-v15.4.0.md | 2 +- ...017-05-18-whats-new-in-create-react-app.md | 2 +- .../2017-09-08-dom-attributes-in-react-16.md | 2 +- ...17-11-28-react-v16.2.0-fragment-support.md | 2 +- ...12-07-introducing-the-react-rfc-process.md | 2 +- ...improving-the-repository-infrastructure.md | 2 +- .../2018-03-27-update-on-async-rendering.md | 2 +- .../blog/2018-10-01-create-react-app-v2.md | 8 ++-- content/blog/2018-11-27-react-16-roadmap.md | 4 +- .../2019-02-23-is-react-translated-yet.md | 8 ++-- content/blog/2019-08-15-new-react-devtools.md | 2 +- ...ences-with-concurrent-mode-and-suspense.md | 2 +- content/blog/2020-08-10-react-v17-rc.md | 2 +- ...09-22-introducing-the-new-jsx-transform.md | 2 +- content/community/support.md | 2 +- content/docs/add-react-to-a-website.md | 2 +- content/docs/codebase-overview.md | 22 +++++----- content/docs/concurrent-mode-intro.md | 4 +- content/docs/design-principles.md | 4 +- content/docs/faq-state.md | 2 +- content/docs/getting-started.md | 4 +- content/docs/higher-order-components.md | 2 +- content/docs/hooks-faq.md | 2 +- content/docs/how-to-contribute.md | 16 +++---- content/docs/lifting-state-up.md | 2 +- content/docs/release-channels.md | 10 ++--- content/docs/static-type-checking.md | 2 +- content/docs/web-components.md | 2 +- content/versions.yml | 44 +++++++++---------- .../gatsby-node.js | 2 +- .../create-redirects.js | 2 +- src/components/LayoutFooter/Footer.js | 2 +- src/components/MarkdownPage/MarkdownPage.js | 2 +- static/_redirects | 2 +- vercel.json | 2 +- 55 files changed, 117 insertions(+), 117 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 66be15553..e34dda4af 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -4,7 +4,7 @@ Thank you for the PR! Contributors like you keep React awesome! Please see the Contribution Guide for guidelines: -https://github.com/reactjs/reactjs.org/blob/master/CONTRIBUTING.md +https://github.com/reactjs/reactjs.org/blob/main/CONTRIBUTING.md If your PR references an existing issue, please add the issue number below diff --git a/README.md b/README.md index 5d6618963..0215878dc 100644 --- a/README.md +++ b/README.md @@ -26,12 +26,12 @@ This repo contains the source code and documentation powering [reactjs.org](http ### Guidelines -The documentation is divided into several sections with a different tone and purpose. If you plan to write more than a few sentences, you might find it helpful to get familiar with the [contributing guidelines](https://github.com/reactjs/reactjs.org/blob/master/CONTRIBUTING.md#guidelines-for-text) for the appropriate sections. +The documentation is divided into several sections with a different tone and purpose. If you plan to write more than a few sentences, you might find it helpful to get familiar with the [contributing guidelines](https://github.com/reactjs/reactjs.org/blob/main/CONTRIBUTING.md#guidelines-for-text) for the appropriate sections. ### Create a branch -1. `git checkout master` from any folder in your local `reactjs.org` repository -1. `git pull origin master` to ensure you have the latest main code +1. `git checkout main` from any folder in your local `reactjs.org` repository +1. `git pull origin main` to ensure you have the latest main code 1. `git checkout -b the-name-of-my-branch` (replacing `the-name-of-my-branch` with a suitable name) to create a branch ### Make the change @@ -67,4 +67,4 @@ If your language does not have a translation and you would like to create one, p - `yarn reset` to clear the local cache ## License -Content submitted to [reactjs.org](https://reactjs.org/) is CC-BY-4.0 licensed, as found in the [LICENSE-DOCS.md](https://github.com/open-source-explorer/reactjs.org/blob/master/LICENSE-DOCS.md) file. +Content submitted to [reactjs.org](https://reactjs.org/) is CC-BY-4.0 licensed, as found in the [LICENSE-DOCS.md](https://github.com/open-source-explorer/reactjs.org/blob/main/LICENSE-DOCS.md) file. diff --git a/content/blog/2013-07-03-community-roundup-4.md b/content/blog/2013-07-03-community-roundup-4.md index b7bd158c2..957df86a1 100644 --- a/content/blog/2013-07-03-community-roundup-4.md +++ b/content/blog/2013-07-03-community-roundup-4.md @@ -54,5 +54,5 @@ Over the past several weeks, members of our team, [Pete Hunt](http://www.petehun [Tom Occhino](http://tomocchino.com/) implemented Snake in 150 lines with React. -> [Check the source on GitHub](https://github.com/tomocchino/react-snake/blob/master/src/snake.js) +> [Check the source on GitHub](https://github.com/tomocchino/react-snake/blob/main/src/snake.js) >
diff --git a/content/blog/2013-08-05-community-roundup-6.md b/content/blog/2013-08-05-community-roundup-6.md index 22db39d88..3d0984b7a 100644 --- a/content/blog/2013-08-05-community-roundup-6.md +++ b/content/blog/2013-08-05-community-roundup-6.md @@ -49,7 +49,7 @@ este.demos.react.todoApp = este.react.create (`/** @lends {React.ReactComponent. ] ``` -[Check it out on GitHub...](https://github.com/steida/este-library/blob/master/este/demos/thirdparty/react/start.coffee) +[Check it out on GitHub...](https://github.com/steida/este-library/blob/main/este/demos/thirdparty/react/start.coffee) ## React Stylus Boilerplate {#react-stylus-boilerplate} diff --git a/content/blog/2013-08-19-use-react-and-jsx-in-python-applications.md b/content/blog/2013-08-19-use-react-and-jsx-in-python-applications.md index bbbc4da63..7fd32b3f2 100644 --- a/content/blog/2013-08-19-use-react-and-jsx-in-python-applications.md +++ b/content/blog/2013-08-19-use-react-and-jsx-in-python-applications.md @@ -52,4 +52,4 @@ Alternatively, add it into your `requirements` file: **Dependencies**: PyReact uses [PyExecJS](https://github.com/doloopwhile/PyExecJS) to execute the bundled React code, which requires that a JS runtime environment is installed on your machine. We don't explicitly set a dependency on a runtime environment; Mac OS X comes bundled with one. If you're on a different platform, we recommend [PyV8](https://code.google.com/p/pyv8/). -For the initial release, we've only tested on Python 2.7. Look out for support for Python 3 in the future, and if you see anything that can be improved, we welcome your [contributions](https://github.com/facebook/react-python/blob/master/CONTRIBUTING.md)! +For the initial release, we've only tested on Python 2.7. Look out for support for Python 3 in the future, and if you see anything that can be improved, we welcome your [contributions](https://github.com/facebook/react-python/blob/main/CONTRIBUTING.md)! diff --git a/content/blog/2013-08-26-community-roundup-7.md b/content/blog/2013-08-26-community-roundup-7.md index bc526b466..17f895001 100644 --- a/content/blog/2013-08-26-community-roundup-7.md +++ b/content/blog/2013-08-26-community-roundup-7.md @@ -16,13 +16,13 @@ It's been three months since we open sourced React and it is going well. Some st ## Wolfenstein Rendering Engine Ported to React {#wolfenstein-rendering-engine-ported-to-react} -[Pete Hunt](http://www.petehunt.net/) ported the render code of the web version of Wolfenstein 3D to React. Check out [the demo](http://www.petehunt.net/wolfenstein3D-react/wolf3d.html) and [render.js](https://github.com/petehunt/wolfenstein3D-react/blob/master/js/renderer.js#L183) file for the implementation. +[Pete Hunt](http://www.petehunt.net/) ported the render code of the web version of Wolfenstein 3D to React. Check out [the demo](http://www.petehunt.net/wolfenstein3D-react/wolf3d.html) and [render.js](https://github.com/petehunt/wolfenstein3D-react/blob/main/js/renderer.js#L183) file for the implementation.
## React & Meteor {#react--meteor} -[Ben Newman](https://twitter.com/benjamn) made a [13-lines wrapper](https://github.com/benjamn/meteor-react/blob/master/lib/mixin.js) to use React and Meteor together. [Meteor](http://www.meteor.com/) handles the real-time data synchronization between client and server. React provides the declarative way to write the interface and only updates the parts of the UI that changed. +[Ben Newman](https://twitter.com/benjamn) made a [13-lines wrapper](https://github.com/benjamn/meteor-react/blob/main/lib/mixin.js) to use React and Meteor together. [Meteor](http://www.meteor.com/) handles the real-time data synchronization between client and server. React provides the declarative way to write the interface and only updates the parts of the UI that changed. > This repository defines a Meteor package that automatically integrates the React rendering framework on both the client and the server, to complement or replace the default Handlebars templating system. > diff --git a/content/blog/2013-10-16-react-v0.5.0.md b/content/blog/2013-10-16-react-v0.5.0.md index bb8fa7a8b..81629c459 100644 --- a/content/blog/2013-10-16-react-v0.5.0.md +++ b/content/blog/2013-10-16-react-v0.5.0.md @@ -5,7 +5,7 @@ author: [zpao] This release is the result of several months of hard work from members of the team and the community. While there are no groundbreaking changes in core, we've worked hard to improve performance and memory usage. We've also worked hard to make sure we are being consistent in our usage of DOM properties. -The biggest change you'll notice as a developer is that we no longer support `class` in JSX as a way to provide CSS classes. Since this prop was being converted to `className` at the transform step, it caused some confusion when trying to access it in composite components. As a result we decided to make our DOM properties mirror their counterparts in the JS DOM API. There are [a few exceptions](https://github.com/facebook/react/blob/master/src/dom/DefaultDOMPropertyConfig.js#L156) where we deviate slightly in an attempt to be consistent internally. +The biggest change you'll notice as a developer is that we no longer support `class` in JSX as a way to provide CSS classes. Since this prop was being converted to `className` at the transform step, it caused some confusion when trying to access it in composite components. As a result we decided to make our DOM properties mirror their counterparts in the JS DOM API. There are [a few exceptions](https://github.com/facebook/react/blob/main/src/dom/DefaultDOMPropertyConfig.js#L156) where we deviate slightly in an attempt to be consistent internally. The other major change in v0.5 is that we've added an additional build - `react-with-addons` - which adds support for some extras that we've been working on including animations and two-way binding. [Read more about these addons in the docs](/docs/addons.html). diff --git a/content/blog/2013-11-06-community-roundup-10.md b/content/blog/2013-11-06-community-roundup-10.md index f85b77e6a..8611174f0 100644 --- a/content/blog/2013-11-06-community-roundup-10.md +++ b/content/blog/2013-11-06-community-roundup-10.md @@ -52,7 +52,7 @@ The best part is that no drastic changes have been required to support all those ## TodoMVC Benchmarks {#todomvc-benchmarks} -Webkit has a [TodoMVC Benchmark](https://github.com/WebKit/webkit/tree/master/PerformanceTests/DoYouEvenBench) that compares different frameworks. They recently included React and here are the results (average of 10 runs in Chrome 30): +Webkit has a [TodoMVC Benchmark](https://github.com/WebKit/webkit/tree/main/PerformanceTests/DoYouEvenBench) that compares different frameworks. They recently included React and here are the results (average of 10 runs in Chrome 30): - **AngularJS:** 4043ms - **AngularJSPerf:** 3227ms diff --git a/content/blog/2014-02-05-community-roundup-15.md b/content/blog/2014-02-05-community-roundup-15.md index 8d5f5f606..165746b71 100644 --- a/content/blog/2014-02-05-community-roundup-15.md +++ b/content/blog/2014-02-05-community-roundup-15.md @@ -103,7 +103,7 @@ Fredrik Dyrkell ([@lexicallyscoped](https://twitter.com/lexicallyscoped)) rewrot In a separate post, Dyrkell breaks down [how to build a binary clock component](http://www.lexicallyscoped.com/2014/01/23/ClojureScript-react-om-binary-clock.html) in Om. -[[Demo](http://www.lexicallyscoped.com/demo/binclock/)] [[Code](https://github.com/fredyr/binclock/blob/master/src/binclock/core.cljs)] +[[Demo](http://www.lexicallyscoped.com/demo/binclock/)] [[Code](https://github.com/fredyr/binclock/blob/main/src/binclock/core.cljs)] ### Time Travel: Implementing undo in Om {#time-travel-implementing-undo-in-om} David Nolen shows how to leverage immutable data structures to [add global undo](https://swannodette.github.io/2013/12/31/time-travel/) functionality to an app – using just 13 lines of ClojureScript. diff --git a/content/blog/2014-02-16-react-v0.9-rc1.md b/content/blog/2014-02-16-react-v0.9-rc1.md index afc3822ba..d57699f2d 100644 --- a/content/blog/2014-02-16-react-v0.9-rc1.md +++ b/content/blog/2014-02-16-react-v0.9-rc1.md @@ -51,7 +51,7 @@ React.DOM.div(null, We believe this new behavior is more helpful and eliminates cases where unwanted whitespace was previously added. -In cases where you want to preserve the space adjacent to a newline, you can write a JS string like `{"Monkeys: "}` in your JSX source. We've included a script to do an automated codemod of your JSX source tree that preserves the old whitespace behavior by adding and removing spaces appropriately. You can [install jsx\_whitespace\_transformer from npm](https://github.com/facebook/react/blob/master/npm-jsx_whitespace_transformer/README.md) and run it over your source tree to modify files in place. The transformed JSX files will preserve your code's existing whitespace behavior. +In cases where you want to preserve the space adjacent to a newline, you can write a JS string like `{"Monkeys: "}` in your JSX source. We've included a script to do an automated codemod of your JSX source tree that preserves the old whitespace behavior by adding and removing spaces appropriately. You can [install jsx\_whitespace\_transformer from npm](https://github.com/facebook/react/blob/main/npm-jsx_whitespace_transformer/README.md) and run it over your source tree to modify files in place. The transformed JSX files will preserve your code's existing whitespace behavior. ## Changelog {#changelog} diff --git a/content/blog/2014-02-20-react-v0.9.md b/content/blog/2014-02-20-react-v0.9.md index bcb02397c..95bff4c78 100644 --- a/content/blog/2014-02-20-react-v0.9.md +++ b/content/blog/2014-02-20-react-v0.9.md @@ -59,7 +59,7 @@ React.DOM.div(null, We believe this new behavior is more helpful and eliminates cases where unwanted whitespace was previously added. -In cases where you want to preserve the space adjacent to a newline, you can write `{'Monkeys: '}` or `Monkeys:{' '}` in your JSX source. We've included a script to do an automated codemod of your JSX source tree that preserves the old whitespace behavior by adding and removing spaces appropriately. You can [install jsx\_whitespace\_transformer from npm](https://github.com/facebook/react/blob/master/npm-jsx_whitespace_transformer/README.md) and run it over your source tree to modify files in place. The transformed JSX files will preserve your code's existing whitespace behavior. +In cases where you want to preserve the space adjacent to a newline, you can write `{'Monkeys: '}` or `Monkeys:{' '}` in your JSX source. We've included a script to do an automated codemod of your JSX source tree that preserves the old whitespace behavior by adding and removing spaces appropriately. You can [install jsx\_whitespace\_transformer from npm](https://github.com/facebook/react/blob/main/npm-jsx_whitespace_transformer/README.md) and run it over your source tree to modify files in place. The transformed JSX files will preserve your code's existing whitespace behavior. ## Changelog {#changelog} diff --git a/content/blog/2014-04-04-reactnet.md b/content/blog/2014-04-04-reactnet.md index 53da5af7b..1c9d921d1 100644 --- a/content/blog/2014-04-04-reactnet.md +++ b/content/blog/2014-04-04-reactnet.md @@ -30,7 +30,7 @@ ReactJS.NET is packaged in NuGet. Simply run `Install-Package React.Mvc4` in the package manager console or search NuGet for "React" to install it. [See the documentation](http://reactjs.net/docs) for more information. The GitHub project contains -[a sample website](https://github.com/reactjs/React.NET/tree/master/src/React.Sample.Mvc4) +[a sample website](https://github.com/reactjs/React.NET/tree/main/src/React.Sample.Mvc4) demonstrating all of the features. Let us know what you think, and feel free to send through any feedback and diff --git a/content/blog/2014-05-06-flux.md b/content/blog/2014-05-06-flux.md index f4460545c..99d07d728 100644 --- a/content/blog/2014-05-06-flux.md +++ b/content/blog/2014-05-06-flux.md @@ -13,4 +13,4 @@ In Flux, the Dispatcher is a singleton that directs the flow of data and ensures When a user interacts with a React view, the view sends an action (usually represented as a JavaScript object with some fields) through the dispatcher, which notifies the various stores that hold the application's data and business logic. When the stores change state, they notify the views that something has updated. This works especially well with React's declarative model, which allows the stores to send updates without specifying how to transition views between states. -Flux is more of a pattern than a formal framework, so you can start using Flux immediately without a lot of new code. An [example of this architecture](https://github.com/facebook/flux/tree/master/examples/flux-todomvc) is available, along with more [detailed documentation](https://facebook.github.io/flux/docs/overview.html) and a [tutorial](https://facebook.github.io/flux/docs/todo-list.html). Look for more examples to come in the future. +Flux is more of a pattern than a formal framework, so you can start using Flux immediately without a lot of new code. An [example of this architecture](https://github.com/facebook/flux/tree/main/examples/flux-todomvc) is available, along with more [detailed documentation](https://facebook.github.io/flux/docs/overview.html) and a [tutorial](https://facebook.github.io/flux/docs/todo-list.html). Look for more examples to come in the future. diff --git a/content/blog/2014-06-27-community-roundup-19.md b/content/blog/2014-06-27-community-roundup-19.md index 7a8956d60..2e6bfc01d 100644 --- a/content/blog/2014-06-27-community-roundup-19.md +++ b/content/blog/2014-06-27-community-roundup-19.md @@ -25,7 +25,7 @@ The core concepts React themselves is something very valuable that the community -And don't forget [Pete Hunt](https://github.com/petehunt)'s Wolfenstein 3D rendering engine in React ([source code](https://github.com/petehunt/wolfenstein3D-react/blob/master/js/renderer.js#L183)). While it's nearly a year old, it's still a nice demo. +And don't forget [Pete Hunt](https://github.com/petehunt)'s Wolfenstein 3D rendering engine in React ([source code](https://github.com/petehunt/wolfenstein3D-react/blob/main/js/renderer.js#L183)). While it's nearly a year old, it's still a nice demo. [![](../images/blog/wolfenstein_react.png)](http://www.petehunt.net/wolfenstein3D-react/wolf3d.html) diff --git a/content/blog/2014-07-30-flux-actions-and-the-dispatcher.md b/content/blog/2014-07-30-flux-actions-and-the-dispatcher.md index 03826c8d9..3e11f4bb6 100644 --- a/content/blog/2014-07-30-flux-actions-and-the-dispatcher.md +++ b/content/blog/2014-07-30-flux-actions-and-the-dispatcher.md @@ -3,7 +3,7 @@ title: "Flux: Actions and the Dispatcher" author: [fisherwebdev] --- -Flux is the application architecture Facebook uses to build JavaScript applications. It's based on a unidirectional data flow. We've built everything from small widgets to huge applications with Flux, and it's handled everything we've thrown at it. Because we've found it to be a great way to structure our code, we're excited to share it with the open source community. [Jing Chen presented Flux](http://youtu.be/nYkdrAPrdcw?t=10m20s) at the F8 conference, and since that time we've seen a lot of interest in it. We've also published an [overview of Flux](https://facebook.github.io/flux/docs/overview.html) and a [TodoMVC example](https://github.com/facebook/flux/tree/master/examples/flux-todomvc/), with an accompanying [tutorial](https://facebook.github.io/flux/docs/todo-list.html). +Flux is the application architecture Facebook uses to build JavaScript applications. It's based on a unidirectional data flow. We've built everything from small widgets to huge applications with Flux, and it's handled everything we've thrown at it. Because we've found it to be a great way to structure our code, we're excited to share it with the open source community. [Jing Chen presented Flux](http://youtu.be/nYkdrAPrdcw?t=10m20s) at the F8 conference, and since that time we've seen a lot of interest in it. We've also published an [overview of Flux](https://facebook.github.io/flux/docs/overview.html) and a [TodoMVC example](https://github.com/facebook/flux/tree/main/examples/flux-todomvc/), with an accompanying [tutorial](https://facebook.github.io/flux/docs/todo-list.html). Flux is more of a pattern than a full-blown framework, and you can start using it without a lot of new code beyond React. Up until recently, however, we haven't released one crucial piece of our Flux software: the dispatcher. But along with the creation of the new [Flux code repository](https://github.com/facebook/flux) and [Flux website](https://facebook.github.io/flux/), we've now open sourced the same [dispatcher](https://facebook.github.io/flux/docs/dispatcher.html) we use in our production applications. @@ -41,6 +41,6 @@ Problems arise, however, if we have circular dependencies. That is, if Store A n Example Chat App ---------------- -Along with the same dispatcher that Facebook uses in its production applications, we've also published a new example [chat app](https://github.com/facebook/flux/tree/master/examples/flux-chat), slightly more complicated than the simplistic TodoMVC, so that engineers can better understand how Flux solves problems like dependencies between stores and calls to a web API. +Along with the same dispatcher that Facebook uses in its production applications, we've also published a new example [chat app](https://github.com/facebook/flux/tree/main/examples/flux-chat), slightly more complicated than the simplistic TodoMVC, so that engineers can better understand how Flux solves problems like dependencies between stores and calls to a web API. We're hopeful that the new Flux repository will grow with time to include additional tools, boilerplate code and further examples. And we hope that Flux will prove as useful to you as it has to us. Enjoy! diff --git a/content/blog/2014-09-24-testing-flux-applications.md b/content/blog/2014-09-24-testing-flux-applications.md index 5721e3b42..7ad8cf0ce 100644 --- a/content/blog/2014-09-24-testing-flux-applications.md +++ b/content/blog/2014-09-24-testing-flux-applications.md @@ -11,7 +11,7 @@ author: [fisherwebdev] Testing with Jest ----------------- -For a unit test to operate on a truly isolated _unit_ of the application, we need to mock every module except the one we are testing. Jest makes the mocking of other parts of a Flux application trivial. To illustrate testing with Jest, we'll return to our [example TodoMVC application](https://github.com/facebook/flux/tree/master/examples/flux-todomvc). +For a unit test to operate on a truly isolated _unit_ of the application, we need to mock every module except the one we are testing. Jest makes the mocking of other parts of a Flux application trivial. To illustrate testing with Jest, we'll return to our [example TodoMVC application](https://github.com/facebook/flux/tree/main/examples/flux-todomvc). The first steps toward working with Jest are as follows: @@ -154,7 +154,7 @@ describe('TodoStore', function() { }); ``` -You can take a look at all this code in the [TodoStore's tests on GitHub](https://github.com/facebook/flux/tree/master/examples/flux-todomvc/js/stores/__tests__/TodoStore-test.js) as well. +You can take a look at all this code in the [TodoStore's tests on GitHub](https://github.com/facebook/flux/tree/main/examples/flux-todomvc/js/stores/__tests__/TodoStore-test.js) as well. Mocking Data Derived from Other Stores @@ -178,7 +178,7 @@ MyOtherStore.getState.mockReturnValue({ Now we have a collection of objects that will come back from MyOtherStore whenever we call MyOtherStore.getState() in our tests. Any application state can be simulated with a combination of these custom return values and the previously shown technique of working with the store's registered callback. -A brief example of this technique is up on GitHub within the Flux Chat example's [UnreadThreadStore-test.js](https://github.com/facebook/flux/tree/master/examples/flux-chat/js/stores/__tests__/UnreadThreadStore-test.js). +A brief example of this technique is up on GitHub within the Flux Chat example's [UnreadThreadStore-test.js](https://github.com/facebook/flux/tree/main/examples/flux-chat/js/stores/__tests__/UnreadThreadStore-test.js). For more information about the `mock` property of mocked methods or Jest's ability to provide custom mock values, see Jest's documentation on [mock functions](https://facebook.github.io/jest/docs/mock-functions.html). diff --git a/content/blog/2014-10-28-react-v0.12.md b/content/blog/2014-10-28-react-v0.12.md index 824b2d6b0..eb49f83d6 100644 --- a/content/blog/2014-10-28-react-v0.12.md +++ b/content/blog/2014-10-28-react-v0.12.md @@ -48,7 +48,7 @@ As a result of this update, we no longer need to expose several internal modules We updated the license on React to the BSD 3-Clause license with an explicit patent grant. Previously we used the Apache 2 license. These licenses are very similar and our extra patent grant is equivalent to the grant provided in the Apache license. You can still use React with the confidence that we have granted the use of any patents covering it. This brings us in line with the same licensing we use across the majority of our open source projects at Facebook. -You can read the full text of the [LICENSE](https://github.com/facebook/react/blob/master/LICENSE) and [`PATENTS`](https://github.com/facebook/react/blob/master/PATENTS) files on GitHub. +You can read the full text of the [LICENSE](https://github.com/facebook/react/blob/main/LICENSE) and [`PATENTS`](https://github.com/facebook/react/blob/main/PATENTS) files on GitHub. - - - diff --git a/content/blog/2015-09-10-react-v0.14-rc1.md b/content/blog/2015-09-10-react-v0.14-rc1.md index e69c93ab4..398b07758 100644 --- a/content/blog/2015-09-10-react-v0.14-rc1.md +++ b/content/blog/2015-09-10-react-v0.14-rc1.md @@ -57,7 +57,7 @@ These builds are also available in the `react` package on bower. ReactDOM.render(, node); ``` - We’ve published the [automated codemod script](https://github.com/reactjs/react-codemod/blob/master/README.md) we used at Facebook to help you with this transition. + We’ve published the [automated codemod script](https://github.com/reactjs/react-codemod/blob/main/README.md) we used at Facebook to help you with this transition. The add-ons have moved to separate packages as well: `react-addons-clone-with-props`, `react-addons-create-fragment`, `react-addons-css-transition-group`, `react-addons-linked-state-mixin`, `react-addons-perf`, `react-addons-pure-render-mixin`, `react-addons-shallow-compare`, `react-addons-test-utils`, `react-addons-transition-group`, and `react-addons-update`, plus `ReactDOM.unstable_batchedUpdates` in `react-dom`. @@ -137,7 +137,7 @@ And these two changes did not warn in 0.13 but should be easy to find and clean - Due to the DOM node refs change mentioned above, `this.getDOMNode()` is now deprecated and `ReactDOM.findDOMNode(this)` can be used instead. Note that in most cases, calling `findDOMNode` is now unnecessary – see the example above in the “DOM node refs” section. - If you have a large codebase, you can use our [automated codemod script](https://github.com/facebook/react/blob/master/packages/react-codemod/README.md) to change your code automatically. + If you have a large codebase, you can use our [automated codemod script](https://github.com/facebook/react/blob/main/packages/react-codemod/README.md) to change your code automatically. - `setProps` and `replaceProps` are now deprecated. Instead, call ReactDOM.render again at the top level with the new props. - ES6 component classes must now extend `React.Component` in order to enable stateless function components. The [ES3 module pattern](/blog/2015/01/27/react-v0.13.0-beta-1.html#other-languages) will continue to work. diff --git a/content/blog/2015-10-07-react-v0.14.md b/content/blog/2015-10-07-react-v0.14.md index fd539f915..c0366829a 100644 --- a/content/blog/2015-10-07-react-v0.14.md +++ b/content/blog/2015-10-07-react-v0.14.md @@ -15,7 +15,7 @@ Like always, we have a few breaking changes in this release. We know changes can If your code is free of warnings when running under React 0.13, upgrading should be easy. We have two new small breaking changes that didn't give a warning in 0.13 (see below). Every new change in 0.14, including the major changes below, is introduced with a runtime warning and will work as before until 0.15, so you don't have to worry about your app breaking with this upgrade. -For the two major changes which require significant code changes, we've included [codemod scripts](https://github.com/reactjs/react-codemod/blob/master/README.md) to help you upgrade your code automatically. +For the two major changes which require significant code changes, we've included [codemod scripts](https://github.com/reactjs/react-codemod/blob/main/README.md) to help you upgrade your code automatically. See the changelog below for more details. @@ -66,7 +66,7 @@ If you can’t use `npm` yet, we provide pre-built browser builds for your conve ReactDOM.render(, node); ``` - The old names will continue to work with a warning until 0.15 is released, and we’ve published the [automated codemod script](https://github.com/reactjs/react-codemod/blob/master/README.md) we used at Facebook to help you with this transition. + The old names will continue to work with a warning until 0.15 is released, and we’ve published the [automated codemod script](https://github.com/reactjs/react-codemod/blob/main/README.md) we used at Facebook to help you with this transition. The add-ons have moved to separate packages as well: - `react-addons-clone-with-props` @@ -161,7 +161,7 @@ Each of these changes will continue to work as before with a new warning until t - Due to the DOM node refs change mentioned above, `this.getDOMNode()` is now deprecated and `ReactDOM.findDOMNode(this)` can be used instead. Note that in most cases, calling `findDOMNode` is now unnecessary – see the example above in the “DOM node refs” section. - With each returned DOM node, we've added a `getDOMNode` method for backwards compatibility that will work with a warning until 0.15. If you have a large codebase, you can use our [automated codemod script](https://github.com/reactjs/react-codemod/blob/master/README.md) to change your code automatically. + With each returned DOM node, we've added a `getDOMNode` method for backwards compatibility that will work with a warning until 0.15. If you have a large codebase, you can use our [automated codemod script](https://github.com/reactjs/react-codemod/blob/main/README.md) to change your code automatically. - `setProps` and `replaceProps` are now deprecated. Instead, call ReactDOM.render again at the top level with the new props. - ES6 component classes must now extend `React.Component` in order to enable stateless function components. The [ES3 module pattern](/blog/2015/01/27/react-v0.13.0-beta-1.html#other-languages) will continue to work. diff --git a/content/blog/2016-07-11-introducing-reacts-error-code-system.md b/content/blog/2016-07-11-introducing-reacts-error-code-system.md index b2d83a9c4..26b695e14 100644 --- a/content/blog/2016-07-11-introducing-reacts-error-code-system.md +++ b/content/blog/2016-07-11-introducing-reacts-error-code-system.md @@ -9,7 +9,7 @@ Prior to this release, we stripped out error messages at build-time and this is > Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings. -In order to make debugging in production easier, we're introducing an Error Code System in [15.2.0](https://github.com/facebook/react/releases/tag/v15.2.0). We developed a [script](https://github.com/facebook/react/blob/master/scripts/error-codes/extract-errors.js) that collects all of our `invariant` error messages and folds them to a [JSON file](https://github.com/facebook/react/blob/master/scripts/error-codes/codes.json), and at build-time Babel uses the JSON to [rewrite](https://github.com/facebook/react/blob/master/scripts/error-codes/transform-error-messages.js) our `invariant` calls in production to reference the corresponding error IDs. Now when things go wrong in production, the error that React throws will contain a URL with an error ID and relevant information. The URL will point you to a page in our documentation where the original error message gets reassembled. +In order to make debugging in production easier, we're introducing an Error Code System in [15.2.0](https://github.com/facebook/react/releases/tag/v15.2.0). We developed a [script](https://github.com/facebook/react/blob/main/scripts/error-codes/extract-errors.js) that collects all of our `invariant` error messages and folds them to a [JSON file](https://github.com/facebook/react/blob/main/scripts/error-codes/codes.json), and at build-time Babel uses the JSON to [rewrite](https://github.com/facebook/react/blob/main/scripts/error-codes/transform-error-messages.js) our `invariant` calls in production to reference the corresponding error IDs. Now when things go wrong in production, the error that React throws will contain a URL with an error ID and relevant information. The URL will point you to a page in our documentation where the original error message gets reassembled. While we hope you don't see errors often, you can see how it works [here](/docs/error-decoder.html?invariant=109&args[]=Foo). This is what the same error from above will look like: diff --git a/content/blog/2016-11-16-react-v15.4.0.md b/content/blog/2016-11-16-react-v15.4.0.md index 4c9284595..9648dd497 100644 --- a/content/blog/2016-11-16-react-v15.4.0.md +++ b/content/blog/2016-11-16-react-v15.4.0.md @@ -5,7 +5,7 @@ author: [gaearon] Today we are releasing React 15.4.0. -We didn't announce the [previous](https://github.com/facebook/react/blob/master/CHANGELOG.md#1510-may-20-2016) [minor](https://github.com/facebook/react/blob/master/CHANGELOG.md#1520-july-1-2016) [releases](https://github.com/facebook/react/blob/master/CHANGELOG.md#1530-july-29-2016) on the blog because most of the changes were bug fixes. However, 15.4.0 is a special release, and we would like to highlight a few notable changes in it. +We didn't announce the [previous](https://github.com/facebook/react/blob/main/CHANGELOG.md#1510-may-20-2016) [minor](https://github.com/facebook/react/blob/main/CHANGELOG.md#1520-july-1-2016) [releases](https://github.com/facebook/react/blob/main/CHANGELOG.md#1530-july-29-2016) on the blog because most of the changes were bug fixes. However, 15.4.0 is a special release, and we would like to highlight a few notable changes in it. ### Separating React and React DOM {#separating-react-and-react-dom} diff --git a/content/blog/2017-05-18-whats-new-in-create-react-app.md b/content/blog/2017-05-18-whats-new-in-create-react-app.md index 9446de7e9..5fe30e07f 100644 --- a/content/blog/2017-05-18-whats-new-in-create-react-app.md +++ b/content/blog/2017-05-18-whats-new-in-create-react-app.md @@ -54,7 +54,7 @@ Newly created projects are built as [Progressive Web Apps](https://developers.go New apps automatically have these features, but you can easily convert an existing project to a Progressive Web App by following [our migration guide](https://github.com/facebookincubator/create-react-app/releases/tag/v1.0.0). -We will be adding [more documentation](https://github.com/facebookincubator/create-react-app/blob/master/packages/react-scripts/template/README.md#making-a-progressive-web-app) on this topic in the coming weeks. Please feel free to [ask any questions](https://github.com/facebookincubator/create-react-app/issues/new) on the issue tracker! +We will be adding [more documentation](https://github.com/facebookincubator/create-react-app/blob/main/packages/react-scripts/template/README.md#making-a-progressive-web-app) on this topic in the coming weeks. Please feel free to [ask any questions](https://github.com/facebookincubator/create-react-app/issues/new) on the issue tracker! ### Jest 20 {#jest-20} diff --git a/content/blog/2017-09-08-dom-attributes-in-react-16.md b/content/blog/2017-09-08-dom-attributes-in-react-16.md index 03172bc00..21a6e3032 100644 --- a/content/blog/2017-09-08-dom-attributes-in-react-16.md +++ b/content/blog/2017-09-08-dom-attributes-in-react-16.md @@ -165,7 +165,7 @@ Below is a detailed list of them. React 15: Converts `NaN`s to strings and passes them through. React 16: Converts `NaN`s to strings and passes them through with a warning. -While testing this release, we have also [created an automatically generated table](https://github.com/facebook/react/blob/master/fixtures/attribute-behavior/AttributeTableSnapshot.md) for all known attributes to track potential regressions. +While testing this release, we have also [created an automatically generated table](https://github.com/facebook/react/blob/main/fixtures/attribute-behavior/AttributeTableSnapshot.md) for all known attributes to track potential regressions. ## Try It! {#try-it} diff --git a/content/blog/2017-11-28-react-v16.2.0-fragment-support.md b/content/blog/2017-11-28-react-v16.2.0-fragment-support.md index a8db2b0bd..e346629db 100644 --- a/content/blog/2017-11-28-react-v16.2.0-fragment-support.md +++ b/content/blog/2017-11-28-react-v16.2.0-fragment-support.md @@ -195,7 +195,7 @@ If you are using Babel with [Webpack](https://webpack.js.org/), no additional st #### Babel with Other Frameworks {#babel-with-other-frameworks} -If you use JSX with a non-React framework like Inferno or Preact, there is a [pragma option available in babel-plugin-transform-react-jsx](https://github.com/babel/babel/tree/master/packages/babel-plugin-transform-react-jsx#pragmafrag) that configures the Babel compiler to de-sugar the `<>` syntax to a custom identifier. +If you use JSX with a non-React framework like Inferno or Preact, there is a [pragma option available in babel-plugin-transform-react-jsx](https://github.com/babel/babel/tree/main/packages/babel-plugin-transform-react-jsx#pragmafrag) that configures the Babel compiler to de-sugar the `<>` syntax to a custom identifier. ### TypeScript {#typescript} diff --git a/content/blog/2017-12-07-introducing-the-react-rfc-process.md b/content/blog/2017-12-07-introducing-the-react-rfc-process.md index 349b0e5d6..ebae906d7 100644 --- a/content/blog/2017-12-07-introducing-the-react-rfc-process.md +++ b/content/blog/2017-12-07-introducing-the-react-rfc-process.md @@ -13,7 +13,7 @@ Inspired by [Yarn](https://github.com/yarnpkg/rfcs), [Ember](https://github.com/ - After discussion, the core team may or may not accept the RFC. - If the RFC is accepted, the PR is merged. -RFCs are accepted when they are approved for implementation in React. A more thorough description of the process is available in the repository's [README](https://github.com/reactjs/rfcs/blob/master/README.md). The exact details may be refined in the future. +RFCs are accepted when they are approved for implementation in React. A more thorough description of the process is available in the repository's [README](https://github.com/reactjs/rfcs/blob/main/README.md). The exact details may be refined in the future. ## Who Can Submit RFCs? {#who-can-submit-rfcs} diff --git a/content/blog/2017-12-15-improving-the-repository-infrastructure.md b/content/blog/2017-12-15-improving-the-repository-infrastructure.md index ae3cad65c..efa48376b 100644 --- a/content/blog/2017-12-15-improving-the-repository-infrastructure.md +++ b/content/blog/2017-12-15-improving-the-repository-infrastructure.md @@ -358,7 +358,7 @@ As of version 16, we now release from the `master` branch. Experimental features After changing to a stable `master`, we created a new [release process checklist](https://github.com/facebook/react/issues/10620). Although much simpler than the previous process, this still involved dozens of steps and forgetting one could result in a broken release. -To address this, we created a new [automated release process](https://github.com/facebook/react/pull/11223) that is [much easier to use](https://github.com/facebook/react/tree/master/scripts/release#react-release-script) and has several built-in checks to ensure that we release a working build. The new process is split into two steps: _build_ and _publish_. Here's what it looks like the first time you run it: +To address this, we created a new [automated release process](https://github.com/facebook/react/pull/11223) that is [much easier to use](https://github.com/facebook/react/tree/main/scripts/release#react-release-script) and has several built-in checks to ensure that we release a working build. The new process is split into two steps: _build_ and _publish_. Here's what it looks like the first time you run it: ![Release Script overview](../images/blog/release-script-build-overview.png) diff --git a/content/blog/2018-03-27-update-on-async-rendering.md b/content/blog/2018-03-27-update-on-async-rendering.md index 16ff0d6d0..cc8556f77 100644 --- a/content/blog/2018-03-27-update-on-async-rendering.md +++ b/content/blog/2018-03-27-update-on-async-rendering.md @@ -122,7 +122,7 @@ People often assume that `componentWillMount` and `componentWillUnmount` are alw For this reason, the recommended way to add listeners/subscriptions is to use the `componentDidMount` lifecycle: `embed:update-on-async-rendering/adding-event-listeners-after.js` -Sometimes it is important to update subscriptions in response to property changes. If you're using a library like Redux or MobX, the library's container component should handle this for you. For application authors, we've created a small library, [`create-subscription`](https://github.com/facebook/react/tree/master/packages/create-subscription), to help with this. We'll publish it along with React 16.3. +Sometimes it is important to update subscriptions in response to property changes. If you're using a library like Redux or MobX, the library's container component should handle this for you. For application authors, we've created a small library, [`create-subscription`](https://github.com/facebook/react/tree/main/packages/create-subscription), to help with this. We'll publish it along with React 16.3. Rather than passing a subscribable `dataSource` prop as we did in the example above, we could use `create-subscription` to pass in the subscribed value: diff --git a/content/blog/2018-10-01-create-react-app-v2.md b/content/blog/2018-10-01-create-react-app-v2.md index c35e90106..cc5f52a73 100644 --- a/content/blog/2018-10-01-create-react-app-v2.md +++ b/content/blog/2018-10-01-create-react-app-v2.md @@ -19,7 +19,7 @@ Now that Create React App 2.0 is out of beta, let's see what's new and how you c Here's a short summary of what's new in this release: -* 🎉 More styling options: you can use [Sass](https://github.com/facebook/create-react-app/blob/master/packages/react-scripts/template/README.md#adding-a-sass-stylesheet) and [CSS Modules](https://github.com/facebook/create-react-app/blob/master/packages/react-scripts/template/README.md#adding-a-css-modules-stylesheet) out of the box. +* 🎉 More styling options: you can use [Sass](https://github.com/facebook/create-react-app/blob/main/packages/react-scripts/template/README.md#adding-a-sass-stylesheet) and [CSS Modules](https://github.com/facebook/create-react-app/blob/main/packages/react-scripts/template/README.md#adding-a-css-modules-stylesheet) out of the box. * 🐠 We updated to [Babel 7](https://babeljs.io/blog/2018/08/27/7.0.0), including support for the [React fragment syntax](/docs/fragments.html#short-syntax) and many bugfixes. * 📦 We updated to [webpack 4](https://medium.com/webpack/webpack-4-released-today-6cdb994702d4), which automatically splits JS bundles more intelligently. * 🃏 We updated to [Jest 23](https://jestjs.io/blog/2018/05/29/jest-23-blazing-fast-delightful-testing.html), which includes an [interactive mode](https://jestjs.io/blog/2018/05/29/jest-23-blazing-fast-delightful-testing#interactive-snapshot-mode) for reviewing snapshots. @@ -27,7 +27,7 @@ Here's a short summary of what's new in this release: * 💎 You can use [Apollo](https://github.com/leoasis/graphql-tag.macro#usage), [Relay Modern](https://github.com/facebook/relay/pull/2171#issuecomment-411459604), [MDX](https://github.com/facebook/create-react-app/issues/5149#issuecomment-425396995), and other third-party [Babel Macros](https://babeljs.io/blog/2017/09/11/zero-config-with-babel-macros) transforms. * 🌠 You can now [import an SVG as a React component](https://facebook.github.io/create-react-app/docs/adding-images-fonts-and-files#adding-svgs), and use it in JSX. * 🐈 You can try the experimental [Yarn Plug'n'Play mode](https://github.com/yarnpkg/rfcs/pull/101) that removes `node_modules`. -* 🕸 You can now [plug your own proxy implementation](https://github.com/facebook/create-react-app/blob/master/packages/react-scripts/template/README.md#configuring-the-proxy-manually) in development to match your backend API. +* 🕸 You can now [plug your own proxy implementation](https://github.com/facebook/create-react-app/blob/main/packages/react-scripts/template/README.md#configuring-the-proxy-manually) in development to match your backend API. * 🚀 You can now use [packages written for latest Node versions](https://github.com/sindresorhus/ama/issues/446#issuecomment-281014491) without breaking the build. * ✂️ You can now optionally get a smaller CSS bundle if you only plan to target modern browsers. * 👷‍♀️ Service workers are now opt-in and are built using Google's [Workbox](https://developers.google.com/web/tools/workbox/). @@ -59,7 +59,7 @@ Here are a few more tips to get you started. **When you run `npm start` for the first time after the upgrade,** you'll get a prompt asking about which browsers you'd like to support. Press `y` to accept the default ones. They'll be written to your `package.json` and you can edit them any time. Create React App will use this information to produce smaller or polyfilled CSS bundles depending on whether you target modern browsers or older browsers. -**If `npm start` still doesn't quite work for you after the upgrade,** [check out the more detailed migration instructions in the release notes](https://github.com/facebook/create-react-app/releases/tag/v2.0.3). There *are* a few breaking changes in this release but the scope of them is limited, so they shouldn't take more than a few hours to sort out. Note that **[support for older browsers](https://github.com/facebook/create-react-app/blob/master/packages/react-app-polyfill/README.md) is now opt-in** to reduce the polyfill size. +**If `npm start` still doesn't quite work for you after the upgrade,** [check out the more detailed migration instructions in the release notes](https://github.com/facebook/create-react-app/releases/tag/v2.0.3). There *are* a few breaking changes in this release but the scope of them is limited, so they shouldn't take more than a few hours to sort out. Note that **[support for older browsers](https://github.com/facebook/create-react-app/blob/main/packages/react-app-polyfill/README.md) is now opt-in** to reduce the polyfill size. **If you previously ejected but now want to upgrade,** one common solution is to find the commits where you ejected (and any subsequent commits changing the configuration), revert them, upgrade, and later optionally eject again. It's also possible that the feature you ejected for (maybe Sass or CSS Modules?) is now supported out of the box. @@ -72,7 +72,7 @@ Here are a few more tips to get you started. Here's a short list of breaking changes in this release: * Node 6 is no longer supported. -* Support for older browsers (such as IE 9 to IE 11) is now opt-in with a [separate package](https://github.com/facebook/create-react-app/tree/master/packages/react-app-polyfill). +* Support for older browsers (such as IE 9 to IE 11) is now opt-in with a [separate package](https://github.com/facebook/create-react-app/tree/main/packages/react-app-polyfill). * Code-splitting with `import()` now behaves closer to specification, while `require.ensure()` is disabled. * The default Jest environment now includes jsdom. * Support for specifying an object as `proxy` setting was replaced with support for a custom proxy module. diff --git a/content/blog/2018-11-27-react-16-roadmap.md b/content/blog/2018-11-27-react-16-roadmap.md index 248a95647..fbb08d133 100644 --- a/content/blog/2018-11-27-react-16-roadmap.md +++ b/content/blog/2018-11-27-react-16-roadmap.md @@ -130,7 +130,7 @@ There is no documentation written for the Concurrent Mode yet. It is important t Concurrent Mode is *much* less polished than Hooks. Some APIs aren't properly "wired up" yet and don't do what they're expected to. At the time of writing this post, we don't recommend using it for anything except very early experimentation. We don't expect many bugs in Concurrent Mode itself, but note that components that produce warnings in [``](https://reactjs.org/docs/strict-mode.html) may not work correctly. On a separate note, we've seen that Concurrent Mode *surfaces* performance problems in other code which can sometimes be mistaken for performance issues in Concurrent Mode itself. For example, a stray `setInterval(fn, 1)` call that runs every millisecond would have a worse effect in Concurrent Mode. We plan to publish more guidance about diagnosing and fixing issues like this as part of this release's documentation. -Concurrent Mode is a big part of our vision for React. For CPU-bound work, it allows non-blocking rendering and keeps your app responsive while rendering complex component trees. That's demoed in the first part of [our JSConf Iceland talk](/blog/2018/03/01/sneak-peek-beyond-react-16.html). Concurrent Mode also makes Suspense better. It lets you avoid flickering a loading indicator if the network is fast enough. It's hard to explain without seeing so [Andrew's talk](https://www.youtube.com/watch?v=ByBPyMBTzM0) is the best resource available today. Concurrent Mode relies on a cooperative main thread [scheduler](https://github.com/facebook/react/tree/master/packages/scheduler), and we are [collaborating with the Chrome team](https://www.youtube.com/watch?v=mDdgfyRB5kg) to eventually move this functionality into the browser itself. +Concurrent Mode is a big part of our vision for React. For CPU-bound work, it allows non-blocking rendering and keeps your app responsive while rendering complex component trees. That's demoed in the first part of [our JSConf Iceland talk](/blog/2018/03/01/sneak-peek-beyond-react-16.html). Concurrent Mode also makes Suspense better. It lets you avoid flickering a loading indicator if the network is fast enough. It's hard to explain without seeing so [Andrew's talk](https://www.youtube.com/watch?v=ByBPyMBTzM0) is the best resource available today. Concurrent Mode relies on a cooperative main thread [scheduler](https://github.com/facebook/react/tree/main/packages/scheduler), and we are [collaborating with the Chrome team](https://www.youtube.com/watch?v=mDdgfyRB5kg) to eventually move this functionality into the browser itself. **Status in React DOM:** A *very* unstable version of Concurrent Mode is available behind an `unstable_` prefix in React 16.6 but we don't recommend trying it unless you're willing to often run into walls or missing features. The 16.7 alphas include `React.ConcurrentMode` and `ReactDOM.createRoot` without an `unstable_` prefix, but we'll likely keep the prefix in 16.7, and only document and mark Concurrent Mode as stable in this future minor release. @@ -175,7 +175,7 @@ function App() { // provide Suspense integrations with similar APIs. ``` -There is no official documentation for how to fetch data with Suspense yet, but you can find some early information in [this talk](https://youtu.be/ByBPyMBTzM0?t=1312) and [this small demo](https://github.com/facebook/react/blob/master/packages/react-devtools/CHANGELOG.md#suspense-toggle). We'll write documentation for React Cache (and how to write your own Suspense-compatible library) closer to this React release, but if you're curious, you can find its very early source code [here](https://github.com/facebook/react/blob/master/packages/react-cache/src/ReactCache.js). +There is no official documentation for how to fetch data with Suspense yet, but you can find some early information in [this talk](https://youtu.be/ByBPyMBTzM0?t=1312) and [this small demo](https://github.com/facebook/react/blob/main/packages/react-devtools/CHANGELOG.md#suspense-toggle). We'll write documentation for React Cache (and how to write your own Suspense-compatible library) closer to this React release, but if you're curious, you can find its very early source code [here](https://github.com/facebook/react/blob/main/packages/react-cache/src/ReactCache.js). The low-level Suspense mechanism (suspending rendering and showing a fallback) is expected to be stable even in React 16.6. We've used it for code splitting in production for months. However, the higher-level APIs for data fetching are very unstable. React Cache is rapidly changing, and will change at least a few more times. There are some low-level APIs that are [missing](https://github.com/reactjs/rfcs/pull/89) for a good higher-level API to be possible. We don't recommend using React Cache anywhere except very early experiments. Note that React Cache itself isn't strictly tied to React releases, but the current alphas lack basic features as cache invalidation, and you'll run into a wall very soon. We expect to have something usable with this React release. diff --git a/content/blog/2019-02-23-is-react-translated-yet.md b/content/blog/2019-02-23-is-react-translated-yet.md index 7c3d69f5f..ab7918b83 100644 --- a/content/blog/2019-02-23-is-react-translated-yet.md +++ b/content/blog/2019-02-23-is-react-translated-yet.md @@ -39,11 +39,11 @@ This approach appealed to us for several reasons: * It encouraged active maintainers for each repo to ensure quality. * Contributors already understand GitHub as a platform and are motivated to contribute directly to the React organization. -We started off with an initial trial period of three languages: Spanish, Japanese, and Simplified Chinese. This allowed us to work out any kinks in our process and make sure future translations are set up for success. I wanted to give the translation teams freedom to choose whatever tools they felt comfortable with. The only requirement is a [checklist](https://github.com/reactjs/reactjs.org-translation/blob/master/PROGRESS.template.md) that outlines the order of importance for translating pages. +We started off with an initial trial period of three languages: Spanish, Japanese, and Simplified Chinese. This allowed us to work out any kinks in our process and make sure future translations are set up for success. I wanted to give the translation teams freedom to choose whatever tools they felt comfortable with. The only requirement is a [checklist](https://github.com/reactjs/reactjs.org-translation/blob/main/PROGRESS.template.md) that outlines the order of importance for translating pages. -After the trial period, we were ready to accept more languages. I created [a script](https://github.com/reactjs/reactjs.org-translation/blob/master/scripts/create.js) to automate the creation of the new language repo, and a site, [Is React Translated Yet?](https://isreacttranslatedyet.com), to track progress on the different translations. We started *10* new translations on our first day alone! +After the trial period, we were ready to accept more languages. I created [a script](https://github.com/reactjs/reactjs.org-translation/blob/main/scripts/create.js) to automate the creation of the new language repo, and a site, [Is React Translated Yet?](https://isreacttranslatedyet.com), to track progress on the different translations. We started *10* new translations on our first day alone! -Because of the automation, the rest of the maintenance went mostly smoothly. We eventually created a [Slack channel](https://rt-slack-invite.herokuapp.com) to make it easier for translators to share information, and I released a guide solidifying the [responsibilities of maintainers](https://github.com/reactjs/reactjs.org-translation/blob/master/maintainer-guide.md). Allowing translators to talk with each other was a great boon -- for example, the Arabic, Persian, and Hebrew translations were able to talk to each other in order to get [right-to-left text](https://en.wikipedia.org/wiki/Right-to-left) working! +Because of the automation, the rest of the maintenance went mostly smoothly. We eventually created a [Slack channel](https://rt-slack-invite.herokuapp.com) to make it easier for translators to share information, and I released a guide solidifying the [responsibilities of maintainers](https://github.com/reactjs/reactjs.org-translation/blob/main/maintainer-guide.md). Allowing translators to talk with each other was a great boon -- for example, the Arabic, Persian, and Hebrew translations were able to talk to each other in order to get [right-to-left text](https://en.wikipedia.org/wiki/Right-to-left) working! ## The Bot {#the-bot} @@ -51,7 +51,7 @@ The most challenging part was getting the bot to sync changes from the English v In the end, we decided that instead of cherry picking each commit, it made more sense to merge all new commits and create a pull request around once a day. Conflicts are merged as-is and listed in the [pull request](https://github.com/reactjs/pt-BR.reactjs.org/pull/114), leaving a checklist for maintainers to fix. -Creating the [sync script](https://github.com/reactjs/reactjs.org-translation/blob/master/scripts/sync.js) was easy enough: it downloads the translated repo, adds the original as a remote, pulls from it, merges the conflicts, and creates a pull request. +Creating the [sync script](https://github.com/reactjs/reactjs.org-translation/blob/main/scripts/sync.js) was easy enough: it downloads the translated repo, adds the original as a remote, pulls from it, merges the conflicts, and creates a pull request. The problem was finding a place for the bot to run. I'm a frontend developer for a reason -- Heroku and its ilk are alien to me and *endlessly* frustrating. In fact, until this past Tuesday, I was running the script by hand on my local machine! diff --git a/content/blog/2019-08-15-new-react-devtools.md b/content/blog/2019-08-15-new-react-devtools.md index 9981c349d..84ac0ac73 100644 --- a/content/blog/2019-08-15-new-react-devtools.md +++ b/content/blog/2019-08-15-new-react-devtools.md @@ -12,7 +12,7 @@ It also offers full support for React Hooks, including inspecting nested objects ![DevTools version 4 screenshot](../images/blog/devtools-v4-screenshot.png) -[Visit the interactive tutorial](https://react-devtools-tutorial.now.sh/) to try out the new version or [see the changelog](https://github.com/facebook/react/blob/master/packages/react-devtools/CHANGELOG.md#400-august-15-2019) for demo videos and more details. +[Visit the interactive tutorial](https://react-devtools-tutorial.now.sh/) to try out the new version or [see the changelog](https://github.com/facebook/react/blob/main/packages/react-devtools/CHANGELOG.md#400-august-15-2019) for demo videos and more details. ## Which versions of React are supported? {#which-versions-of-react-are-supported} diff --git a/content/blog/2019-11-06-building-great-user-experiences-with-concurrent-mode-and-suspense.md b/content/blog/2019-11-06-building-great-user-experiences-with-concurrent-mode-and-suspense.md index 5ffa9d1f8..a41e613c6 100644 --- a/content/blog/2019-11-06-building-great-user-experiences-with-concurrent-mode-and-suspense.md +++ b/content/blog/2019-11-06-building-great-user-experiences-with-concurrent-mode-and-suspense.md @@ -222,7 +222,7 @@ These patterns aren't just ideas -- we've implemented them in Relay Hooks and ar * The [React Concurrent docs](/docs/concurrent-mode-intro.html) explore how to use Concurrent Mode and Suspense and go into more detail about many of these patterns. It's a great resource to learn more about the APIs and use-cases they support. * The [experimental release of Relay Hooks](https://relay.dev/docs/en/experimental/step-by-step) implements the patterns described here. * We've implemented two similar example apps that demonstrate these concepts: - * The [Relay Hooks example app](https://github.com/relayjs/relay-examples/tree/master/issue-tracker) uses GitHub's public GraphQL API to implement a simple issue tracker app. It includes nested route support with code and data preloading. The code is fully commented -- we encourage cloning the repo, running the app locally, and exploring how it works. + * The [Relay Hooks example app](https://github.com/relayjs/relay-examples/tree/main/issue-tracker) uses GitHub's public GraphQL API to implement a simple issue tracker app. It includes nested route support with code and data preloading. The code is fully commented -- we encourage cloning the repo, running the app locally, and exploring how it works. * We also have a [non-GraphQL version of the app](https://github.com/gaearon/suspense-experimental-github-demo) that demonstrates how these concepts can be applied to other data-fetching libraries. While the APIs around Concurrent Mode and Suspense are [still experimental](/docs/concurrent-mode-adoption.html#who-is-this-experimental-release-for), we're confident that the ideas in this post are proven by practice. However, we understand that Relay and GraphQL aren't the right fit for everyone. That's ok! **We're actively exploring how to generalize these patterns to approaches such as REST,** and are exploring ideas for a more generic (ie non-GraphQL) API for composing a tree of data dependencies. In the meantime, we're excited to see what new libraries will emerge that implement the patterns described in this post to make it easier to build great, *fast* user experiences. diff --git a/content/blog/2020-08-10-react-v17-rc.md b/content/blog/2020-08-10-react-v17-rc.md index d9d38119f..c6abdd2ee 100644 --- a/content/blog/2020-08-10-react-v17-rc.md +++ b/content/blog/2020-08-10-react-v17-rc.md @@ -199,7 +199,7 @@ useEffect(() => { }); ``` -We don't expect this to be a common problem because [our `eslint-plugin-react-hooks/exhaustive-deps` lint rule](https://github.com/facebook/react/tree/master/packages/eslint-plugin-react-hooks) (make sure you use it!) has always warned about this. +We don't expect this to be a common problem because [our `eslint-plugin-react-hooks/exhaustive-deps` lint rule](https://github.com/facebook/react/tree/main/packages/eslint-plugin-react-hooks) (make sure you use it!) has always warned about this. ### Consistent Errors for Returning Undefined {#consistent-errors-for-returning-undefined} diff --git a/content/blog/2020-09-22-introducing-the-new-jsx-transform.md b/content/blog/2020-09-22-introducing-the-new-jsx-transform.md index 623fe2f83..f509089d6 100644 --- a/content/blog/2020-09-22-introducing-the-new-jsx-transform.md +++ b/content/blog/2020-09-22-introducing-the-new-jsx-transform.md @@ -107,7 +107,7 @@ Next.js [v9.5.3](https://github.com/vercel/next.js/releases/tag/v9.5.3)+ uses th ### Gatsby {#gatsby} -Gatsby [v2.24.5](https://github.com/gatsbyjs/gatsby/blob/master/packages/gatsby/CHANGELOG.md#22452-2020-08-28)+ uses the new transform for compatible React versions. +Gatsby [v2.24.5](https://github.com/gatsbyjs/gatsby/blob/main/packages/gatsby/CHANGELOG.md#22452-2020-08-28)+ uses the new transform for compatible React versions. >Note > diff --git a/content/community/support.md b/content/community/support.md index cb31a529b..a133c43f8 100644 --- a/content/community/support.md +++ b/content/community/support.md @@ -12,7 +12,7 @@ React has a community of millions of developers. On this page we've listed some React-related communities that you can be a part of; see the other pages in this section for additional online and in-person learning materials. -Before participating in React's communities, [please read our Code of Conduct](https://github.com/facebook/react/blob/master/CODE_OF_CONDUCT.md). We have adopted the [Contributor Covenant](https://www.contributor-covenant.org/) and we expect that all community members adhere to the guidelines within. +Before participating in React's communities, [please read our Code of Conduct](https://github.com/facebook/react/blob/main/CODE_OF_CONDUCT.md). We have adopted the [Contributor Covenant](https://www.contributor-covenant.org/) and we expect that all community members adhere to the guidelines within. ## Stack Overflow {#stack-overflow} diff --git a/content/docs/add-react-to-a-website.md b/content/docs/add-react-to-a-website.md index f314928b4..fcdda54a8 100644 --- a/content/docs/add-react-to-a-website.md +++ b/content/docs/add-react-to-a-website.md @@ -159,7 +159,7 @@ The quickest way to try JSX in your project is to add this ` ``` -Now you can use JSX in any `