{"componentChunkName":"component---src-templates-blog-js","path":"/blog/2020/09/22/introducing-the-new-jsx-transform.html","result":{"data":{"markdownRemark":{"html":"<p>Embora o React 17 <a href=\"/blog/2020/08/10/react-v17-rc.html\">não contenha novos recursos</a>, ele fornecerá suporte para uma nova versão do JSX Transform. Neste post, descreveremos o que é e como experimentá-lo.</p>\n<h2 id=\"whats-a-jsx-transform\"><a href=\"#whats-a-jsx-transform\" 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 Que é um JSX Transform? </h2>\n<p>Os navegadores não entendem JSX imediatamente, então a maioria dos usuários do React confia em um compilador como o Babel ou TypeScript para <strong>transformar o código JSX em JavaScript regular</strong>. Muitos toolkits pré-configurados como o Create React App ou Next.js também incluem um JSX Transform por baixo do capô.</p>\n<p>Junto com a versão React 17, queríamos fazer algumas melhorias no JSX Transform, mas não queríamos quebrar as configurações existentes. É por isso que <a href=\"https://babeljs.io/blog/2020/03/16/7.9.0#a-new-jsx-transform-11154httpsgithubcombabelbabelpull11154\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">trabalhamos com Babel</a> para <strong>oferecer uma versão nova e reescrita do JSX Transform</strong> para pessoas que gostariam de atualizar.</p>\n<p>Atualizar para a nova transformação é totalmente opcional, mas tem alguns benefícios:</p>\n<ul>\n<li>Com a nova transformação, você pode <strong>usar JSX sem importar o React</strong>.</li>\n<li>Dependendo de sua configuração, a saída compilada pode <strong>melhorar ligeiramente o tamanho do pacote</strong>.</li>\n<li>Isso permitirá melhorias futuras que <strong>reduzem o número de conceitos</strong> que você precisa para aprender React.</li>\n</ul>\n<p><strong>Esta atualização não mudará a sintaxe JSX e não é necessária.</strong> O antigo JSX Transform continuará funcionando normalmente e não há planos de remover o suporte para ele.</p>\n<p><a href=\"/blog/2020/08/10/react-v17-rc.html\">React 17 RC</a> já inclui suporte para a nova transformação, então experimente! Para facilitar a adoção <strong>também adaptamos seu suporte</strong> para React 16.14.0, React 15.7.0 e React 0.14.10. Você pode encontrar as instruções de atualização para diferentes ferramentas <a href=\"#how-to-upgrade-to-the-new-jsx-transform\">abaixo</a>.</p>\n<p>Agora, vamos examinar mais de perto as diferenças entre a velha e a nova transformação.</p>\n<h2 id=\"whats-different-in-the-new-transform\"><a href=\"#whats-different-in-the-new-transform\" 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 Que Há de Diferente na Nova Transformação? </h2>\n<p>Quando você usa JSX, o compilador o transforma em chamadas de função React que o navegador pode entender. <strong>A antiga transformação JSX</strong> transforma JSX em chamadas <code class=\"gatsby-code-text\">React.createElement(...)</code>.</p>\n<p>Por exemplo, digamos que seu código-fonte tenha a seguinte aparência:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">App</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>h1</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Hello World</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>h1</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Nos bastidores, a antiga transformação JSX o transforma em JavaScript regular:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">App</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> React<span class=\"token punctuation\">.</span><span class=\"token function\">createElement</span><span class=\"token punctuation\">(</span><span class=\"token string\">'h1'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Hello world'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<blockquote>\n<p>Nota</p>\n<p><strong>Seu código-font não precisa ser alterado de forma alguma.</strong> Estamos descrevendo como a transformação JSX transforma seu código-fonte JSX no código JavaScript que um navegador pode entender.</p>\n</blockquote>\n<p>No entanto, isso não é perfeito:</p>\n<ul>\n<li>Como JSX foi compilado em <code class=\"gatsby-code-text\">React.createElement</code>, <code class=\"gatsby-code-text\">React</code> precisa estar no escopo se você usasse JSX.</li>\n<li>Existe algumas <a href=\"https://github.com/reactjs/rfcs/blob/createlement-rfc/text/0000-create-element-changes.md#motivation\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">melhorias e simplificações de desempenho</a> que <code class=\"gatsby-code-text\">React.createElement</code> não permite.</li>\n</ul>\n<p>Para resolver esses problemas, o React 17 apresenta dois novos pontos de entrada para o pacote React que devem ser usados apenas por compiladores como Babel e TypeScript. Em vez de transformar JSX em <code class=\"gatsby-code-text\">React.createElement</code>, <strong>a nova transformação JSX</strong> importa automaticamente funções especiais desses novos pontos de entrada no pacote React e os chama.</p>\n<p>Digamos que seu código-fonte tenha a seguinte aparência:</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\">App</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>h1</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Hello World</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>h1</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>É para isso que a nova transformação JSX o compila:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token comment\">// Inserido por um compilador (não importe você mesmo!)</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span>jsx <span class=\"token keyword\">as</span> _jsx<span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react/jsx-runtime'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">App</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 function\">_jsx</span><span class=\"token punctuation\">(</span><span class=\"token string\">'h1'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> children<span class=\"token operator\">:</span> <span class=\"token string\">'Hello world'</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>Observe como nosso código original <strong>não precisava mais importar o React</strong> para usar JSX! (Mas ainda precisaríamos importar o React para usar Hooks ou outras exportações que o React fornece.)</p>\n<p><strong>Esta mudança é totalmente compatível com todo o código JSX existente</strong>, assim você não terá que mudar seus componentes. Se estiver curioso, vocÊ pode verificar a <a href=\"https://github.com/reactjs/rfcs/blob/createlement-rfc/text/0000-create-element-changes.md#detailed-design\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">RFC técnica</a> para obter mais detalhes sobre como a nova transformação funciona.</p>\n<blockquote>\n<p>Nota</p>\n<p>As funções dentro de <code class=\"gatsby-code-text\">react/jsx-runtime</code> e <code class=\"gatsby-code-text\">react/jsx-dev-runtime</code> devem ser usadas apenas pela transformação do compilador. Se você precisa criar elementos manualmente em seu código, você deve continuar usando <code class=\"gatsby-code-text\">React.createElement</code>. Ele continuará a funcionar e não irá embora.</p>\n</blockquote>\n<h2 id=\"how-to-upgrade-to-the-new-jsx-transform\"><a href=\"#how-to-upgrade-to-the-new-jsx-transform\" 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>Como Fazer Upgrade para a Nova Transformação JSX </h2>\n<p>Se você não estiver pronto para atualizar para a nova transformação JSX ou se estiver usando JSX para outra biblioteca, não se preocupe. A transformação antiga não será removida e continuará a ter suporte.</p>\n<p>Se quiser fazer upgrade, você precisará de duas coisas:</p>\n<ul>\n<li><strong>Uma versão do React que suporta a nova transformação</strong> (<a href=\"/blog/2020/08/10/react-v17-rc.html\">React 17 RC</a> e superior suportam, mas também lançamos React 16.14.0, React 15.7.0 e React 0.14.10 para pessoas que ainda estão nas versões principais mais antigas).</li>\n<li><strong>Um compilador compatível</strong> (consulte as instruções para diferentes ferramentas abaixo).</li>\n</ul>\n<p>Como a nova transformação JSX não exige que o React esteja no escopo, <a href=\"#removing-unused-react-imports\">também preparamos um script automatizado</a> que removerá as importações desnecessárias de sua base de código.</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>Create React App <a href=\"https://github.com/facebook/create-react-app/releases/tag/v4.0.0\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">4.0.0</a>+ usa a nova transformação para versões compatíveis do React.</p>\n<h3 id=\"nextjs\"><a href=\"#nextjs\" 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>Next.js </h3>\n<p>Next.js <a href=\"https://github.com/vercel/next.js/releases/tag/v9.5.3\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">v9.5.3</a>+ usa a nova transformação para versões compatíveis do React.</p>\n<h3 id=\"gatsby\"><a href=\"#gatsby\" 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>Gatsby </h3>\n<p>Gatsby <a href=\"https://github.com/gatsbyjs/gatsby/blob/master/packages/gatsby/CHANGELOG.md#22452-2020-08-28\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">v2.24.5</a>+ usa a nova transformação para versões compatíveis do React.</p>\n<blockquote>\n<p>Nota</p>\n<p>Se você obtiver <a href=\"https://github.com/gatsbyjs/gatsby/issues/26979\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">este erro de Gatsby</a> após atualizar para React 17 RC, execute <code class=\"gatsby-code-text\">npm update</code> para corrigi-lo.</p>\n</blockquote>\n<h3 id=\"manual-babel-setup\"><a href=\"#manual-babel-setup\" 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>Configuração Manual do Babel </h3>\n<p>O suporte para a nova transformação JSX está disponível no Babel <a href=\"https://babeljs.io/blog/2020/03/16/7.9.0\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">v7.9.0</a> e superior.</p>\n<p>Primeiro, você precisará atualizar para a última transformação do Babel e do plugin.</p>\n<p>Se você estiver usando <code class=\"gatsby-code-text\">@babel/plugin-transform-react-jsx</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"gatsby-code-bash\"><code class=\"gatsby-code-bash\"><span class=\"token comment\"># para usuários npm</span>\n<span class=\"token function\">npm</span> update @babel/core @babel/plugin-transform-react-jsx</code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"gatsby-code-bash\"><code class=\"gatsby-code-bash\"><span class=\"token comment\"># para usuários yarn</span>\n<span class=\"token function\">yarn</span> upgrade @babel/core @babel/plugin-transform-react-jsx</code></pre></div>\n<p>Se você estiver usando <code class=\"gatsby-code-text\">@babel/preset-react</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"gatsby-code-bash\"><code class=\"gatsby-code-bash\"><span class=\"token comment\"># para usuários npm</span>\n<span class=\"token function\">npm</span> update @babel/core @babel/preset-react</code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"gatsby-code-bash\"><code class=\"gatsby-code-bash\"><span class=\"token comment\"># para usuários yarn</span>\n<span class=\"token function\">yarn</span> upgrade @babel/core @babel/preset-react</code></pre></div>\n<p>Atualmente, a antiga transformação <code class=\"gatsby-code-text\">{&quot;runtime&quot;: &quot;classic&quot;}</code> é a opção padrão. Para habilitar a nova transformação, você pode passar <code class=\"gatsby-code-text\">{&quot;runtime&quot;: &quot;automatic&quot;}</code> como uma opção para <code class=\"gatsby-code-text\">@babel/plugin-transform-react-jsx</code> ou <code class=\"gatsby-code-text\">@babel/preset-react</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token comment\">// Se você estiver usando @babel/preset-react</span>\n<span class=\"token punctuation\">{</span>\n  <span class=\"token string\">\"presets\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n    <span class=\"token punctuation\">[</span><span class=\"token string\">\"@babel/preset-react\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token string\">\"runtime\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"automatic\"</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<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token comment\">// Se você estiver usando @babel/plugin-transform-react-jsx</span>\n<span class=\"token punctuation\">{</span>\n  <span class=\"token string\">\"plugins\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n    <span class=\"token punctuation\">[</span><span class=\"token string\">\"@babel/plugin-transform-react-jsx\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token string\">\"runtime\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"automatic\"</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>A partir do Babel 8, <code class=\"gatsby-code-text\">&quot;automatic&quot;</code> será o tempo de execução padrão para ambos os plug-ins. Para obter mais informações, verifique a documentação do Babel para <a href=\"https://babeljs.io/docs/en/babel-plugin-transform-react-jsx\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@babel/plugin-transform-react-jsx</a> e <a href=\"https://babeljs.io/docs/en/babel-preset-react\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@babel/preset-react</a>.</p>\n<blockquote>\n<p>Nota</p>\n<p>Se você usar JSX com uma biblioteca diferente de React, você pode usar <a href=\"https://babeljs.io/docs/en/babel-preset-react#importsource\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">a opção <code class=\"gatsby-code-text\">importSource</code></a> para importar dessa biblioteca - desde que forneça os pontos de entrada necessários. Como alternativa, você pode continuar usando a transformação clássica, que continuará a ser compatível.</p>\n<p>Se você é um autor de biblioteca e está implementando o ponto de entrada <code class=\"gatsby-code-text\">/jsx-runtime</code> para sua biblioteca, tenha em mente que <a href=\"https://github.com/facebook/react/issues/20031#issuecomment-710346866\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">há um caso</a> em que até mesmo a nova transformação tem que voltar para <code class=\"gatsby-code-text\">createElement</code> para compatibilidade de versões anteriores. Nesse caso, ele irá importar automaticamente <code class=\"gatsby-code-text\">createElement</code> diretamente do ponto de entrada <em>root</em> especificado por <code class=\"gatsby-code-text\">importSource</code>.</p>\n</blockquote>\n<h3 id=\"eslint\"><a href=\"#eslint\" 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>ESLint </h3>\n<p>Se você estiver usando <a href=\"https://github.com/yannickcr/eslint-plugin-react\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">eslint-plugin-react</a>, as regas de <code class=\"gatsby-code-text\">react/jsx-uses-react</code> e <code class=\"gatsby-code-text\">react/react-in-jsx-scope</code> não são mais necessárias e podem ser desativadas ou removidas.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...</span>\n  <span class=\"token string\">\"rules\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// ...</span>\n    <span class=\"token string\">\"react/jsx-uses-react\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"off\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"react/react-in-jsx-scope\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"off\"</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"typescript\"><a href=\"#typescript\" 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>TypeScript </h3>\n<p>TypeScript suporta a nova transformação JSX em <a href=\"https://devblogs.microsoft.com/typescript/announcing-typescript-4-1/#jsx-factories\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">v4.1</a>.</p>\n<h3 id=\"flow\"><a href=\"#flow\" 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>Flow </h3>\n<p>Flow suporta a nova transformação JSX em <a href=\"https://github.com/facebook/flow/releases/tag/v0.126.0\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">v0.126.0</a> para cima, adicionando <code class=\"gatsby-code-text\">react.runtime = automatic</code> às opções de configuração do Flow.</p>\n<h2 id=\"removing-unused-react-imports\"><a href=\"#removing-unused-react-imports\" 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>Removendo Imports React não Utilizadas </h2>\n<p>Como a nova transformação JSX importará automaticamente as funções <code class=\"gatsby-code-text\">react/jsx-runtime</code> necessárias, o React não precisará mais estar no escopo quando você usar JSX. Isso pode levar a importação React não utilizadas em seu código. Não faz mal mantê-los, mas se quiser removê-los, recomendamos a execução de um script <a href=\"https://medium.com/@cpojer/effective-javascript-codemods-5a6686bb46fb\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">“codemod”</a> para removê-los automaticamente:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"gatsby-code-bash\"><code class=\"gatsby-code-bash\"><span class=\"token builtin class-name\">cd</span> your_project\nnpx react-codemod update-react-imports</code></pre></div>\n<blockquote>\n<p>Nota</p>\n<p>Se você estiver recebendo errors ao executar o codemod, tente especificar um dialeto JavaScript diferente quando <code class=\"gatsby-code-text\">npx react-codemod update-react-imports</code> solicitar que você escolha um. Em particular, neste momento, a configuração “JavaScript com Flow” suporta sintaxe mais recente do que a configuração “JavaScript”, mesmo se você não usar o Flow. <a href=\"https://github.com/reactjs/react-codemod/issues\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Crie uma issue</a> se você tiver problemas.</p>\n<p>Lembre-se de que a saída do codemod nem sempre corresponderá ao estilo de codificação do seu projeto, então você pode querer executar <a href=\"https://prettier.io/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Prettier</a> depois que o codemod terminar para uma formatação consistente.</p>\n</blockquote>\n<p>Executar este codemod irá:</p>\n<ul>\n<li>Remover todas as importações React não utilizadas como resultado da atualização para a nova transformação JSX.</li>\n<li>Alterar todas as importações React padrão (ou seja, <code class=\"gatsby-code-text\">import React from &quot;react&quot;</code>) para importações nomeadas desestruturadas (ex. <code class=\"gatsby-code-text\">import { useState } from &quot;react&quot;</code>), que é o estilo preferido no futuro. Este codemod <strong>não</strong> afetará as importações de namespace existentes (ou seja, <code class=\"gatsby-code-text\">import * as React from &quot;react&quot;</code>), que também é um estilo válido. As importações padrão continuarão funcionando no React 17, mas, a longo prazo, encorajamos nos afastar delas.</li>\n</ul>\n<p>Por exemplo,</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">App</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>h1</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Olá Mundo</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>h1</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>será substituído por</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\">App</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>h1</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Olá Mundo</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>h1</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Se você usar alguma outra importação do React - por exemplo, um Hook - então o codemod irá convertê-lo em uma importação nomeada.</p>\n<p>Por exemplo,</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">App</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>text<span class=\"token punctuation\">,</span> setText<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> React<span class=\"token punctuation\">.</span><span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Olá Mundo'</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>h1</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">{</span>text<span class=\"token punctuation\">}</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>h1</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>será substituído por</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useState <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">App</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>text<span class=\"token punctuation\">,</span> setText<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Olá Mundo'</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>h1</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">{</span>text<span class=\"token punctuation\">}</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>h1</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Além de limpar as importações não utilizadas, isso também o ajudará a se preparar para uma versão principal futura do React (não do React 17), que oferecerá suporte aos Módulos ES e não terá uma exportação padrão.</p>\n<h2 id=\"thanks\"><a href=\"#thanks\" 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>Obrigado </h2>\n<p>Gostaríamso de agradecer aos mantenedores de Babel, TypeScript, Create React App, Next.js, Gatsby, ESLint e Flow por sua ajuda na implementação e intergação da nova transformação JSX. Também queremos agradecer à comunidade React por seus comentários e discussões sobre a <a href=\"https://github.com/reactjs/rfcs/pull/107\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">RFC técnica</a>.</p>","excerpt":"Embora o React 17 não contenha novos recursos, ele fornecerá suporte para uma nova versão do JSX Transform. Neste post, descreveremos o que é e como experimentá-lo. O Que é um JSX Transform?  Os navegadores não entendem JSX imediatamente, então a maioria dos usuários do React confia em um compilador como o Babel ou TypeScript para transformar o código JSX em JavaScript regular. Muitos toolkits pré-configurados como o Create React App ou Next.js também incluem um JSX Transform por baixo do capô…","frontmatter":{"title":"Apresentando o novo JSX Transform","next":null,"prev":null,"author":[{"frontmatter":{"name":"Luna Ruan","url":"https://twitter.com/lunaruan"}}]},"fields":{"date":"22 de setembro de 2020","path":"content/blog/2020-09-22-introducing-the-new-jsx-transform.md","slug":"/blog/2020/09/22/introducing-the-new-jsx-transform.html"}},"allMarkdownRemark":{"edges":[{"node":{"frontmatter":{"title":"React v17.0"},"fields":{"slug":"/blog/2020/10/20/react-v17.html"}}},{"node":{"frontmatter":{"title":"Apresentando o novo JSX Transform"},"fields":{"slug":"/blog/2020/09/22/introducing-the-new-jsx-transform.html"}}},{"node":{"frontmatter":{"title":"React v17.0 Candidato à lançamento: Sem novas funcionalidades"},"fields":{"slug":"/blog/2020/08/10/react-v17-rc.html"}}},{"node":{"frontmatter":{"title":"React v16.13.0"},"fields":{"slug":"/blog/2020/02/26/react-v16.13.0.html"}}},{"node":{"frontmatter":{"title":"Construindo Ótimas Experiências de Usuário com Modo Concorrente e Suspense"},"fields":{"slug":"/blog/2019/11/06/building-great-user-experiences-with-concurrent-mode-and-suspense.html"}}},{"node":{"frontmatter":{"title":"Preparando para o Futuro com as Prereleases React"},"fields":{"slug":"/blog/2019/10/22/react-release-channels.html"}}},{"node":{"frontmatter":{"title":"Apresentando o novo React DevTools"},"fields":{"slug":"/blog/2019/08/15/new-react-devtools.html"}}},{"node":{"frontmatter":{"title":"React v16.9.0 e a atualização do Roadmap"},"fields":{"slug":"/blog/2019/08/08/react-v16.9.0.html"}}},{"node":{"frontmatter":{"title":"O React já esta traduzido? ¡Sí! Sim! はい！"},"fields":{"slug":"/blog/2019/02/23/is-react-translated-yet.html"}}},{"node":{"frontmatter":{"title":"React v16.8: O React com Hooks"},"fields":{"slug":"/blog/2019/02/06/react-v16.8.0.html"}}}]}},"pageContext":{"slug":"/blog/2020/09/22/introducing-the-new-jsx-transform.html"}},"staticQueryHashes":[]}