{"componentChunkName":"component---src-templates-docs-js","path":"/docs/optimizing-performance.html","result":{"data":{"markdownRemark":{"html":"<p>React за лаштунками використовує кілька розумних підходів для мінімізації кількості вартісних DOM-операцій, необхідних для оновлення користувацького інтерфейсу. Для більшості додатків, використання React дозволить мати швидкий інтерфейс без докладання особливих зусиль для оптимізації продуктивності. Не дивлячись на це, існує кілька шляхів для прискорення швидкодії вашого React-додатку.</p>\n<h2 id=\"use-the-production-build\"><a href=\"#use-the-production-build\" 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>Якщо ви оцінюєте чи маєте проблеми зі швидкодією ваших React-додатків, впевніться в тому, що ви тестуєте мініфіковану продакшн-збірку.</p>\n<p>React включає багато корисних попереджень за замовчуванням. Вони є надзвичайно корисними при розробці, але в той самий час роблять React більшим та повільнішим. Саме тому ви маєте бути певними, що використовуєте продакшн-версію при розгортанні додатку.</p>\n<p>Якщо ви не впевнені у правильному налаштуванні процесу збірки, ви можете перевірити це, встановивши <a href=\"https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">інструменти розробника React для Chrome</a>. Якщо ви відвідаєте сайт на React у продакшн-режимі, іконка матиме темний фон:</p>\n\n  <a class=\"gatsby-resp-image-link\" href=\"/static/d0f767f80866431ccdec18f200ca58f1/0a47e/devtools-prod.png\" style=\"display: block\" target=\"_blank\" rel=\"noopener\">\n  \n  <span class=\"gatsby-resp-image-wrapper\" style=\"position: relative; display: block;  max-width: 600px; margin-left: auto; margin-right: auto;\">\n    <span class=\"gatsby-resp-image-background-image\" style=\"padding-bottom: 20.952380952380953%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAIAAAABPYjBAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAtElEQVQI142ISwqDMABEvf+Fumyh4C5p1ChtoUZj/EUEG/MxUbHppus+GObNBPu+O+fWP9jc5qzTxkghTpcriJOg73uttZJSKy2l7x/zN/OslBTvt/dpmayzq1utXVo+vHIShGGYJBhC+Lg/bxAlcYxxmqYYAID9D2CWZRFCKEJnehFGWLMopY7joJQGpCCM1U3TMMZITmqvrafzs++6qmL+4cNQVbTICee8bdqyLLU24zh+AGg72y61QftkAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;\">\n      <img class=\"gatsby-resp-image-image\" style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\" alt=\"React DevTools &#x43D;&#x430; &#x441;&#x430;&#x439;&#x442;&#x456;, &#x449;&#x43E; &#x432;&#x438;&#x43A;&#x43E;&#x440;&#x438;&#x441;&#x442;&#x43E;&#x432;&#x443;&#x454; &#x43F;&#x440;&#x43E;&#x434;&#x430;&#x43A;&#x448;&#x43D;-&#x432;&#x435;&#x440;&#x441;&#x456;&#x44E; React\" title src=\"/static/d0f767f80866431ccdec18f200ca58f1/0a47e/devtools-prod.png\" srcset=\"/static/d0f767f80866431ccdec18f200ca58f1/65ed1/devtools-prod.png 210w,\n/static/d0f767f80866431ccdec18f200ca58f1/d10fb/devtools-prod.png 420w,\n/static/d0f767f80866431ccdec18f200ca58f1/0a47e/devtools-prod.png 600w\" sizes=\"(max-width: 600px) 100vw, 600px\">\n    </span>\n  </span>\n  \n  </a>\n    \n<p>Якщо ви відвідаєте сайт, що використовує React у режимі розробки, то іконка матиме червоний фон:</p>\n\n  <a class=\"gatsby-resp-image-link\" href=\"/static/e434ce2f7e64f63e597edf03f4465694/0a47e/devtools-dev.png\" style=\"display: block\" target=\"_blank\" rel=\"noopener\">\n  \n  <span class=\"gatsby-resp-image-wrapper\" style=\"position: relative; display: block;  max-width: 600px; margin-left: auto; margin-right: auto;\">\n    <span class=\"gatsby-resp-image-background-image\" style=\"padding-bottom: 33.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAABYlAAAWJQFJUiTwAAABI0lEQVQY04WQ3XKCMBCFef+X6k2tkAIGRa1Ox5kOGiCAkt81gtINM73uudicTTaz324w/qfnn9Bi6u739nr9eX8rDvvAzLLWAlitNXqttFJq9to/WOsLAB7OPMfHNE3DOJqm7rsuSJKURITSLM/zMAw3m3WWZXEcRxFZpWmSovxJSPx9WHXNBcBJIWeQMbgwxmteMnY+nxl63vCm5byu8bKsGCs5523TFkXBWFVzXlXV6XQCgGEYAqSaCT2b0lIpibTaeGYAP5EUAiP4RAsh0HjyYXDOBYvFB11RhM2zr3BB42hN413yucvpcUOPOFG4XOJoOAAhZLfdK6mmWb7zvBvci9ES5A1kb2+duXVa9La/GiwFa6XE9gIB8cPr9cLo1+7cL+jygk7PcoV8AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;\">\n      <img class=\"gatsby-resp-image-image\" style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\" alt=\"React DevTools &#x43D;&#x430; &#x441;&#x430;&#x439;&#x442;&#x456;, &#x449;&#x43E; &#x432;&#x438;&#x43A;&#x43E;&#x440;&#x438;&#x441;&#x442;&#x43E;&#x432;&#x443;&#x454; &#x432;&#x435;&#x440;&#x441;&#x456;&#x44E; React &#x434;&#x43B;&#x44F; &#x440;&#x43E;&#x437;&#x440;&#x43E;&#x431;&#x43A;&#x438;\" title src=\"/static/e434ce2f7e64f63e597edf03f4465694/0a47e/devtools-dev.png\" srcset=\"/static/e434ce2f7e64f63e597edf03f4465694/65ed1/devtools-dev.png 210w,\n/static/e434ce2f7e64f63e597edf03f4465694/d10fb/devtools-dev.png 420w,\n/static/e434ce2f7e64f63e597edf03f4465694/0a47e/devtools-dev.png 600w\" sizes=\"(max-width: 600px) 100vw, 600px\">\n    </span>\n  </span>\n  \n  </a>\n    \n<p>Як правило ви маєте використовувати режим розробки під час роботи над додатком і продакшн-режим при його розгортанні.</p>\n<p>Нижче ви можете знайти інструкції по збірці вашого додатку для продакшну.</p>\n<h3 id=\"create-react-app\"><a href=\"#create-react-app\" 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>Create React App </h3>\n<p>Якщо ви використали <a href=\"https://github.com/facebookincubator/create-react-app\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Create React App</a> для створення проекту, запустіть:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"gatsby-code-text\"><code class=\"gatsby-code-text\">npm run build</code></pre></div>\n<p>Ця команда створить продакшн-збірку у папці <code class=\"gatsby-code-text\">build/</code> вашого додатку.</p>\n<p>Пам’ятайте, що це необхідно лише перед розгортанням на продакшн. Для звичайної розробки використовуйте <code class=\"gatsby-code-text\">npm start</code>.</p>\n<h3 id=\"single-file-builds\"><a href=\"#single-file-builds\" 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 та React DOM у вигляді окремих файлів:</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"gatsby-code-html\"><code class=\"gatsby-code-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>https://unpkg.com/react@16/umd/react.production.min.js<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token script\"></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>https://unpkg.com/react-dom@16/umd/react-dom.production.min.js<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token script\"></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p>Пам’ятайте, що для продакшну підходять тільки ті файли React, що закінчуються на <code class=\"gatsby-code-text\">.production.min.js</code>.</p>\n<h3 id=\"brunch\"><a href=\"#brunch\" 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>Brunch </h3>\n<p>Для найефективнішої продакшн-збірки з використанням Brunch, встановіть плагін <a href=\"https://github.com/brunch/terser-brunch\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">terser-brunch</code></a>:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"gatsby-code-text\"><code class=\"gatsby-code-text\"># Якщо ви користуєтесь npm\nnpm install --save-dev uglify-js-brunch\n\n# Якщо ви користуєтесь Yarn\nyarn add --dev uglify-js-brunch</code></pre></div>\n<p>Потім створіть продакшн-збірку, додавши прапорець <code class=\"gatsby-code-text\">-p</code> до команди <code class=\"gatsby-code-text\">build</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"gatsby-code-text\"><code class=\"gatsby-code-text\">brunch build -p</code></pre></div>\n<p>Пам’ятайте, що це потрібно робити лише для продакшн-збірок. Ви не повинні передавати прапорець <code class=\"gatsby-code-text\">-p</code> чи застосовувати цей плагін під час розробки, тому що це приховає корисні попередження від React та сповільнить процес збірки.</p>\n<h3 id=\"browserify\"><a href=\"#browserify\" 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>Browserify </h3>\n<p>Для найефективнішої продакшн-збірки з використанням Browserify, встановіть декілька плагінів:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"gatsby-code-text\"><code class=\"gatsby-code-text\"># Якщо ви користуєтесь npm\nnpm install --save-dev envify terser uglifyify\n\n# Якщо ви користуєтесь Yarn\nyarn add --dev envify terser uglifyify</code></pre></div>\n<p>Щоб створити продакшн-збірку, впевніться, що ви додали наступні перетворення <strong>(у представленому порядку)</strong>:</p>\n<ul>\n<li>Плагін <a href=\"https://github.com/hughsk/envify\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">envify</code></a> гарантує правильність встановленого середовища для збірки. Зробіть його глобальним (<code class=\"gatsby-code-text\">-g</code>).</li>\n<li>Плагін <a href=\"https://github.com/hughsk/uglifyify\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">uglifyify</code></a> видаляє необхідні для розробки імпорти. Зробіть його глобальним також (<code class=\"gatsby-code-text\">-g</code>).</li>\n<li>Нарешті, отримана збірка передається до <a href=\"https://github.com/terser-js/terser\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">terser</code></a> для мініфікації (<a href=\"https://github.com/hughsk/uglifyify#motivationusage\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">прочитайте навіщо</a>).</li>\n</ul>\n<p>Наприклад:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"gatsby-code-text\"><code class=\"gatsby-code-text\">browserify ./index.js \\\n  -g [ envify --NODE_ENV production ] \\\n  -g uglifyify \\\n  | terser --compress --mangle &gt; ./bundle.js</code></pre></div>\n<p>Пам’ятайте, що це потрібно робити лише для продакшн-збірок. Ви не повинні використовувати ці плагіни під час розробки, тому що це приховає корисні попередження від React та сповільнить процес збірки.</p>\n<h3 id=\"rollup\"><a href=\"#rollup\" 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>Rollup </h3>\n<p>Для найефективнішої продакшн-збірки з використанням Rollup, встановіть декілька плагінів:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"gatsby-code-bash\"><code class=\"gatsby-code-bash\"><span class=\"token comment\"># Якщо ви користуєтесь npm</span>\n<span class=\"token function\">npm</span> <span class=\"token function\">install</span> --save-dev rollup-plugin-commonjs rollup-plugin-replace rollup-plugin-terser\n\n<span class=\"token comment\"># Якщо ви користуєтесь Yarn</span>\n<span class=\"token function\">yarn</span> <span class=\"token function\">add</span> --dev rollup-plugin-commonjs rollup-plugin-replace rollup-plugin-terser</code></pre></div>\n<p>Щоб створити продакшн-збірку, впевніться, що ви додали наступні плагіни <strong>(у представленому порядку)</strong>:</p>\n<ul>\n<li>Плагін <a href=\"https://github.com/rollup/rollup-plugin-replace\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">replace</code></a> гарантує правильність встановленого середовища для збірки.</li>\n<li>Плагін <a href=\"https://github.com/rollup/rollup-plugin-commonjs\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">commonjs</code></a> надає підтримку CommonJS у Rollup.</li>\n<li>Плагін <a href=\"https://github.com/TrySound/rollup-plugin-terser\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">terser</code></a> стискає та мініфікує фінальну збірку.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\">plugins<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n  <span class=\"token comment\">// ...</span>\n  <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'rollup-plugin-replace'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    <span class=\"token string\">'process.env.NODE_ENV'</span><span class=\"token operator\">:</span> <span class=\"token constant\">JSON</span><span class=\"token punctuation\">.</span><span class=\"token function\">stringify</span><span class=\"token punctuation\">(</span><span class=\"token string\">'production'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n  <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'rollup-plugin-commonjs'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n  <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'rollup-plugin-terser'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n  <span class=\"token comment\">// ...</span>\n<span class=\"token punctuation\">]</span></code></pre></div>\n<p>Для більш повного зразку налаштування <a href=\"https://gist.github.com/Rich-Harris/cb14f4bc0670c47d00d191565be36bf0\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">перегляньте цей gist</a>.</p>\n<p>Пам’ятайте, що це потрібно робити лише для продакшн-збірок. Ви не повинні використовувати плагін <code class=\"gatsby-code-text\">terser</code> чи <code class=\"gatsby-code-text\">replace</code> із значенням <code class=\"gatsby-code-text\">&#39;production&#39;</code> під час розробки, тому що це приховає корисні попередження від React та сповільнить процес збірки.</p>\n<h3 id=\"webpack\"><a href=\"#webpack\" 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>webpack </h3>\n<blockquote>\n<p><strong>Примітка:</strong></p>\n<p>Якщо ви використовуєте Create React App, то використовуйте <a href=\"#create-react-app\">інструкції вище</a>.<br>\nЦей розділ потрібен, якщо ви самі налаштовуєте webpack.</p>\n</blockquote>\n<p>Webpack версії 4, або вище, за замовчуванням мінімізує ваш код у продакшн-режимі.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">const</span> TerserPlugin <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'terser-webpack-plugin'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nmodule<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  mode<span class=\"token operator\">:</span> <span class=\"token string\">'production'</span><span class=\"token punctuation\">,</span>\n  optimization<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    minimizer<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">TerserPlugin</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token comment\">/* additional options here */</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Ви можете дізнатися про це більше у <a href=\"https://webpack.js.org/guides/production/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">документації webpack</a>.</p>\n<p>Пам’ятайте, що це потрібно робити лише для продакшн-збірок. Ви не повинні використовувати <code class=\"gatsby-code-text\">UglifyJsPlugin</code> чи <code class=\"gatsby-code-text\">TerserPlugin</code> під час розробки, тому що це приховає корисні попередження від React та сповільнить процес збірки.</p>\n<h2 id=\"profiling-components-with-the-chrome-performance-tab\"><a href=\"#profiling-components-with-the-chrome-performance-tab\" 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>Профілювання компонентів з використанням вкладки Chrome “Performance” </h2>\n<p>У режимі <strong>розробки</strong>, ви можете візуалізувати процес монтування, оновлення і демонтування компонентів, використавши інструменти продуктивності у браузерах, що їх підтримують. Наприклад:</p>\n<center>\n  <a class=\"gatsby-resp-image-link\" href=\"/static/64d522b74fb585f1abada9801f85fa9d/1ac66/react-perf-chrome-timeline.png\" style=\"display: block\" target=\"_blank\" rel=\"noopener\">\n  \n  <span class=\"gatsby-resp-image-wrapper\" style=\"position: relative; display: block;  max-width: 651px; margin-left: auto; margin-right: auto;\">\n    <span class=\"gatsby-resp-image-background-image\" style=\"padding-bottom: 35.23809523809524%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAAAsSAAALEgHS3X78AAABYUlEQVQY022NeUsCURTF5yMG0aaZSgniMtqCEfQlgoowqCCoRDNIs+gfdVTMJa3JbdRyaROHyXJ0xuc47zVqC0Rw7uHec/lxsPeqmyJ0WT+e8xspwli+wp9ipnZ+QRJHzfP3y3RyPeXAMycm0oEXXeayx/zmXWIDliZhwXgmHzuQxQ+VKefcg0db9+kaQT1D6Gm/vu7V0gEzW7JVLxTF45Gya4wLyoSwvBOaAqFJEBrHel2+Gt1PnGqj9onIkTx3pqLcyrxbVfdrGsFZJowLbKlbcHK32+BmAyTXAGntkFZAboH0LgYhRBCKIAUYX9JmiO0pSLsm7pzJeNSVy2k6toKgAIcSOVFgYY+DQguKvJT34T4tGULP6R3KO0pTm48Rw8v1In23ytWcUg6//mhg6OtACBtuUrfkzdd44VzdqkXZSuijTIB6QuSYbxj+YH/hfiKNwPN0Vuy2ByUQoV/mX/gTU11epAmedTIAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;\">\n      <img class=\"gatsby-resp-image-image\" style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\" alt=\"React-&#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x43D;&#x435;&#x43D;&#x442;&#x438; &#x43D;&#x430; &#x433;&#x440;&#x430;&#x444;&#x456;&#x43A;&#x443; &#x447;&#x430;&#x441;&#x443; &#x432; Chrome\" title src=\"/static/64d522b74fb585f1abada9801f85fa9d/1ac66/react-perf-chrome-timeline.png\" srcset=\"/static/64d522b74fb585f1abada9801f85fa9d/65ed1/react-perf-chrome-timeline.png 210w,\n/static/64d522b74fb585f1abada9801f85fa9d/d10fb/react-perf-chrome-timeline.png 420w,\n/static/64d522b74fb585f1abada9801f85fa9d/1ac66/react-perf-chrome-timeline.png 651w\" sizes=\"(max-width: 651px) 100vw, 651px\">\n    </span>\n  </span>\n  \n  </a>\n    </center>\n<p>Щоб зробити це в Chrome:</p>\n<ol>\n<li>Тимчасово <strong>вимкніть всі розширення Chrome, особливо React DevTools</strong>. Вони можуть істотно спотворити резульати!</li>\n<li>Впевніться, що додаток запущений в режимі розробки.</li>\n<li>Відкрийте Chrome DevTools, оберіть вкладку <strong><a href=\"https://developers.google.com/web/tools/chrome-devtools/evaluate-performance/timeline-tool\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Performance</a></strong> та натисніть <strong>Record</strong>.</li>\n<li>Виконайте дії, які потрібно профілювати. Не записуйте більше 20 секунд, інакше Chrome може зависнути.</li>\n<li>Зупиніть запис.</li>\n<li>Події React будуть згруповані під міткою <strong>User Timing</strong>.</li>\n</ol>\n<p>Для більш детальних інструкцій перегляньте <a href=\"https://calibreapp.com/blog/react-performance-profiling-optimization\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">цю статтю Бена Шварца (Ben Schwarz)</a>.</p>\n<p>Зверніть увагу на те, <strong>що ці значення відносні і компоненти в продакшні будуть рендеритись швидше</strong>. Проте це допоможе вам зрозуміти, коли не пов’язані між собою частини інтерфейсу оновлюються через помилку та як глибоко і часто ці оновлення вібдуваються.</p>\n<p>Наразі Chrome, Edge та IE є єдиними браузерами, котрі підтримують цю функціональність, але ми використовуємо стандарт <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/User_Timing_API\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">User Timing API</a>, а тому очікуємо, що більше браузерів додадуть її підтримку.</p>\n<h2 id=\"profiling-components-with-the-devtools-profiler\"><a href=\"#profiling-components-with-the-devtools-profiler\" 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>Профілювання компонентів з профайлером DevTools </h2>\n<p><code class=\"gatsby-code-text\">react-dom</code> 16.5+ та <code class=\"gatsby-code-text\">react-native</code> 0.57+ надають додаткові можливості профілювання в режимі розробки з використанням профайлера React DevTools.\nОгляд профайлера можна знайти в пості блогу <a href=\"/blog/2018/09/10/introducing-the-react-profiler.html\">“Знайомство з React Profiler”</a>.\nВідео-посібник також <a href=\"https://www.youtube.com/watch?v=nySib7ipZdk\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">доступний на YouTube</a>.</p>\n<p>Якщо ви ще не встановили React DevTools, ви можете знайти їх тут:</p>\n<ul>\n<li><a href=\"https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?hl=en\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Розширення браузера Chrome</a></li>\n<li><a href=\"https://addons.mozilla.org/en-GB/firefox/addon/react-devtools/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Розширення браузера Firefox</a></li>\n<li><a href=\"https://www.npmjs.com/package/react-devtools\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Окремий пакунок Node</a></li>\n</ul>\n<blockquote>\n<p>Примітка</p>\n<p>Продакшн-збірка профілювання для <code class=\"gatsby-code-text\">react-dom</code> також доступна як <code class=\"gatsby-code-text\">react-dom/profiling</code>.\nДокладніше про її використання ви можете дізнатись за посиланням <a href=\"https://fb.me/react-profiling\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">fb.me/react-profiling</a></p>\n</blockquote>\n<h2 id=\"virtualize-long-lists\"><a href=\"#virtualize-long-lists\" 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>Якщо ваш додаток рендерить довгі списки даних (сотні чи тисячі рядків), ми радимо використовувати підхід під назвою “віконний доступ”. Цей підхід рендерить лише невелику підмножину ваших рядків у будь-який момент часу і може значно зменшити час, потрібний для повторного рендеру компонентів та кількість створених DOM-вузлів.</p>\n<p><a href=\"https://react-window.now.sh/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">react-window</a> та <a href=\"https://bvaughn.github.io/react-virtualized/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">react-virtualized</a> — це популярні бібліотеки для віконного доступу. Вони надають кілька компонентів для відображення списків, сіток та табличних даних. Якщо ваш додаток потребує іншого підходу, то ви можете створити власний компонент для віконного доступу, як це зроблено в <a href=\"https://medium.com/@paularmstrong/twitter-lite-and-high-performance-react-progressive-web-apps-at-scale-d28a00e780a3\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Twitter</a>.</p>\n<h2 id=\"avoid-reconciliation\"><a href=\"#avoid-reconciliation\" 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>React створює і підтримує внутрішній стан відображуваного користувацького інтерфейсу. Він також включає React-елементи, які ви повертаєте з ваших компонентів. Це дозволяє React уникати створення нових DOM-вузлів та доступу до вже існуючих без необхідності, тому що ці операції можуть бути повільнішими за операції зі звичайними JavaScript-об’єктами. Іноді цей стан називають “віртуальний DOM”, але в React Native він працює так само.</p>\n<p>Коли пропси чи стан компонента змінюються, React вирішує чи необхідне оновлення DOM, порівнюючи новий повернутий елемент з вже відрендереним. Якщо вони не рівні, то React оновить DOM.</p>\n<p>Незважаючи на те, що React оновлює тільки змінені вузли DOM, повторний рендер все ж займає певний час. У більшості випадків це не проблема, але якщо ви помітите, що швидкодія зменшиться, то ви можете прискорити все, перевизначивши метод життєвого циклу <code class=\"gatsby-code-text\">shouldComponentUpdate</code>, котрий викликається перед початком процесу повторного рендерингу. За замовчуванням, реалізація цієї функції повертає <code class=\"gatsby-code-text\">true</code>, змушуючи React здійснити оновлення:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token function\">shouldComponentUpdate</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">nextProps<span class=\"token punctuation\">,</span> nextState</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Якщо ви знаєте, що в певних ситуаціях ваш компонент не повинен оновлюватись, то ви можете повернути <code class=\"gatsby-code-text\">false</code> з <code class=\"gatsby-code-text\">shouldComponentUpdate</code>, щоб пропустити весь процес рендерингу, включно з викликом <code class=\"gatsby-code-text\">render()</code> поточного компонента та компонентів нижче.</p>\n<p>У більшості випадків, замість написання <code class=\"gatsby-code-text\">shouldComponentUpdate()</code> вручну, ви можете наслідуватись від <a href=\"/docs/react-api.html#reactpurecomponent\"><code class=\"gatsby-code-text\">React.PureComponent</code></a>. Це еквівалентно реалізації <code class=\"gatsby-code-text\">shouldComponentUpdate()</code> з поверховим порівнянням поточних та попередніч пропсів та стану.</p>\n<h2 id=\"shouldcomponentupdate-in-action\"><a href=\"#shouldcomponentupdate-in-action\" 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>shouldComponentUpdate в дії </h2>\n<p>На рисунку зображено піддерево компонентів. Для кожного з них <code class=\"gatsby-code-text\">SCU</code> позначає значення, повернуте <code class=\"gatsby-code-text\">shouldComponentUpdate</code>, і <code class=\"gatsby-code-text\">vDOMEq</code> позначає чи були відрендерені React-елементи рівними. Нарешті, колір кола позначає те, чи має компонент бути узгодженим, чи ні.</p>\n<figure>\n  <a class=\"gatsby-resp-image-link\" href=\"/static/5ee1bdf4779af06072a17b7a0654f6db/cd039/should-component-update.png\" style=\"display: block\" target=\"_blank\" rel=\"noopener\">\n  \n  <span class=\"gatsby-resp-image-wrapper\" style=\"position: relative; display: block;  max-width: 555px; margin-left: auto; margin-right: auto;\">\n    <span class=\"gatsby-resp-image-background-image\" style=\"padding-bottom: 66.66666666666666%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAACcklEQVQ4y2Ow8jZgAIHgXDcGHn5OMPv///9g+lhdTerB9CTv3QwMsu+U1dhAYqUMTAzpToYM9j0MDF5JAmB1Ti0MmODU/y2MUIOYgZhDgIuLDS5pbA0SYwNaxwS2cPNOxv8MnQw3oNIgXYeRDYO5CATYZUTZgRQjiP1tQi/T/yWzGEGyQEFmPk4ODiCTBUUvussmzO0Fa55/eMrMtRMKY6A2MNQAqZmT+sHcipBwhv97N4DVHaqq1Dzb3bZ6drCUzREGBlGQ2JQ6X4akeAaGbo/HDAwTj+aCFS44PCFg+7ZJWiB29/8rjDCbJ1TOQnHF5NBAiR2VZcnr5VUUdzAwCKO4rpIBN+jf1YYuxMoQzseOIqIixQIWB4L1uZBgYlhwYNLyVcfnOoJds7mCc+GByavXnV6kDeIfXj4FHF5Xurvbt9dktPcyMEisXdqgv/TAlI3XncxUQHIzdvWazd3bu1G1gUkXGE6CDEtPTvLacn65AkiS9xwDw/KTU33Wn1gkBuKfXTENHKs3u9ut7ze1mPwGxv7y7jix1Wdn+h6LCeMFyS07P0F4xanpfgzVHMJAA0WxxjQyuNbewMhACth4f/nClnm1xkAmPw8ft5iwuKA4KxurBJDPB1NTFyXH2RzJriTHwCDIyMwkJSIuKMHMyCgOlJLi5ObgATsmmIkRnDROHpi/cNOqKeDYlZWR4AIlYFDChiZwiIHaDKxRngz6zMUMIENYmFjB8pxQdWywiAGDD5Onrt1aV28CcpEANzdIgwgQiyH7IseKgbnalMGs3IDBEBTULEzg5CIKxeLIvmFgeN7IiCv8/iPRQMz8H5r18AEAM723cnu0lYoAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;\">\n      <img class=\"gatsby-resp-image-image\" style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\" alt=\"should component update\" title src=\"/static/5ee1bdf4779af06072a17b7a0654f6db/cd039/should-component-update.png\" srcset=\"/static/5ee1bdf4779af06072a17b7a0654f6db/65ed1/should-component-update.png 210w,\n/static/5ee1bdf4779af06072a17b7a0654f6db/d10fb/should-component-update.png 420w,\n/static/5ee1bdf4779af06072a17b7a0654f6db/cd039/should-component-update.png 555w\" sizes=\"(max-width: 555px) 100vw, 555px\">\n    </span>\n  </span>\n  \n  </a>\n    </figure>\n<p>Оскільки <code class=\"gatsby-code-text\">shouldComponentUpdate</code> повернув <code class=\"gatsby-code-text\">false</code> для піддерева з коренем в C2, React не буде намагатися відрендерити C2 і навіть викликати <code class=\"gatsby-code-text\">shouldComponentUpdate</code> для C4 і C5.</p>\n<p>Для C1 і C3 <code class=\"gatsby-code-text\">shouldComponentUpdate</code> повернув <code class=\"gatsby-code-text\">true</code>, тому React має перейти вниз до листів дерева і перевірити їх. Для C6 <code class=\"gatsby-code-text\">shouldComponentUpdate</code> повернув <code class=\"gatsby-code-text\">true</code> і, оскільки значення відрендерених елементів не було еквівалентним, React має оновити DOM.</p>\n<p>Останнім цікавим випадком є C8. React має відрендерити цей компонент, але оскільки повернуті React-елементи були рівні попереднім, то DOM не буде оновлений.</p>\n<p>Зверніть увагу на те, що React повинен був здійснити зміну DOM лише для C6, що було неминучим. Для C8 він уникнув змін завдяки порівнянню відрендерених React-елементів, а для піддерева C2 та C7 не потрібно було навіть виконувати це порівняння, оскільки процес рендерингу зупинився у методі <code class=\"gatsby-code-text\">shouldComponentUpdate</code> і метод <code class=\"gatsby-code-text\">render</code> не був викликаний.</p>\n<h2 id=\"examples\"><a href=\"#examples\" 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>Якщо ваш компонент має змінюватись лише тоді, коли змінюються змінні <code class=\"gatsby-code-text\">props.color</code> чи <code class=\"gatsby-code-text\">state.count</code>, ви можете виконати цю перевірку в <code class=\"gatsby-code-text\">shouldComponentUpdate</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">CounterButton</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">React<span class=\"token punctuation\">.</span>Component</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">props</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">super</span><span class=\"token punctuation\">(</span>props<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>state <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>count<span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">shouldComponentUpdate</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">nextProps<span class=\"token punctuation\">,</span> nextState</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">.</span>color <span class=\"token operator\">!==</span> nextProps<span class=\"token punctuation\">.</span>color<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>state<span class=\"token punctuation\">.</span>count <span class=\"token operator\">!==</span> nextState<span class=\"token punctuation\">.</span>count<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">return</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>button</span>\n        <span class=\"token attr-name\">color</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">.</span>color<span class=\"token punctuation\">}</span></span>\n        <span class=\"token attr-name\">onClick</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">setState</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">state</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>count<span class=\"token operator\">:</span> state<span class=\"token punctuation\">.</span>count <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        Рахунок: </span><span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>state<span class=\"token punctuation\">.</span>count<span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>button</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>У цьому коді <code class=\"gatsby-code-text\">shouldComponentUpdate</code> лише перевіряє наявні зміни в <code class=\"gatsby-code-text\">props.color</code> чи <code class=\"gatsby-code-text\">state.count</code>. Якщо ці значення не змінились, то компонент не оновиться. Якщо ваш компонент буде більш складним, ви можете використати схожий шаблон і зробити “поверхове порівняння” всіх полей <code class=\"gatsby-code-text\">props</code> і <code class=\"gatsby-code-text\">state</code>, щоб визначити, чи має компонент оновитись. Цей шаблон трапляється часто, а тому React надає допоміжну функцію для цієї логіки — просто унаслідуйтесь від <code class=\"gatsby-code-text\">React.PureComponent</code>. Наступний код показує простіший шлях для досягнення цього ефекту:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">CounterButton</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">React<span class=\"token punctuation\">.</span>PureComponent</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">props</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">super</span><span class=\"token punctuation\">(</span>props<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>state <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>count<span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>button</span>\n        <span class=\"token attr-name\">color</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">.</span>color<span class=\"token punctuation\">}</span></span>\n        <span class=\"token attr-name\">onClick</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">setState</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">state</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>count<span class=\"token operator\">:</span> state<span class=\"token punctuation\">.</span>count <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        Рахунок: </span><span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>state<span class=\"token punctuation\">.</span>count<span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>button</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>У більшості випадків ви можете використовувати <code class=\"gatsby-code-text\">React.PureComponent</code> замість написання власного методу <code class=\"gatsby-code-text\">shouldComponentUpdate</code>. Він робить лише поверхове порівняння, а тому ви не можете використати його, якщо пропси чи стан можуть змінитись таким чином, що поверхове порівняння пропустить цю зміну.</p>\n<p>Це може бути проблемою для більш складних структур даних. Наприклад, ви хочете, щоб компонент <code class=\"gatsby-code-text\">ListOfWords</code> рендерив список слів розділених комами з батьківським компонентом <code class=\"gatsby-code-text\">WordAdder</code>, що дає можливість натиснути на кнопку і додати слово в список. Цей код працює <em>неправильно</em>:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">ListOfWords</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">React<span class=\"token punctuation\">.</span>PureComponent</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">.</span>words<span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">','</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">WordAdder</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">React<span class=\"token punctuation\">.</span>Component</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">props</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">super</span><span class=\"token punctuation\">(</span>props<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>state <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n      words<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'марклар'</span><span class=\"token punctuation\">]</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>handleClick <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">handleClick</span><span class=\"token punctuation\">.</span><span class=\"token function\">bind</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">handleClick</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// Даний метод є поганим стилем і спричиняє помилку</span>\n    <span class=\"token keyword\">const</span> words <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>state<span class=\"token punctuation\">.</span>words<span class=\"token punctuation\">;</span>\n    words<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token string\">'марклар'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">setState</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>words<span class=\"token operator\">:</span> words<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>button</span> <span class=\"token attr-name\">onClick</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>handleClick<span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">ListOfWords</span></span> <span class=\"token attr-name\">words</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>state<span class=\"token punctuation\">.</span>words<span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Проблема в тому, що <code class=\"gatsby-code-text\">PureComponent</code> зробить просте порівняння старого значення <code class=\"gatsby-code-text\">this.props.words</code> з новим. Оскільки цей код змінює масив <code class=\"gatsby-code-text\">words</code> у методі <code class=\"gatsby-code-text\">handleClick</code> класу <code class=\"gatsby-code-text\">WordAdder</code>, то нове та старе значення <code class=\"gatsby-code-text\">this.props.words</code> будуть вважатися однаковими як посилання, хоча вміст масиву і змінився. <code class=\"gatsby-code-text\">ListOfWords</code> не оновиться, хоч він і містить нові слова, що мають бути відрендерені.</p>\n<h2 id=\"the-power-of-not-mutating-data\"><a href=\"#the-power-of-not-mutating-data\" 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>Найпростішим шляхом уникнення цієї проблеми є уникнення зміни значень, які ви використовуєте як пропси чи стан. Наприклад, метод <code class=\"gatsby-code-text\">handleClick</code> вище, міг би бути переписаний з використанням <code class=\"gatsby-code-text\">concat</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token function\">handleClick</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">setState</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">state</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    words<span class=\"token operator\">:</span> state<span class=\"token punctuation\">.</span>words<span class=\"token punctuation\">.</span><span class=\"token function\">concat</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token string\">'марклар'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>ES6 підтримує <a href=\"https://developer.mozilla.org/uk/docs/Web/JavaScript/Reference/Operators/%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80_%D1%80%D0%BE%D0%B7%D0%BF%D0%B0%D0%BA%D1%83%D0%B2%D0%B0%D0%BD%D0%BD%D1%8F\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">синтаксис розпакування</a> для масивів, щоб спростити цю задачу. Якщо ви використовуєте Create React App, цей синтаксис доступний за замовчуванням.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token function\">handleClick</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">setState</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">state</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    words<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token operator\">...</span>state<span class=\"token punctuation\">.</span>words<span class=\"token punctuation\">,</span> <span class=\"token string\">'марклар'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Ви також можете подібним чином переписати код, що змінює об’єкти. Наприклад, у нас є об’єкт <code class=\"gatsby-code-text\">colormap</code> і ми хочемо написати функцію, що змінить <code class=\"gatsby-code-text\">colormap.right</code> на <code class=\"gatsby-code-text\">&#39;blue&#39;</code>. Ми могли б написати:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">function</span> <span class=\"token function\">updateColorMap</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">colormap</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  colormap<span class=\"token punctuation\">.</span>right <span class=\"token operator\">=</span> <span class=\"token string\">'blue'</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Щоб переписати це без зміни оригінального об’єкта, ми можемо використати метод <a href=\"https://developer.mozilla.org/uk/docs/Web/JavaScript/Reference/Global_Objects/Object/assign\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Object.assign</a>:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">function</span> <span class=\"token function\">updateColorMap</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">colormap</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> Object<span class=\"token punctuation\">.</span><span class=\"token function\">assign</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> colormap<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>right<span class=\"token operator\">:</span> <span class=\"token string\">'blue'</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p><code class=\"gatsby-code-text\">updateColorMap</code> тепер повертає новий об’єкт, а не змінює старий. <code class=\"gatsby-code-text\">Object.assign</code> — це ES6 і для його роботи потрібен поліфіл.</p>\n<p><a href=\"https://developer.mozilla.org/uk/docs/Web/JavaScript/Reference/Operators/Spread_syntax\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Оператор розкладу</a> дозволяє оновлювати об’єкти, не мутуючи їх:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">function</span> <span class=\"token function\">updateColorMap</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">colormap</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span><span class=\"token operator\">...</span>colormap<span class=\"token punctuation\">,</span> right<span class=\"token operator\">:</span> <span class=\"token string\">'blue'</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Ця функція була додана до JavaScript у ES2018. </p>\n<p>Якщо ви використовуєте Create React App, то <code class=\"gatsby-code-text\">Object.assign</code> та розпакування об’єктів доступні за замовчуванням.</p>\n<p>Коли ви працюєте з глибоко вкладеними об’єктами, то постійне іх оновлення може заплутати вас. Якщо ви зіткнулися з такою проблемою, зверніть увагу на <a href=\"https://github.com/mweststrate/immer\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Immer</a> або <a href=\"https://github.com/kolodny/immutability-helper\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">immutability-helper</a>. Ці бібліотеки допомогають писати читабельний код, не втрачаючи переваг незмінності.</p>","frontmatter":{"title":"Оптимізація продуктивності","next":null,"prev":null},"fields":{"path":"content/docs/optimizing-performance.md","slug":"docs/optimizing-performance.html"}}},"pageContext":{"slug":"docs/optimizing-performance.html"}},"staticQueryHashes":[]}