{"componentChunkName":"component---src-templates-docs-js","path":"/docs/concurrent-mode-adoption.html","result":{"data":{"markdownRemark":{"html":"<style>\n.scary > blockquote {\n  background-color: rgba(237, 51, 21, 0.2);\n  border-left-color: #ed3315;\n}\n</style>\n<div class=\"scary\">\n<blockquote>\n<p>Внимание:</p>\n<p>На странице описаны <strong>экспериментальные функции, которых еще нет в стабильной версии</strong>. Не используйте экспериментальные сборки React в продакшен-приложениях. Эти функции могут значительно измениться без предупреждения перед тем, как попасть в React.</p>\n<p>Эта документация предназначена для ранних пользователей и интересующихся. Если вы новичок в React, не беспокойтесь об этих возможностях — вам не нужно изучать их прямо сейчас.</p>\n</blockquote>\n</div>\n<ul>\n<li>\n<p><a href=\"#installation\">Установка</a></p>\n<ul>\n<li><a href=\"#who-is-this-experimental-release-for\">Для кого предназначены экспериментальные релизы?</a></li>\n<li><a href=\"#enabling-concurrent-mode\">Включение конкурентного режима</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"#what-to-expect\">К чему готовиться?</a></p>\n<ul>\n<li><a href=\"#migration-step-blocking-mode\">Промежуточный этап: блокирующий режим</a></li>\n<li><a href=\"#why-so-many-modes\">Зачем столько режимов?</a></li>\n<li><a href=\"#feature-comparison\">Сравнение возможностей</a></li>\n</ul>\n</li>\n</ul>\n<h2 id=\"installation\"><a href=\"#installation\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Установка </h2>\n<p>Конкурентный режим доступен только в <a href=\"/blog/2019/10/22/react-release-channels.html#experimental-channel\">экспериментальных сборках</a> React. Чтобы установить их, выполните:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"gatsby-code-text\"><code class=\"gatsby-code-text\">npm install react@experimental react-dom@experimental</code></pre></div>\n<p><strong>Для экспериментальных сборок нет гарантий семантического версионирования</strong></p>\n<p>В любом релизе с версией <code class=\"gatsby-code-text\">@experimental</code> функции API могут быть добавлены, изменены или удалены.</p>\n<p><strong>Экспериментальные релизы будут часто содержать критические изменения.</strong></p>\n<p>Вы можете пробовать такие сборки в личных проектах или в ветках, однако мы не рекомендуем использовать их в продакшене. В Facebook мы <em>используем</em> их в продакшене, поскольку можем исправлять ошибки, если что-то сломается. Мы вас предупредили.</p>\n<h3 id=\"who-is-this-experimental-release-for\"><a href=\"#who-is-this-experimental-release-for\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Для кого предназначен этот экспериментальный релиз? </h3>\n<p>Этот релиз предназначен в первую очередь для ранних пользователей, авторов библиотек и интересующихся.</p>\n<p>Мы используем экспериментальный код в продакшене (это работает для нас), несмотря на то, что в нем есть некоторое количество ошибок, недоделанные возможности и пробелы в документации. Нам бы хотелось выявить ошибки в конкурентном режиме, чтобы лучше подготовить его к официальному стабильному релизу в будущем.</p>\n<h3 id=\"enabling-concurrent-mode\"><a href=\"#enabling-concurrent-mode\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Включение конкурентного режима </h3>\n<p>Обычно, когда мы добавляем новые возможности в React, вы можете сразу же использовать их. Например, фрагменты, контекст и даже хуки были именно такими. Их можно использовать в новом коде не меняя уже существующий.</p>\n<p>С конкурентным режимом другая история. В нём изменена сама суть работы React. В противном случае использование <a href=\"/docs/concurrent-mode-patterns.html\">новых возможностей</a> <em>было бы невозможно</em>. Именно поэтому они объединены в новый «режим», а не выпускаются по-отдельности.</p>\n<p>Вы не можете использовать конкурентный режим для отдельных поддеревьев. Включать конкурентный режим нужно в том же месте, где ранее вы вызывали функцию <code class=\"gatsby-code-text\">ReactDOM.render()</code>.</p>\n<p><strong>Включение конкурентного режима для всего дерева <code class=\"gatsby-code-text\">&lt;App /&gt;</code>:</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">import</span> ReactDOM <span class=\"token keyword\">from</span> <span class=\"token string\">'react-dom'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Раньше вы использовали:</span>\n<span class=\"token comment\">//</span>\n<span class=\"token comment\">// ReactDOM.render(&lt;App />, document.getElementById('root'));</span>\n<span class=\"token comment\">//</span>\n<span class=\"token comment\">// Теперь для перехода в конкурентный режим нужно написать:</span>\n\nReactDOM<span class=\"token punctuation\">.</span><span class=\"token function\">unstable_createRoot</span><span class=\"token punctuation\">(</span>\n  document<span class=\"token punctuation\">.</span><span class=\"token function\">getElementById</span><span class=\"token punctuation\">(</span><span class=\"token string\">'root'</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">App</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<blockquote>\n<p>Примечание:</p>\n<p>Функции API конкурентного режима доступны только в экспериментальных сборках React.</p>\n</blockquote>\n<p>В конкурентном режиме методы жизненного цикла, <a href=\"/blog/2018/03/27/update-on-async-rendering.html\">ранее помеченные</a> как «небезопасные», <em>становятся</em> действительно небезопасными и приводят к ошибкам гораздо чаще, чем в текущих релизах React. Мы не рекомендуем использовать конкурентный режим, пока ваше приложение не будет поддерживать <a href=\"/docs/strict-mode.html\">строгий режим</a>.</p>\n<h2 id=\"what-to-expect\"><a href=\"#what-to-expect\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>К чему готовиться? </h2>\n<p>Если у вас достаточно большое приложение или в нём много сторонних зависимостей, не стоит надеяться на быстрый переход на конкурентный режим. <strong>Например, в Facebook мы используем конкурентный режим только на новых сайтах и не планируем задействовать его на старых.</strong> Это из-за того, что старые сайты в продакшен-коде используют небезопасные методы жизненного цикла, несовместимые библиотеки сторонних разработчиков и паттерны, которые плохо работают в конкурентном режиме.</p>\n<p>По нашему опыту, код, который использует классические паттерны React и не полагается на решения для управления внешним состоянием, проще всего запустить в параллельном режиме. В ближайшее время мы опишем проблемы, которые смогли обнаружить, и способы их решения.</p>\n<h3 id=\"migration-step-blocking-mode\"><a href=\"#migration-step-blocking-mode\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Этап миграции: блокирующий режим </h3>\n<p>Для старых проектов путь перехода на конкурентный режим может оказаться достаточно длинным. Поэтому в экспериментальных сборках React мы предусмотрели новый «блокирующий режим». Вы можете попробовать его, заменив <code class=\"gatsby-code-text\">createRoot</code> на <code class=\"gatsby-code-text\">createBlockingRoot</code>. Блокирующий режим предоставляет <em>сокращённый набор</em> возможностей конкурентного режима. При этом он ближе к тому, как работает React в настоящее время, и может послужить в качестве промежуточного этапа.</p>\n<p>Итого:</p>\n<ul>\n<li><strong>Старый режим:</strong> <code class=\"gatsby-code-text\">ReactDOM.render(&lt;App /&gt;, rootNode)</code>. Это режим, в котором React работает в настоящее время. В обозримом будущем мы не планируем избавляться от старого режима, но он не будет поддерживать новые возможности.</li>\n<li><strong>Блокирующий режим:</strong> <code class=\"gatsby-code-text\">ReactDOM.createBlockingRoot(rootNode).render(&lt;App /&gt;)</code>. В настоящее время экспериментальный. Он предназначен в качестве первого этапа миграции приложений, в которых предполагается использовать часть возможностей конкурентного режима.</li>\n<li><strong>Конкурентный режим:</strong> <code class=\"gatsby-code-text\">ReactDOM.createRoot(rootNode).render(&lt;App /&gt;)</code>. В настоящее время экспериментальный. В будущем, после стабилизации, мы намерены сделать его основным режимом React. Данный режим задействует <em>все</em> новые возможности.</li>\n</ul>\n<h3 id=\"why-so-many-modes\"><a href=\"#why-so-many-modes\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Зачем столько режимов? </h3>\n<p>Мы считаем, что лучше предложить <a href=\"/docs/faq-versioning.html#commitment-to-stability\">стратегию постепенной миграции</a>, чем вносить огромные серьезные изменения или позволить React стагнировать.</p>\n<p>На практике мы ожидаем, что большинство приложений, использующих в настоящее время старый режим, смогут перейти на конкурентный или, как минимум, на блокирующий. Такая фрагментация может создать некоторые проблемы для авторов библиотек, которые будут вынуждены какое-то время поддерживать все режимы. Однако нужно учитывать, что постепенный переход со старого режима помогает решать проблемы, влияющие на основные библиотеки в экосистеме React, например, <a href=\"https://github.com/facebook/react/issues/14536\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">странное поведение Задержек при чтении DOM</a> и <a href=\"https://github.com/facebook/react/issues/15080\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">нестабильность пакетного рендеринга</a>. Есть некоторое количество багов, которые невозможно исправить без изменения семантики в старом режиме, но при этом они отсутствуют в блокирующем или конкурентном режимах.</p>\n<p>Вы можете рассматривать блокирующий режим как «отказоустойчивую» версию конкурентного режима. <strong>В конечном итоге, в долгосрочной перспективе, у нас будет возможность объединить оба режима и перестать рассматривать их как отдельные друг от друга.</strong> В настоящее время режимы являются важной частью переходной стратегии. Они дают возможность каждому определять момент перехода на конкурентный режим и обновлять код в удобном для себя темпе.</p>\n<h3 id=\"feature-comparison\"><a href=\"#feature-comparison\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Сравнение возможностей </h3>\n<style>\n  #feature-table table { border-collapse: collapse; }\n  #feature-table th { padding-right: 30px; }\n  #feature-table tr { border-bottom: 1px solid #eee; }\n</style>\n<div id=\"feature-table\">\n<table>\n<thead>\n<tr>\n<th align=\"left\"></th>\n<th align=\"left\">Старый режим</th>\n<th align=\"left\">Блокирующий режим</th>\n<th align=\"left\">Конкурентный режим</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td align=\"left\"><a href=\"/docs/refs-and-the-dom.html#legacy-api-string-refs\">Строковые рефы</a></td>\n<td align=\"left\">✅</td>\n<td align=\"left\">🚫**</td>\n<td align=\"left\">🚫**</td>\n</tr>\n<tr>\n<td align=\"left\"><a href=\"/docs/legacy-context.html\">Старый контекст</a></td>\n<td align=\"left\">✅</td>\n<td align=\"left\">🚫**</td>\n<td align=\"left\">🚫**</td>\n</tr>\n<tr>\n<td align=\"left\"><a href=\"/docs/strict-mode.html#warning-about-deprecated-finddomnode-usage\">findDOMNode</a></td>\n<td align=\"left\">✅</td>\n<td align=\"left\">🚫**</td>\n<td align=\"left\">🚫**</td>\n</tr>\n<tr>\n<td align=\"left\"><a href=\"/docs/concurrent-mode-suspense.html#what-is-suspense-exactly\">Задержка</a></td>\n<td align=\"left\">✅</td>\n<td align=\"left\">✅</td>\n<td align=\"left\">✅</td>\n</tr>\n<tr>\n<td align=\"left\"><a href=\"/docs/concurrent-mode-patterns.html#suspenselist\">SuspenseList</a></td>\n<td align=\"left\">🚫</td>\n<td align=\"left\">✅</td>\n<td align=\"left\">✅</td>\n</tr>\n<tr>\n<td align=\"left\">Задержка в React на сервере + гидратация</td>\n<td align=\"left\">🚫</td>\n<td align=\"left\">✅</td>\n<td align=\"left\">✅</td>\n</tr>\n<tr>\n<td align=\"left\">Последовательная гидратация</td>\n<td align=\"left\">🚫</td>\n<td align=\"left\">✅</td>\n<td align=\"left\">✅</td>\n</tr>\n<tr>\n<td align=\"left\">Выборочная гидратация</td>\n<td align=\"left\">🚫</td>\n<td align=\"left\">🚫</td>\n<td align=\"left\">✅</td>\n</tr>\n<tr>\n<td align=\"left\">Кооперативная многозадачность</td>\n<td align=\"left\">🚫</td>\n<td align=\"left\">🚫</td>\n<td align=\"left\">✅</td>\n</tr>\n<tr>\n<td align=\"left\">Автоматическая группировка при множественном вызове setStates    </td>\n<td align=\"left\">🚫*</td>\n<td align=\"left\">✅</td>\n<td align=\"left\">✅</td>\n</tr>\n<tr>\n<td align=\"left\"><a href=\"/docs/concurrent-mode-patterns.html#splitting-high-and-low-priority-state\">Приоритетный рендеринг</a></td>\n<td align=\"left\">🚫</td>\n<td align=\"left\">🚫</td>\n<td align=\"left\">✅</td>\n</tr>\n<tr>\n<td align=\"left\"><a href=\"/docs/concurrent-mode-intro.html#interruptible-rendering\">Прерываемый предварительный рендеринг</a></td>\n<td align=\"left\">🚫</td>\n<td align=\"left\">🚫</td>\n<td align=\"left\">✅</td>\n</tr>\n<tr>\n<td align=\"left\"><a href=\"/docs/concurrent-mode-patterns.html#transitions\">useTransition</a></td>\n<td align=\"left\">🚫</td>\n<td align=\"left\">🚫</td>\n<td align=\"left\">✅</td>\n</tr>\n<tr>\n<td align=\"left\"><a href=\"/docs/concurrent-mode-patterns.html#deferring-a-value\">useDeferredValue</a></td>\n<td align=\"left\">🚫</td>\n<td align=\"left\">🚫</td>\n<td align=\"left\">✅</td>\n</tr>\n<tr>\n<td align=\"left\"><a href=\"/docs/concurrent-mode-patterns.html#suspense-reveal-train\">Периодические задержки типа «Train»</a></td>\n<td align=\"left\">🚫</td>\n<td align=\"left\">🚫</td>\n<td align=\"left\">✅</td>\n</tr>\n</tbody>\n</table>\n</div>\n<p>*: Старый режим имеет автоматический пакетный рендеринг для обрабатываемых React событий, но он ограничен одним потоком браузера. Не React-события должны быть обработаны через <code class=\"gatsby-code-text\">unstable_batchedUpdates</code>. В блокирующем и конкурентном режимах все вызовы <code class=\"gatsby-code-text\">setState</code> группируются для пакетного рендеринга по-умолчанию.</p>\n<p>**: Предупреждения в режиме разработки.</p>","frontmatter":{"title":"Использование конкурентного режима (экспериментально)","next":"concurrent-mode-reference.html","prev":"concurrent-mode-patterns.html"},"fields":{"path":"content/docs/concurrent-mode-adoption.md","slug":"docs/concurrent-mode-adoption.html"}}},"pageContext":{"slug":"docs/concurrent-mode-adoption.html"}},"staticQueryHashes":[]}