<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Júlio Carneiro</title>
    <description>The latest articles on DEV Community by Júlio Carneiro (@juliocarneiro).</description>
    <link>https://dev.to/juliocarneiro</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F237503%2F69e0e7e4-7939-4728-8979-326453b827ba.png</url>
      <title>DEV Community: Júlio Carneiro</title>
      <link>https://dev.to/juliocarneiro</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/juliocarneiro"/>
    <language>en</language>
    <item>
      <title>Boas práticas de segurança em sites React</title>
      <dc:creator>Júlio Carneiro</dc:creator>
      <pubDate>Mon, 14 Mar 2022 21:13:32 +0000</pubDate>
      <link>https://dev.to/juliocarneiro/boas-praticas-de-seguranca-em-sites-react-nmb</link>
      <guid>https://dev.to/juliocarneiro/boas-praticas-de-seguranca-em-sites-react-nmb</guid>
      <description>&lt;h2&gt;
  
  
  Proteção XSS com data binding
&lt;/h2&gt;

&lt;p&gt;Use o data binding com chaves {} e o React escapará automaticamente dos valores para proteger contra ataques XSS. Observe que essa proteção ocorre apenas ao renderizar textContent e não ao renderizar atributos HTML.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use a sintaxe JSX &lt;code&gt;{}&lt;/code&gt; para colocar dados em seus elementos. Ex. &lt;code&gt;&amp;lt;div&amp;gt;{data}&amp;lt;/div&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Evite valores de atributos dinâmicos sem validação. Não use &lt;code&gt;...&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  URLs perigosas
&lt;/h2&gt;

&lt;p&gt;As URLs podem conter conteúdo de script dinâmico via javascript. Valide suas URLs antes de usar.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use a validação para garantir que seus links sejam http ou https e evitar injeção de script baseada em URL. Valide a URL usando uma função de análise nativa.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function validateURL(url) {
    const parsed = new URL(url)
    return ['https:', 'http:'].includes(parsed.protocol)
}
&amp;lt;a href={validateURL(url) ? url : ''}&amp;gt;This is a link!&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Renderizando HTML
&lt;/h2&gt;

&lt;p&gt;É possível inserir HTML diretamente nos nós do DOM, usando o &lt;code&gt;dangerouslySetInnerHTML&lt;/code&gt;. Qualquer conteúdo inserido desta forma deve ser previamente sanitizado.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use alguma lib de sanitize como a &lt;strong&gt;DOMPurify&lt;/strong&gt; em quaisquer valores antes de colocá-los no &lt;code&gt;dangerouslySetInnerHTML&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import purify from "dompurify";

&amp;lt;div dangerouslySetInnerHTML={{__html:purify.sanitize(data)}} /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Acesso direto ao DOM
&lt;/h2&gt;

&lt;p&gt;O acesso ao DOM para injetar conteúdo diretamente nos nós deve ser evitado. Use &lt;code&gt;dangerouslySetInnerHTML&lt;/code&gt; se você precisar injetar HTML, mas primeiro deve sanitiza-lo antes, usando por exemplo o &lt;strong&gt;DOMPurify.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Evite usar refs e &lt;code&gt;findDomNode()&lt;/code&gt; para acessar elementos do &lt;strong&gt;DOM&lt;/strong&gt;, injetar conteúdo diretamente via &lt;code&gt;innerHTML&lt;/code&gt;, propriedades e métodos semelhantes.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Server-side Rendering
&lt;/h2&gt;

&lt;p&gt;O data binding fornecerá escape automático de conteúdo ao usar funções de renderização do lado do servidor, como &lt;code&gt;ReactDOMServer.renderToString()&lt;/code&gt; e &lt;code&gt;ReactDOMServer.renderToStaticMarkup()&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Evite concatenar strings na saída de &lt;code&gt;renderToString()&lt;/code&gt; e &lt;code&gt;renderToStaticMarkup()&lt;/code&gt; antes de enviar as strings ao cliente para renderização.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Vulnerabilidades em dependências
&lt;/h2&gt;

&lt;p&gt;Algumas versões de componentes de terceiros podem conter problemas de segurança. Verifique suas dependências e atualize quando as versões mais novas estiverem disponíveis.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use uma ferramenta gratuita como o &lt;strong&gt;Snyk&lt;/strong&gt; para verificar vulnerabilidades.&lt;/li&gt;
&lt;li&gt;Corrija vulnerabilidades &lt;strong&gt;automaticamente com o Snyk&lt;/strong&gt; integrado ao seu &lt;strong&gt;CI/CD&lt;/strong&gt; para receber correções automatizadas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;$ npx snyk test&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Estado JSON
&lt;/h2&gt;

