{"componentChunkName":"component---src-templates-docs-js","path":"/docs/optimizing-performance.html","result":{"data":{"markdownRemark":{"html":"<p>Internamente, o React usa diversas técnicas inteligentes para minimizar o número de operações custosas de DOM que são necessárias para alterar a UI. Para muitas aplicações, utilizar React fará com que elas tenham uma rápida interface sem fazer muito esforço para otimizar performance. No entanto, existem diversas maneiras para acelerar sua aplicação 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>Use a build de produção </h2>\n<p>Se você está fazendo benchmarking ou tendo problemas de performance em suas aplicações React, tenha certeza que você está testando com a build de produção.</p>\n<p>Por padrão, o React inclui diversos avisos úteis. Esses avisos são muito úteis em desenvolvimento. Contudo, eles tornam o React maior e mais lento, então você precisa ter certeza que está usando a versão de produção quando faz a publicação de seu app.</p>\n<p>Se você não tem certeza se seu processo de build está configurado corretamente, você pode verificar instalando a extensão <a href=\"https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">React Developer Tools para o Chrome</a>. Se você visitar um site que usa React em produção, o ícone terá uma cor de fundo escura:</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 em um site com a vers&#xE3;o de produ&#xE7;&#xE3;o do 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>Se você visitar um site com React em modo de desenvolvimento, o ícone terá um fundo vermelho:</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 em um site com a vers&#xE3;o de desenvolvimento do React\" 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>É esperado que você use o modo de desenvolvimento enquanto trabalha em seu app, e o modo de produção quando publicar ele para os usuários.</p>\n<p>Você irá encontrar instruções para construir seu app para produção abaixo.</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>Criando um app React (Create React App) </h3>\n<p>Se seu projeto é construído com <a href=\"https://github.com/facebookincubator/create-react-app\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Create React App</a>, execute:</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>Isto irá criar uma build de produção para seu app na pasta <code class=\"gatsby-code-text\">build/</code> de seu projeto.</p>\n<p>Lembre que isto é somente necessário antes de publicar para produção. Para desenvolvimento normal, use <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>Builds de único arquivo </h3>\n<p>Nós oferecemos versões de produção prontas do React e React DOM com arquivos únicos:</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@17/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@17/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>Lembre que somente arquivos React terminados com <code class=\"gatsby-code-text\">.production.min.js</code> são adequados para produção.</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>Para uma build de produção do Brunch mais eficiente, instale o plugin <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\"># Se você usa npm\nnpm install --save-dev terser-brunch\n\n# Se você usa Yarn\nyarn add --dev terser-brunch</code></pre></div>\n<p>Então, para criar uma build de produção, adicione o argumento <code class=\"gatsby-code-text\">-p</code> no comando <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>Lembre que você somente precisa fazer isso para builds de produção. Você não deve passar o argumento <code class=\"gatsby-code-text\">-p</code> ou aplicar esse plugin em desenvolvimento, porque ele irá esconder avisos úteis do React e fará as builds mais lentas.</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>Para uma build de produção do Browserify mais eficiente, instale alguns plugins:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"gatsby-code-text\"><code class=\"gatsby-code-text\"># Se você usa npm\nnpm install --save-dev envify terser uglifyify\n\n# Se você usa Yarn\nyarn add --dev envify terser uglifyify</code></pre></div>\n<p>Para criar uma build de produção, tenha certeza que você adicionou esses transforms <strong>(a ordem faz diferença):</strong></p>\n<ul>\n<li>O <a href=\"https://github.com/hughsk/envify\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">envify</code></a> assegura que o ambiente que a build está configurado é o correto. Torne ele global (<code class=\"gatsby-code-text\">-g</code>).</li>\n<li>O <a href=\"https://github.com/hughsk/uglifyify\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">uglifyify</code></a> remove os imports de desenvolvimento. Torna ele global também (<code class=\"gatsby-code-text\">-g</code>).</li>\n<li>Finalmente, o bundle gerado é enviado para o <a href=\"https://github.com/terser-js/terser\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">terser</code></a> para enxutar (<a href=\"https://github.com/hughsk/uglifyify#motivationusage\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">entenda o porquê</a>).</li>\n</ul>\n<p>Por exemplo:</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>Lembre que você somente precisar fazer isso para builds de produção. Você não deve aplicar esses plugins em desenvolvimento porque eles vão esconder avisos úteis do React, e farão as builds mais lentas.</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>Para uma build de produção do Rollup mais eficiente, instale alguns plugins:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"gatsby-code-bash\"><code class=\"gatsby-code-bash\"><span class=\"token comment\"># Se você usa 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\"># Se você usa 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>Para criar uma build de produção, tenha certeza que você adicionou esses plugins, <strong>(a ordem faz diferença)</strong></p>\n<ul>\n<li>O <a href=\"https://github.com/rollup/rollup-plugin-replace\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">replace</code></a> assegura que o ambiente em que a build está configurado é o correto.</li>\n<li>O <a href=\"https://github.com/rollup/rollup-plugin-commonjs\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">commonjs</code></a> fornece suporte para CommonJS no Rollup.</li>\n<li>O <a href=\"https://github.com/TrySound/rollup-plugin-terser\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">terser</code></a> comprime e enxuta o bundle final.</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>Para um exemplo completo de setup <a href=\"https://gist.github.com/Rich-Harris/cb14f4bc0670c47d00d191565be36bf0\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">veja esse gist</a>.</p>\n<p>Lembre que você somente precisa fazer isso para builds de produção. Você não deve aplicar o <code class=\"gatsby-code-text\">terser</code> ou o <code class=\"gatsby-code-text\">replace</code> com o valor de <code class=\"gatsby-code-text\">&#39;production&#39;</code>em desenvolvimento porque eles vão esconder avisos úteis do React, e farão as builds mais lentas.</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>Observação:</strong></p>\n<p>Se você está usando Create React App, por favor siga <a href=\"#create-react-app\">as instruções acima</a>.<br>\nEsta seção é somente relevante se você configura o webpack diretamente.</p>\n</blockquote>\n<p>O Webpack v4+ irá diminuir seu código por padrão no modo de produção.</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\">/* opções adicionais aqui */</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>Você pode aprender mais sobre isso na <a href=\"https://webpack.js.org/guides/production/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">documentação do webpack</a>.</p>\n<p>Lembre que você somente precisa fazer isso para builds de produção. Você não deve aplicar <code class=\"gatsby-code-text\">TerserPlugin</code> em desenvolvimento porque ele vai esconder avisos úteis do React, e farão as builds mais lentas.</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>Analisando componentes com o Chrome Performance Tab </h2>\n<p>Em modo de <strong>desenvolvimento</strong>, você pode visualizar como os componentes são montados (mount), alterados (update), and desmontados (unmount), usando as ferramentas de performance nos browsers suportados. Por exemplo:</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=\"Componentes do React na linha do tempo do 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>Para fazer isso no Chrome:</p>\n<ol>\n<li>Temporariamente <strong>desabilite todas as extensões do Chrome, especialmente React DevTools</strong>. Elas podem significativamente enviesar os resultados!</li>\n<li>Tenha certeza que você está rodando sua aplicação no modo de desenvolvimento.</li>\n<li>Abra o Chrome DevTools a aba <strong><a href=\"https://developers.google.com/web/tools/chrome-devtools/evaluate-performance/timeline-tool\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Performance</a></strong> a pressione <strong>Record</strong>.</li>\n<li>Faça as ações que você quer analisar. Não grave mais que 20 segundos ou o Chrome pode travar.</li>\n<li>Pare de gravar.</li>\n<li>Eventos do React serão agrupados sob a label <strong>User Timing</strong>.</li>\n</ol>\n<p>Para mais detalhes do passo a passo, veja <a href=\"https://calibreapp.com/blog/react-performance-profiling-optimization\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">esse artigo do Ben Schwarz</a>.</p>\n<p>Perceba que <strong>os números são relativos para que os componentes renderizem mais rápido em produção</strong>. Ainda, isto deve ajudar você a perceber quando algo não relacionados da UI são alteradas, a quão profundo e frequente suas alterações de UI acontecem.</p>\n<p>Atualmente Chrome, Edge e IE são os únicos browsers que suportam essa feature, mas nós usamos um padrão <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/User_Timing_API\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">User Timing API</a> então esperamos que mais navegadores deem suporte.</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>Analisando componentes com o DevTools Profiler </h2>\n<p><code class=\"gatsby-code-text\">react-dom</code> 16.5+ e <code class=\"gatsby-code-text\">react-native</code> 0.57+ fornecem melhorias nas capacidades de analise em modo de desenvolvimento com o React DevTools Profiler.</p>\n<p>Uma visão geral do Profiler pode ser encontrada nesse artigo <a href=\"/blog/2018/09/10/introducing-the-react-profiler.html\">“Introducing the React Profiler”</a>.\nUm vídeo com o passo a passo do profiler também está <a href=\"https://www.youtube.com/watch?v=nySib7ipZdk\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">disponível no YouTube</a>.</p>\n<p>Se você ainda não tem o React DevTools instalado, você pode encontrá-lo aqui:</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\">Extensão para Chrome</a></li>\n<li><a href=\"https://addons.mozilla.org/en-GB/firefox/addon/react-devtools/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Extensão para Firefox</a></li>\n<li><a href=\"https://www.npmjs.com/package/react-devtools\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Pacote separado</a></li>\n</ul>\n<blockquote>\n<p>Observação</p>\n<p>Uma analise de uma build de produção do <code class=\"gatsby-code-text\">react-dom</code> está disponível como <code class=\"gatsby-code-text\">react-dom/profiling</code>.\nLeia mais sobre como usar esse pacote no <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>Virtualizando Longas Listas </h2>\n<p>Se sua aplicação renderiza longas listas de informação (milhares ou centenas de linhas), nós recomendamos usar uma técnica conhecida como “windowing”. Esta técnica somente renderiza um pequeno conjunto de suas linhas e pode reduzir drasticamente o tempo que ele leva para re-renderizar os componentes bem como o número de nós criados no DOM.</p>\n<p><a href=\"https://react-window.now.sh/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">react-window</a> e <a href=\"https://bvaughn.github.io/react-virtualized/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">react-virtualized</a> são as bibliotecas de windowing mais populares. Eles fornecem diversos componentes reutilizáveis para exibir listas, grids e informações tabulares. Você pode também pode criar seu próprio componente de windowing, como <a href=\"https://medium.com/@paularmstrong/twitter-lite-and-high-performance-react-progressive-web-apps-at-scale-d28a00e780a3\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">o Twitter fez</a>, se você quer algo mais específico para sua aplicacão.</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>Evite recompilação </h2>\n<p>O React cria e mantém sua representação interna da UI renderizada. Ele inclui os elementos do React que você retorna dos seus componentes. Essa representação evita que o React crie nós no DOM e acesse os existes sem necessidade, além do que essas operações podem ser mais lentas do que operações em objetos JavaScript. Algumas vezes esse processo é referenciado como “virtual DOM”, mas ele funciona da mesma forma no React Native.</p>\n<p>Quando uma propriedade ou estado de um componente é alterado, o React decide se uma atualização do DOM atual é necessária comparando o novo elemento retornado com o antigo. Quando eles não forem iguais, o React irá alterar o DOM.</p>\n<p>Embora o React somente altere os nós de DOM alterados, o re-rendering ainda leva algum tempo. Em muitos casos isso não é um problema, mas se a lentidão é perceptível, você pode aumentar velocidade dele sobrescrevendo a função de lifecycle <code class=\"gatsby-code-text\">shouldComponentUpdate</code>, na qual é chamada antes do processo de re-rendering começar. A implementação padrão dessa função retorna <code class=\"gatsby-code-text\">true</code>, deixando o React performar a alteração:</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>Se você sabe que em algumas situações seu componente não precisa ser alterado, você pode retornar <code class=\"gatsby-code-text\">false</code> no <code class=\"gatsby-code-text\">shouldComponentUpdate</code> ao invés, para pular o todo o processo de renderização, incluindo a chamada de <code class=\"gatsby-code-text\">render()</code> nesse componente e seus filhos:</p>\n<p>Na maioria dos casos, ao invés de escrever <code class=\"gatsby-code-text\">shouldComponentUpdate()</code> na mão, você pode herdar do <a href=\"/docs/react-api.html#reactpurecomponent\"><code class=\"gatsby-code-text\">React.PureComponent</code></a>. Ele equivale a implementação do <code class=\"gatsby-code-text\">shouldComponentUpdate()</code> com uma comparação rasa entre as anteriores e novas propriedades e estados </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 em Ação </h2>\n<p>Abaixo podemos ver uma sub-árvore de componentes. Para cada uma, <code class=\"gatsby-code-text\">SCU</code> define o que o <code class=\"gatsby-code-text\">shouldComponentUpdate</code> retorna, e <code class=\"gatsby-code-text\">vDOMEq</code> indica se os elementos renderizados pelo React são equivalentes. Finalmente, o círculo de cores indica se o componente tinha de ser reconciliado ou não.</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>Já que <code class=\"gatsby-code-text\">shouldComponentUpdate</code> retornou <code class=\"gatsby-code-text\">false</code> na sub-árvore iniciada no C2, React não tentou renderizar C2, e por consequência não invocou <code class=\"gatsby-code-text\">shouldComponentUpdate</code> no C4 e C5.</p>\n<p>Para C1 e C3, <code class=\"gatsby-code-text\">shouldComponentUpdate</code> retornou <code class=\"gatsby-code-text\">true</code>, então o React teve que descer até as folhas para checá-los. Para o C6 <code class=\"gatsby-code-text\">shouldComponentUpdate</code> retornou <code class=\"gatsby-code-text\">true</code>, e já que os elementos renderizados não são iguais, o React teve que alterar o DOM.</p>\n<p>O último caso interessante é o C8. React teve que renderizar este componente, mas já que os elementos que ele retornou eram iguais aos previamente renderizados, ele não teve que alterar o DOM. </p>\n<p>Note que o React somente teve de fazer mutações no DOM para o C6, no qual era inevitável. Para C8, ele abortou comparando os elementos React renderizados, e para a sub-árvore do C2 e C7, ele nem mesmo teve que comparar os elementos pois abortou no <code class=\"gatsby-code-text\">shouldComponentUpdate</code>, e <code class=\"gatsby-code-text\">render</code> não foi chamado.</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>Exemplos </h2>\n<p>Se seu componente muda quando as variáveis <code class=\"gatsby-code-text\">props.color</code> ou <code class=\"gatsby-code-text\">state.count</code> mudam, você poderia ter um <code class=\"gatsby-code-text\">shouldComponentUpdate</code> que checa isso:</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        Count: </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>Nesse código, <code class=\"gatsby-code-text\">shouldComponentUpdate</code> só está checando se houve alguma mudança no <code class=\"gatsby-code-text\">props.color</code> ou <code class=\"gatsby-code-text\">state.count</code>. Se esses valores não são alterados, o componente não é alterado. Se seu componente ficou mais complexo, você pode usar um padrão similar fazendo uma comparação rasa (shallow comparison) entre todos os fields de <code class=\"gatsby-code-text\">props</code> e <code class=\"gatsby-code-text\">state</code> para determinar se o componente deve ser atualizado. Esse padrão é comum o suficiente para que o React forneça um helper para usar essa lógica - apenas herde de <code class=\"gatsby-code-text\">React.PureComponent</code>. Então, essa é uma maneira mais simples de alcançar a mesma coisa:</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        Count: </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>Na maior parte das vezes, você pode usar <code class=\"gatsby-code-text\">React.PureComponent</code> em vez de escrever seu próprio <code class=\"gatsby-code-text\">shouldComponentUpdate</code>. Ele somente faz comparações rasas, então você não pode usá-lo caso as props ou state tenham sido alteradas de uma  maneira que a comparação rasa não iria detectar.</p>\n<p>Isso pode ser um problema com estruturas mais complexas. Por exemplo, vamos dizer que você quer um componente <code class=\"gatsby-code-text\">ListOfWords</code> para renderizar uma lista de palavras separas por vírgulas, com um componente pai <code class=\"gatsby-code-text\">WordAdder</code> que deixa você clicar em um botão para adicionar uma palavra para a lista. Esse código <em>não</em> faz o trabalho corretamente:</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\">'marklar'</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\">// Essa parte é um padrão ruim e causa um bug</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\">'marklar'</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>O problema é que <code class=\"gatsby-code-text\">PureComponent</code> vai fazer um comparação simples entre o valores antigos e novos de <code class=\"gatsby-code-text\">this.props.words</code>. Já que esse código muta a lista de <code class=\"gatsby-code-text\">words</code> no método <code class=\"gatsby-code-text\">handleClick</code> do <code class=\"gatsby-code-text\">WordAdder</code>, os antigos e novos valores de <code class=\"gatsby-code-text\">this.props.words</code> serão comparados como iguais, mesmo que as atuais palavras da lista tenham mudado. A <code class=\"gatsby-code-text\">ListOfWords</code> não irá alterar ainda que haja novas palavras que deveriam ser renderizadas.</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>O Poder de Não Mutar Dados </h2>\n<p>A maneira mais simples desse problema não acontecer é evitar mutar valores que são usados como propriedades ou estado. Por exemplo, o método <code class=\"gatsby-code-text\">handleClick</code> abaixo poderia ser reescrito usando <code class=\"gatsby-code-text\">concat</code> como:</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\">'marklar'</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 suporta a <a href=\"https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Operators/Spread_syntax\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">sintaxe de espalhamento</a> no qual pode fazer isso mais fácil. Se você está usando Creact React App, esta sintaxe é disponível por padrão.</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\">'marklar'</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>Você pode também reescrever o código que muta os objetos para evitar mutação, em uma maneira similar. Por exemplo, vamos dizer que nós temos um objeto chamado <code class=\"gatsby-code-text\">colormap</code> e nós queremos escrever uma função que muda <code class=\"gatsby-code-text\">colormap.right</code> para <code class=\"gatsby-code-text\">&#39;blue&#39;</code>. Você poderia escrever:</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>Para escrever isso sem mutar o objeto original, nós poderíamos usar o método <a href=\"https://developer.mozilla.org/pt-BR/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> agora retorna um novo objeto, ao invés de mutar o valor o antigo. <code class=\"gatsby-code-text\">Object.assign</code> é ES6 e requer um polyfill.</p>\n<p><a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Object spread syntax</a> facilita a atualização de objetos sem mutação:</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>Este recurso foi adicionado ao JavaScript no ES2018.</p>\n<p>Se você está usando Create React App, ambos <code class=\"gatsby-code-text\">Object.assign</code> e a sintaxe de espalhador de objeto estão disponíveis por padrão.</p>\n<p>Quando você lida com objetos profundamente aninhados, atualizá-los de maneira imutável pode parecer complicado. Se você enfrentar esse problema, consulte <a href=\"https://github.com/mweststrate/immer\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Immer</a> or <a href=\"https://github.com/kolodny/immutability-helper\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">immutability-helper</a>. Essas bibliotecas permitem escrever código altamente legível sem perder os benefícios da imutabilidade.</p>","frontmatter":{"title":"Otimizando performance","next":null,"prev":null},"fields":{"path":"content/docs/optimizing-performance.md","slug":"docs/optimizing-performance.html"}}},"pageContext":{"slug":"docs/optimizing-performance.html"}},"staticQueryHashes":[]}