&lt;p&gt;É comum enviar &lt;strong&gt;JSON&lt;/strong&gt; em páginas React renderizadas no lado do servidor. Sempre valide caracteres inválidos para &lt;strong&gt;evitar ataques de injeção&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Evite valores de &lt;strong&gt;HTML&lt;/strong&gt; sem escape em objetos &lt;strong&gt;JSON&lt;/strong&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;script&amp;gt;
//[https://redux.js.org/recipes/server-rendering/#security-considerations](https://redux.js.org/recipes/server-rendering/#security-considerations)
  window.PRELOADED_STATE = ${JSON.stringify(preloadedState).replace(/&amp;lt;/g,'\\u003c')}
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Versões Vulneráveis do React
&lt;/h2&gt;

&lt;p&gt;O React teve algumas vulnerabilidades de &lt;strong&gt;alta gravidade&lt;/strong&gt; no passado, entao, é uma boa ideia manter-se atualizado com a versão mais recente.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Evite versões vulneráveis do &lt;strong&gt;react&lt;/strong&gt; e &lt;strong&gt;react-dom,&lt;/strong&gt; verificando se você está na versão mais recente usando o &lt;strong&gt;npm upgrade&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Use o &lt;strong&gt;Snyk&lt;/strong&gt; para &lt;strong&gt;atualizar automaticamente&lt;/strong&gt; para novas versões quando existirem vulnerabilidades nas versões que você está usando.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Linters
&lt;/h2&gt;

&lt;p&gt;Instale configurações e plug-ins de linters que &lt;strong&gt;detectarão automaticamente problemas&lt;/strong&gt; de segurança em seu código e oferecerão &lt;strong&gt;dicas de correção&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use a &lt;strong&gt;configuração de segurança&lt;/strong&gt; para detectar problemas em nossa base de código (Instalar o plugin do &lt;strong&gt;Snyk&lt;/strong&gt; no &lt;strong&gt;VSCode&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;Configure um &lt;strong&gt;hook&lt;/strong&gt; de &lt;strong&gt;pre-commit&lt;/strong&gt; que falha quando problemas de linter relacionados à segurança são detectados, usando uma biblioteca como &lt;strong&gt;husky&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Dependências de código sujo
&lt;/h2&gt;

&lt;p&gt;Códigos de libs sao frequentemente usados para &lt;strong&gt;realizar operações&lt;/strong&gt;, como &lt;strong&gt;inserir diretamente o HTML no DOM&lt;/strong&gt;. Revise o código da lib &lt;strong&gt;manualmente&lt;/strong&gt; ou com linters para detectar o uso inseguro dos mecanismos de segurança do &lt;strong&gt;React&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Evite bibliotecas que usam &lt;code&gt;dangerouslySetInnerHTML&lt;/code&gt;, &lt;code&gt;innerHTML&lt;/code&gt;, &lt;strong&gt;URLs inválidas&lt;/strong&gt; ou outros &lt;strong&gt;padrões inseguros&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;linters&lt;/strong&gt; em sua pasta &lt;strong&gt;node_modules&lt;/strong&gt; para detectar &lt;strong&gt;padrões inseguros&lt;/strong&gt; em suas libs.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>react</category>
      <category>security</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Security for React Apps</title>
      <dc:creator>Júlio Carneiro</dc:creator>
      <pubDate>Mon, 14 Mar 2022 21:12:54 +0000</pubDate>
      <link>https://dev.to/juliocarneiro/security-for-react-apps-5dc5</link>
      <guid>https://dev.to/juliocarneiro/security-for-react-apps-5dc5</guid>
      <description>&lt;h2&gt;
  
  
  Default XSS Protection with Data Binding
&lt;/h2&gt;

&lt;p&gt;Use default data binding with curly braces &lt;code&gt;{}&lt;/code&gt; and React will automatically escape values to protect against &lt;strong&gt;XSS attacks&lt;/strong&gt;. Note that this protection &lt;strong&gt;only occurs when rendering textContent&lt;/strong&gt; and not when rendering HTML attributes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;JSX&lt;/strong&gt; data binding syntax &lt;code&gt;{}&lt;/code&gt; to place data in your elements. Ex. &lt;code&gt;&amp;lt;div&amp;gt;{data}&amp;lt;/div&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Avoid dynamic attribute values without custom validation. Don’t use &lt;code&gt;...&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Dangerous URLs
&lt;/h2&gt;

&lt;p&gt;URLs can contain &lt;strong&gt;dynamic script&lt;/strong&gt; content via javascript: protocol urls. Validate URLs before use.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use validation to &lt;strong&gt;assure your links are http or https&lt;/strong&gt; to avoid javascript: URL based script injection. Achieve URL validation using a native URL parsing function then match the parsed
protocol property to an allow list.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function validateURL(url) {
    const parsed = new URL(url)
    return ['https:', 'http:'].includes(parsed.protocol)
}
&amp;lt;a href={validateURL(url) ? url : ''}&amp;gt;This is a link!&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Rendering HTML
&lt;/h2&gt;

&lt;p&gt;It is possible to insert HTML directly into rendered &lt;strong&gt;DOM&lt;/strong&gt; nodes using &lt;code&gt;dangerouslySetInnerHTML&lt;/code&gt;. Any content inserted this way must be sanitized beforehand.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use a sanitization library like &lt;strong&gt;DOMPurify&lt;/strong&gt; on any values before placing them into the &lt;code&gt;dangerouslySetInnerHTML&lt;/code&gt; prop.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import purify from "dompurify";

&amp;lt;div dangerouslySetInnerHTML={{__html:purify.sanitize(data)}} /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Direct DOM Access
&lt;/h2&gt;

&lt;p&gt;Accessing the DOM to &lt;strong&gt;inject content into DOM nodes&lt;/strong&gt; directly should be avoided. Use &lt;code&gt;dangerouslySetInnerHTML&lt;/code&gt; if you must &lt;strong&gt;inject HTML and sanitize it&lt;/strong&gt; before injecting it using DOMPurify&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Avoid using refs and findDomNode() to access rendered DOM elements to directly inject content via innerHTML and similar properties and methods.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Server-side Rendering
&lt;/h2&gt;

&lt;p&gt;Data binding will provide &lt;strong&gt;automatic content escaping&lt;/strong&gt; when using server-side rendering functions like &lt;code&gt;ReactDOMServer.renderToString()&lt;/code&gt; and &lt;code&gt;ReactDOMServer.renderToStaticMarkup()&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Avoid concatenating strings on to the output of &lt;code&gt;renderToString()&lt;/code&gt; and &lt;code&gt;renderToStaticMarkup()&lt;/code&gt; before sending the strings &lt;strong&gt;to the client for hydration&lt;/strong&gt; or rendering.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Known Vulnerabilities in Dependencies
&lt;/h2&gt;

&lt;p&gt;Some versions of third-party components &lt;strong&gt;might contain security issues&lt;/strong&gt;. Check your dependencies and &lt;strong&gt;update when better versions&lt;/strong&gt; become available.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use a tool like the free &lt;strong&gt;Snyk&lt;/strong&gt; cli to check for vulnerabilities.&lt;/li&gt;
&lt;li&gt;Automatically fix vulnerabilities with &lt;strong&gt;Snyk&lt;/strong&gt; by integrating &lt;strong&gt;with your source code management&lt;/strong&gt; system to receive automated fixes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;$ npx snyk test&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  JSON State
&lt;/h2&gt;

&lt;p&gt;It is common to send JSON data along with server-side rendered React pages. Always escape &amp;lt; characters with a benign value to &lt;strong&gt;avoid injection attacks&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Avoid unescaped HTML &lt;strong&gt;significant values&lt;/strong&gt; in JSON state objects.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;script&amp;gt;
//WARNING: See the following for security issues around embedding JSON in HTML:
//[https://redux.js.org/recipes/server-rendering/#security-considerations](https://redux.js.org/recipes/server-rendering/#security-considerations)
  window.PRELOADED_STATE = ${JSON.stringify(preloadedState).replace(/&amp;lt;/g,'\\u003c')}
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Vulnerable Versions of React
&lt;/h2&gt;

&lt;p&gt;The React library has had a &lt;strong&gt;few high severity vulnerabilities&lt;/strong&gt; in the past, so it is a good idea to stay &lt;strong&gt;up-to-date with the latest version&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Avoid &lt;strong&gt;vulnerable versions of the react&lt;/strong&gt; and react-dom by verifying that you are on the latest version using npm outdated to see the &lt;strong&gt;latest versions&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;Snyk&lt;/strong&gt; to automatically update to new versions when vulnerabilities exist in the versions you are using.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Linters
&lt;/h2&gt;

&lt;p&gt;Install Linters configurations and plugins that will &lt;strong&gt;automatically detect security issues&lt;/strong&gt; in your code and offer remediation advice.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use the &lt;strong&gt;ESLint React security config&lt;/strong&gt; to detect security issues in our code base (&lt;strong&gt;Install vscode Snyk extension&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;Configure a &lt;strong&gt;pre-commit hook&lt;/strong&gt; that fails when security related linter issues are detected using a library like &lt;strong&gt;husky&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Dangerous Library Code
&lt;/h2&gt;

&lt;p&gt;Library code is often used to perform dangerous operations like directly inserting HTML into the DOM. Review library code manually or with linters to detect unsafe usage of React’s security mechanisms.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Avoid libraries that do use &lt;code&gt;dangerouslySetInnerHTML&lt;/code&gt;, &lt;code&gt;innerHTML&lt;/code&gt;, unvalidated URLs or other unsafe patterns.&lt;/li&gt;
&lt;li&gt;Use security linters on your &lt;strong&gt;node_modules&lt;/strong&gt; folder to detect &lt;strong&gt;unsafe patterns&lt;/strong&gt; in your library code.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>security</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Usando Prettier com VS Code e create-react-app</title>
      <dc:creator>Júlio Carneiro</dc:creator>
      <pubDate>Tue, 01 Oct 2019 14:11:20 +0000</pubDate>
      <link>https://dev.to/juliocarneiro/usando-prettier-com-vs-code-e-create-react-app-30fl</link>
      <guid>https://dev.to/juliocarneiro/usando-prettier-com-vs-code-e-create-react-app-30fl</guid>
      <description>&lt;p&gt;Fala pessoal beleza? Espero que sim!&lt;br&gt;
A uns dias atrás numa noite fria e tediosa estava eu, na minha casa, vendo os grupos de react no slack/telegram/discord/etc quando descobri esse cara ai de cima, alguém estava falando sobre ele e decidi ver o que era e pra que servia. Confesso que pensei: &lt;strong&gt;Como fiquei a vida toda sem usar isso?&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“&lt;a href="https://github.com/prettier/prettier"&gt;Prettier&lt;/a&gt; é um formatador de código opinativo. Ele impõe um estilo consistente analisando seu código e reimprimindo-o com suas próprias regras que levam em consideração o comprimento máximo da linha, envolvendo o código quando necessário.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Resumindo&lt;/strong&gt;: Você não precisa mais se preocupar em formatar seu código, só dando um save no projeto já conseguimos a &lt;strong&gt;formatação automática&lt;/strong&gt; e perfeita do jsx com o Prettier, e isso nos faz &lt;strong&gt;economizar tempo&lt;/strong&gt;. O Prettier funciona bem e é muito fácil de configurar, por isso deve ser considerado &lt;strong&gt;obrigatório&lt;/strong&gt; em qualquer projeto. Ele não é a primeira ou única ferramenta que faz este tipo de automação, então, &lt;strong&gt;se não for adequado para você&lt;/strong&gt;, podem haver outros que te agradem e funcionem melhor para você ou &lt;strong&gt;sua equipe.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Configurando ambiente
&lt;/h2&gt;

&lt;p&gt;Este tutorial pressupõe que você esteja usando o &lt;a href="https://github.com/facebookincubator/create-react-app"&gt;Create React App&lt;/a&gt; , &lt;a href="https://yarnpkg.com/en/"&gt;Yarn&lt;/a&gt; e o &lt;a href="https://code.visualstudio.com/"&gt;VS Code&lt;/a&gt;. As instruções não devem ser diferentes se você usar o &lt;strong&gt;NPM&lt;/strong&gt; ou outro ambiente &lt;strong&gt;JavaScript&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Note que o &lt;strong&gt;CRA&lt;/strong&gt;(create-react-app) não vai mostrar nenhum erro do &lt;strong&gt;Prettier&lt;/strong&gt; no console do navegador ou na saída do terminal. &lt;strong&gt;Os erros só são exibidos no código dentro do VS Code&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Precisamos primeiro instalar o pacote &lt;strong&gt;Prettier&lt;/strong&gt; e o plugin &lt;strong&gt;ESLint Prettier&lt;/strong&gt;, depois instalamos as extensões para o VS Code. O plugin faz com que os erros do &lt;strong&gt;Prettier **sejam passados como erros do **ESLint&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn add --dev --exact prettier
yarn add --dev eslint-plugin-prettier
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Baixar extensões: &lt;a href="https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint"&gt;ESLint&lt;/a&gt; &lt;a href="https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode"&gt;Prettier&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Você precisará instalar o ESLint se não estiver usando o CRA.&lt;/p&gt;

&lt;p&gt;Agora vamos criar dois arquivos na pasta raiz do projeto, o “&lt;strong&gt;.eslintrc&lt;/strong&gt;” e o “&lt;strong&gt;.prettierrc&lt;/strong&gt;”, onde no primeiro passamos as configurações do eslint e no segundo as configurações do Prettier:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//.eslintrc
{
  "extends": "react-app",
  "plugins": ["prettier"],
  "rules": {
    "prettier/prettier": "error"
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;E caso você não esteja satisfeito com as configurações default do Prettier você pode &lt;strong&gt;modifica-las&lt;/strong&gt; neste arquivo:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//.prettierrc
{
  "singleQuote": true,
  "trailingComma": "es5"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Depois de feito estes passos podemos configurar no VS Code para que o Prettier entre em ação assim que &lt;strong&gt;salvarmos algum arquivo&lt;/strong&gt;, isto é opcional, podemos ir até a engrenagem que tem em baixo do editor a esquerda e clicar em “&lt;strong&gt;Configurações&lt;/strong&gt;”, vamos editar esta linha:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"editor.formatOnSave": true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Com tudo configurado certinho conseguimos obter este resultado ao dar um &lt;strong&gt;control + s&lt;/strong&gt; no editor:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zHTH12B_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2A6CORIasZIh_KzGGQlh3Vew.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zHTH12B_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2A6CORIasZIh_KzGGQlh3Vew.gif" alt="Para ver o resultado deste código e testar o Prettier em um playground [clique aqui](https://prettier.io/playground/#N4Igxg9gdgLgprEAuEBLAtgBwgJxgAgCU4BDMGAGn2HwGEItoECBffAMxwfwB0QdS5PgG4eUMWAA2JAM4z8AWQgA3VHFokcAE3xwAHvChb59RlGbUx+fAKNwcACgCUlqNeuQoMgjQCuM+xkqf0CAdQALCAAZVABrOC0lVTgqdBU1AEkodgh8NgBefBhw1BkAOkwuTBlRcTd3ARhfHDcHK3drAB5JVHx4gE984DTkrJyy1C0WAD5O8IAmaeH0uDGIMqgSdDgWToB6BdnwgGZpmPidACF+pH2T6faO62AAQhCcGQjouISktXwAD4A-DvT6Rc6-FZlSQIADmxXw+SR+AADPgAPz4Nr1J7uTqYaYAOSY+Ag7CK4Tg+DAzVsBFB+B6FwppXwIzUZX2BJcSCxj1x+E6vkkS1BXwhiRW+AAZNKQQEPuKfpLkmV0CRMA53hkdPlpq4BYabHAmi0sd1egMhtqprMCcBQQBtG0AXQ2Wx2XNmex60ycwhYTl2e2FfuDvv5-vaLDEMbq+mweHwWjg7BIwoIf3Umi0tRAFBAEEwMFQ0BkyFAmi4AHcAAqaBDllAkZQQSb5kAAIxwZHiMAAypgyKgoLDkDAcL4UmgvPYYLWe7D1cg05IAgWAFYyPSXHtgPv9j0xcwrkhr6dDj72ZBdkid-qSaAdyojmChSbFZAADhRBcqEACUIe0wG9KjgBVlDgDsBAAR18VABAXEglxIU9zwLAJ0FQcdJ2nGQR1hGEAEVfAgeA0PXEAYDvd8tE-JB5gLCcSFQHpR1MZcUCgJgOxCAAVO8m1XAIWBYIA)." width="714" height="785"&gt;&lt;/a&gt;&lt;em&gt;Para ver o resultado deste código e testar o Prettier em um playground &lt;a href="https://prettier.io/playground/#N4Igxg9gdgLgprEAuEBLAtgBwgJxgAgCU4BDMGAGn2HwGEItoECBffAMxwfwB0QdS5PgG4eUMWAA2JAM4z8AWQgA3VHFokcAE3xwAHvChb59RlGbUx+fAKNwcACgCUlqNeuQoMgjQCuM+xkqf0CAdQALCAAZVABrOC0lVTgqdBU1AEkodgh8NgBefBhw1BkAOkwuTBlRcTd3ARhfHDcHK3drAB5JVHx4gE984DTkrJyy1C0WAD5O8IAmaeH0uDGIMqgSdDgWToB6BdnwgGZpmPidACF+pH2T6faO62AAQhCcGQjouISktXwAD4A-DvT6Rc6-FZlSQIADmxXw+SR+AADPgAPz4Nr1J7uTqYaYAOSY+Ag7CK4Tg+DAzVsBFB+B6FwppXwIzUZX2BJcSCxj1x+E6vkkS1BXwhiRW+AAZNKQQEPuKfpLkmV0CRMA53hkdPlpq4BYabHAmi0sd1egMhtqprMCcBQQBtG0AXQ2Wx2XNmex60ycwhYTl2e2FfuDvv5-vaLDEMbq+mweHwWjg7BIwoIf3Umi0tRAFBAEEwMFQ0BkyFAmi4AHcAAqaBDllAkZQQSb5kAAIxwZHiMAAypgyKgoLDkDAcL4UmgvPYYLWe7D1cg05IAgWAFYyPSXHtgPv9j0xcwrkhr6dDj72ZBdkid-qSaAdyojmChSbFZAADhRBcqEACUIe0wG9KjgBVlDgDsBAAR18VABAXEglxIU9zwLAJ0FQcdJ2nGQR1hGEAEVfAgeA0PXEAYDvd8tE-JB5gLCcSFQHpR1MZcUCgJgOxCAAVO8m1XAIWBYIA"&gt;clique aqui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Algo bem básico porém &lt;strong&gt;útil&lt;/strong&gt;, e que consegue nos ajudar a entregar nossos jobs sempre com &lt;strong&gt;excelência&lt;/strong&gt;!&lt;br&gt;
Espero que vocês tenham curtido e que sempre possamos adicionar ele nos projetos pra poder entrar em sintonia com os outros devs da nossa equipe!&lt;/p&gt;

&lt;p&gt;Abraço pessoal &lt;strong&gt;até a próxima&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>prettier</category>
      <category>vscode</category>
      <category>react</category>
      <category>cra</category>
    </item>
    <item>
      <title>Como criar uma extensão para o Chrome utilizando React</title>
      <dc:creator>Júlio Carneiro</dc:creator>
      <pubDate>Tue, 01 Oct 2019 14:03:37 +0000</pubDate>
      <link>https://dev.to/juliocarneiro/como-criar-uma-extensao-para-o-chrome-utilizando-react-5hhf</link>
      <guid>https://dev.to/juliocarneiro/como-criar-uma-extensao-para-o-chrome-utilizando-react-5hhf</guid>
      <description>&lt;p&gt;Fala pessoal beleza? Espero que sim!&lt;br&gt;
Bom, fiz algumas pesquisas no google e não achei muitos artigos &lt;strong&gt;diretos&lt;/strong&gt; de como &lt;strong&gt;fazer uma extensão para o chrome utilizando react&lt;/strong&gt;, então decidi ensinar pra vocês do jeito mais fácil que pode ser ensinado, pra você sair deste artigo &lt;strong&gt;já criando sua primeira extensão&lt;/strong&gt;! Então bora lá?&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuração
&lt;/h2&gt;

&lt;p&gt;Primeiro vamos começar iniciando um projeto react com o “&lt;strong&gt;create-react-app&lt;/strong&gt;”, caso você ainda não o tenha instalado pode digitar em seu terminal o “&lt;strong&gt;npm i -g create-react-app&lt;/strong&gt;”, após feito isso vamos criar nosso projeto com o comando:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; create-react-app nome-do-projeto
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Após criar o projeto, vá a pasta “&lt;strong&gt;/public&lt;/strong&gt;“ e abra o &lt;strong&gt;manifest.json&lt;/strong&gt; no seu editor. Devemos adicionar e editar algumas &lt;strong&gt;configurações&lt;/strong&gt; para que o chrome &lt;strong&gt;entenda como queremos que a extensão seja executada&lt;/strong&gt;, veja:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "short_name": "chromeextension",
  "name": "Chrome Extension",
  "manifest_version": 2,
  "browser_action": {
    "default_popup": "index.html",
    "default_title": "Chrome Ext"
  },

   "permissions"*: [
    "activeTab"
  ],

   "icons": {
   "16": "react16.png",
   "48": "react48.png",
   "128": "react128.png"
  },
  "version"*: "1.0"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Este é o meu &lt;strong&gt;manifest.json&lt;/strong&gt;, o “&lt;strong&gt;name&lt;/strong&gt;” vai ser o nome do meu app, o que aparece pra nós nas &lt;strong&gt;instalações de extensão&lt;/strong&gt;, o “&lt;strong&gt;default_title&lt;/strong&gt;” muda o nome da sua extensão quando você &lt;strong&gt;passa o mouse nela sem clicar&lt;/strong&gt;, o “&lt;strong&gt;default_popup&lt;/strong&gt;” é o arquivo que sua extensão vai &lt;strong&gt;exibir ao ser clicada no navegador&lt;/strong&gt;, e também modifiquei meus &lt;strong&gt;ícones&lt;/strong&gt; para poder aparecer tanto na &lt;strong&gt;store&lt;/strong&gt; das extensões quanto no próprio &lt;strong&gt;navegador&lt;/strong&gt;, vai ser o &lt;strong&gt;ícone do meu app&lt;/strong&gt; digamos assim.&lt;/p&gt;

&lt;p&gt;Se você quiser estudar sobre as configurações do &lt;strong&gt;manifest.json&lt;/strong&gt;, acesse o &lt;a href="https://developer.chrome.com/extensions/devguide"&gt;**Guia para desenvolvedores&lt;/a&gt;** do Google &lt;a href="https://developer.chrome.com/extensions/devguide"&gt;**Chrome Extension&lt;/a&gt;.**&lt;/p&gt;

&lt;h2&gt;
  
  
  Testando aplicaçao
&lt;/h2&gt;

&lt;p&gt;Vamos no nosso terminal na pasta do projeto e vamos dar um “&lt;strong&gt;yarn build&lt;/strong&gt;” para &lt;strong&gt;buildarmos&lt;/strong&gt; nosso app, o build sera gerado na pasta “&lt;strong&gt;/build&lt;/strong&gt;” do seu app.&lt;/p&gt;

&lt;p&gt;Agora vamos ate a barra de endereços do chrome e vamos digitar “&lt;strong&gt;chrome://extensions&lt;/strong&gt;”, acessando as &lt;strong&gt;configurações de extensões&lt;/strong&gt; podemos ativar o &lt;strong&gt;modo desenvolvedor&lt;/strong&gt;. Quando fazemos isso conseguimos abrir algumas opções para testarmos nossa aplicação, vamos em “&lt;strong&gt;Carregar sem compactação&lt;/strong&gt;” e apontar a pasta “&lt;strong&gt;/build&lt;/strong&gt;” do seu projeto, que foi onde fizemos o build final do app, veja:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6HRIb-6v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/3828/1%2A5GO_m6xyCkbQyDn2PxQvug.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6HRIb-6v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/3828/1%2A5GO_m6xyCkbQyDn2PxQvug.gif" alt="" width="880" height="243"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pronto&lt;/strong&gt;! Temos nossa extensão feita com react &lt;strong&gt;funcionando perfeitamente&lt;/strong&gt;, agora só construir sua ideia em cima do app, eu por exemplo, fiz uma aplicação de &lt;strong&gt;login e senha utilizando o firebase&lt;/strong&gt; e este foi meu resultado:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WBwggw_M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2ASt7vdaBlzh5wUstYRkxFgQ.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WBwggw_M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2ASt7vdaBlzh5wUstYRkxFgQ.gif" alt="" width="466" height="482"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O repositório do meu projeto encontra-se no &lt;strong&gt;github&lt;/strong&gt; em:&lt;br&gt;
&lt;a href="https://github.com/juliocarneiro/react-chrome-extension"&gt;https://github.com/juliocarneiro/react-chrome-extension&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A edição do projeto e feita como em um projeto react normal, o objetivo de uma extensão do Chrome e &lt;strong&gt;melhorar a experiência de navegação do usuário&lt;/strong&gt; e espero que meu tutorial tenha ajudado você nisso. Caso tenha alguma duvida ou sugestão só deixar nos comentários beleza?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Obrigado pela leitura!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>chrome</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
