<?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: Caio M. Veloso Dias</title>
    <description>The latest articles on DEV Community by Caio M. Veloso Dias (@caiomdias).</description>
    <link>https://dev.to/caiomdias</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%2F508993%2F3775635b-803c-41ee-aa39-723c7fa2ffd2.jpeg</url>
      <title>DEV Community: Caio M. Veloso Dias</title>
      <link>https://dev.to/caiomdias</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/caiomdias"/>
    <language>en</language>
    <item>
      <title>Criando meu project starter com Next.JS</title>
      <dc:creator>Caio M. Veloso Dias</dc:creator>
      <pubDate>Wed, 18 Nov 2020 01:29:47 +0000</pubDate>
      <link>https://dev.to/caiomdias/criando-meu-primeiro-project-starter-com-next-js-2fii</link>
      <guid>https://dev.to/caiomdias/criando-meu-primeiro-project-starter-com-next-js-2fii</guid>
      <description>&lt;p&gt;Minha motivação para dar início ao projeto foi devido a um insight que tive durante uma situação em minha vida de desenvolvedor, estava passando por alguns problemas na empresa que estou trabalhando e pensei em olhar o que o mercado estava buscando, me deparei com uma procura absurda por profissionais com proficiência em React e suas stacks. &lt;/p&gt;

&lt;p&gt;Decidi parar para estudar de fato e conheci o Next.js logo em seguida, me apaixonei pela tecnologia e suas funcionalidades (que ainda nem sei todas). &lt;/p&gt;

&lt;p&gt;Assim que comecei a estudar vi que era importante entender todo o eco sistema de uma aplicação que foi, esta sendo ou vai ser construída e reparei que nunca tive a experiência de criar e me preocupar com um ecossistema desses. Foi aí que decidi dar o pontapé nessa direção e comecei a estudar sobre quais tecnologias um projeto next.js deveria ter para ser sustentável, escalável e de fácil manutenção.&lt;/p&gt;

&lt;p&gt;Inicialmente não pensei que poderia ser tao extenso a criação do projeto, mas foi, e hoje fico grato por passar por essa experiencia, com isso decidi dividir isso com quem quer que esteja lendo esse artigo, agradeço desde já por consultar aqui e espero que tenha ajudado de alguma forma.&lt;/p&gt;

&lt;h2&gt;
  
  
  Começando
&lt;/h2&gt;

&lt;p&gt;Inicialmente vamos criar um projeto base do Next.js:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Lembrando que vamos precisar ter instalado uma versão do &lt;a href="https://nodejs.org/en/" rel="noopener noreferrer"&gt;node&lt;/a&gt; a partir da versão 10.13.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Vamos rodar o &lt;strong&gt;create next app&lt;/strong&gt; no terminal:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

npx create-next-app nome_do_seu_projeto


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Ele vai criar uma estrutura como essa:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fiecl0h83grnfxvekw47o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fiecl0h83grnfxvekw47o.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos entrar na pasta criada:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nb"&gt;cd &lt;/span&gt;nome_do_seu_projeto


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Caso queira ver o que o comando criou é só rodar no terminal:&lt;/em&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

yarn run dev


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;em&gt;e no seu navegador, entrar no &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;localhost:3000&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Vamos excluir os arquivos que inicialmente não vamos utilizar:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;pasta styles&lt;/strong&gt; -&amp;gt; vamos criar ela dentro do src, na minha opinião e mais organizado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Arquivos dentro da pasta public&lt;/strong&gt; -&amp;gt; São assets da Vercel que não vamos usar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;pasta API dentro de pages&lt;/strong&gt; -&amp;gt; Essa pasta serve para escrevermos funções que vão ser executadas no servidor da Vercel caso você queira hospedar seu projeto lá.&lt;/p&gt;

&lt;p&gt;Vamos ficar com uma estrutura parecida com essa:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F7x58trbgb7rjmliy71oe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F7x58trbgb7rjmliy71oe.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Typescript
&lt;/h3&gt;

&lt;p&gt;Escolhi usar typescript devido aos benefícios que ele trás atualmente como o Intellisense, permitindo pegar erros na hora, sem falar das funcionalidades que ainda não estão disponíveis no ES.&lt;/p&gt;

&lt;p&gt;Vamos adicionar o typescript com os types dele e do node.js dado que estamos utilizando o Next.js e o mesmo utiliza o node:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

yarn add typescript @types/react @types/node &lt;span class="nt"&gt;-D&lt;/span&gt; 


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Em seguida vamos trocar os formatos de alguns arquivos para os do typescript:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;pages/_app.js -&amp;gt; pages/_app.tsx&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Vamos remover a importação do styles nesse arquivo, ficaremos com algo assim:&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fe7aacwpbmdqbe73ynnn4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fe7aacwpbmdqbe73ynnn4.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;pages/index.js -&amp;gt; pages/index.tsx&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Vamos remover a importação do styles aqui também e no meu caso removi tudo o que eu não fosse usar para esse exemplo:&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F524soc61z5kj90qtdrl6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F524soc61z5kj90qtdrl6.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora vamos rodar o projeto, e o yarn vai entender que estamos usando typescript e criar as configurações dele e as tipagens que o next vai precisar automaticamente. &lt;/p&gt;

&lt;p&gt;Quando ele terminar de rodar teremos uma estrutura parecida com essa:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0rqe4g6lvo964m91dea4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0rqe4g6lvo964m91dea4.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Abrindo no seu navegador o &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;localhost:3000&lt;/a&gt;&lt;br&gt;
vamos ter algo parecido com isso:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fbgiflxb5jgnbw39dhnnc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fbgiflxb5jgnbw39dhnnc.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com isso colocamos o typescript no nosso projeto!&lt;/p&gt;

&lt;h3&gt;
  
  
  EsLint
&lt;/h3&gt;

&lt;p&gt;Primeiramente vamos instalar ele como dependência:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

yarn add eslint &lt;span class="nt"&gt;-D&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Em seguida vamos rodar o init:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

yarn init eslin


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Com isso vamos fazer a configuração com o CLI do Eslint:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vamos escolher a terceira opção, &lt;em&gt;checar sintaxe, encontrar problemas e forçar um estilo de código&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fikwwm0tmnnqj0zdu6u3q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fikwwm0tmnnqj0zdu6u3q.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aqui vamos selecionar a primeira opção, pôs estamos utilizando import/export&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Favrfpe48ep08443iqqyn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Favrfpe48ep08443iqqyn.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aqui também vai ser a primeira opção, estamos utilizando React&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fvzy4b0jkb51j8fqcl5sb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fvzy4b0jkb51j8fqcl5sb.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vamos dizer que &lt;strong&gt;sim&lt;/strong&gt;, o projeto utiliza Typescript&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fhfcu4ou3rvxwvu9pqvbs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fhfcu4ou3rvxwvu9pqvbs.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agora vamos selecionar às duas opções com a &lt;strong&gt;barra de espaço&lt;/strong&gt;, vamos rodar o projeto no navegador, mas o Next também utiliza o Node, logo nos queremos que os dois sejam vistos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F4jm4uj8e0b7lnt3vgx1c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F4jm4uj8e0b7lnt3vgx1c.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aqui vamos escolher a primeira opção, utilizar um &lt;strong&gt;guia de estilo popular&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fjslw3oyph2f9ta71sgem.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fjslw3oyph2f9ta71sgem.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vamos escolher o guia do Airbnb&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F928a35r62igi61vatphh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F928a35r62igi61vatphh.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aqui vamos escolher a terceira opção &lt;strong&gt;JSON&lt;/strong&gt; como arquivo de configuração para o eslint&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fypw7r2ormfc5mj7tyb1b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fypw7r2ormfc5mj7tyb1b.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Por final, vamos escolher sim, para instalar as dependências necessárias&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fzf41xg071t8uhdn2zk7r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fzf41xg071t8uhdn2zk7r.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As opções acabaram, mas vamos precisar de mais uma dependência o &lt;strong&gt;eslint-config-airbnb-typescript&lt;/strong&gt;, precisaremos instalar ele com o Yarn: &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

yarn add eslint-config-airbnb-typescript &lt;span class="nt"&gt;-D&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Vamos perceber que ele vai gerar um &lt;strong&gt;package-lock.json&lt;/strong&gt;, porque ele instala via &lt;strong&gt;NPM&lt;/strong&gt;, logo após de terminar de instalar vamos &lt;strong&gt;deletar&lt;/strong&gt; o package-lock.json e rodar no terminal &lt;strong&gt;yarn&lt;/strong&gt; para ele adicionar no yarn-lock&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Terminando de instalar tudo pelo Yarn, teremos uma estrutura parecida com essa:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fz6j6j8fnxqwpbnqrn1pe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fz6j6j8fnxqwpbnqrn1pe.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E vamos ver que o Eslint já esta acusando alguns erros no projeto.&lt;/p&gt;

&lt;p&gt;Calma vamos resolver tudo!&lt;/p&gt;

&lt;p&gt;Mas antes vamos alterar algumas coisas nas configurações do Eslint, &lt;strong&gt;.eslintrc&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Eu tive bastante dificuldade para configurar o Eslint estendido do AirBnB, pedi ajuda a alguns amigos e decidi ter poucas regras e extensões, então basicamente eu vou estender do &lt;strong&gt;airbnb-typescript&lt;/strong&gt; e passar o projeto para ele.&lt;/p&gt;

&lt;p&gt;Ficaremos com um &lt;strong&gt;.eslintrc&lt;/strong&gt; parecido com:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fi9d4bsxa7whtojpcb8vq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fi9d4bsxa7whtojpcb8vq.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora vamos criar o arquivo de ignore do Eslint &lt;strong&gt;.eslintignore&lt;/strong&gt; na raiz do projeto e vamos ignorar os arquivos &lt;strong&gt;node_modules .next e arquivos .js no projeto&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Teremos uma configuração assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fqli3jb3u4edgkbnwrw7p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fqli3jb3u4edgkbnwrw7p.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Inicialmente vamos à pasta &lt;strong&gt;pages/&lt;/strong&gt;, no arquivo &lt;strong&gt;_app.tsx&lt;/strong&gt;&lt;br&gt;
vamos salvar, e ele já vai fixar alguns erros. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Lembrando que para isso acontecer se o seu VSCode estiver com a configuração de &lt;a href="https://github.com/microsoft/vscode-eslint" rel="noopener noreferrer"&gt;editor.codeActionsonSave&lt;/a&gt; configurada para o EsLint fixar os erros que ele consegue&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;E em seguida vamos ver o seguinte erro, &lt;strong&gt;'React' must be in scope when using JSX&lt;/strong&gt; basicamente o lint pede para importarmos o React quando o escopo for JSX, conseguimos retirar isso desabilitando essa regra, em um projeto Next essa importação não é necessária, mas eu decidi manter por estar acostumado.&lt;/p&gt;

&lt;p&gt;Por fim vamos converter a function MyApp para um componente. Teremos algo parecido com:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fme2iljx0js6ljjcc9yzl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fme2iljx0js6ljjcc9yzl.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Porém, ainda temos um error, o Eslint não vai entender que o nosso componente esta recebendo as propriedades e para isso o Next possui um type que garante a tipagem e afins para nós. No final teremos algo assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fdx5k4y534cg2r68dyaag.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fdx5k4y534cg2r68dyaag.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora no arquivo &lt;strong&gt;index.tsx&lt;/strong&gt; vamos fazer as mesmas coisas, vamos salvar o arquivo, em seguida importar o React e converter a function. Ficaremos com algo assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fj4hmup6ecjwvadg2n3ut.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fj4hmup6ecjwvadg2n3ut.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E finalizamos essa etapa de Eslint. Você pode rodar o &lt;strong&gt;yarn run dev&lt;/strong&gt; para ver se esta tudo ok com o projeto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Styled Components
&lt;/h3&gt;

&lt;p&gt;Eu escolhi styled components para estilização, por simples curiosidade, como eu disse estou aprendendo e vi que era muito utilizado no mercado :).&lt;/p&gt;

&lt;p&gt;Bom para adicionar a estilização eu segui um &lt;a href="https://github.com/vercel/next.js/tree/master/examples/with-styled-components" rel="noopener noreferrer"&gt;modelo&lt;/a&gt; do próprio next.JS.&lt;/p&gt;

&lt;p&gt;Inicialmente vamos instalar o &lt;strong&gt;styled-components&lt;/strong&gt; e o &lt;strong&gt;@types/styled-components&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

yarn add styled-components


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;e &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

yarn add @types/styled-components &lt;span class="nt"&gt;-D&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Vamos criar um arquivo &lt;a href="https://github.com/vercel/next.js/blob/master/examples/with-styled-components/.babelrc" rel="noopener noreferrer"&gt;babelrc&lt;/a&gt; na raiz do projeto e adicionar a configuração dele, vamos criar um arquivo chamado &lt;a href="https://github.com/vercel/next.js/blob/master/examples/with-styled-components/pages/_document.js" rel="noopener noreferrer"&gt;__document.tsx&lt;/a&gt; na pasta &lt;strong&gt;./pages/&lt;/strong&gt; e adicionar a configuração dele também.&lt;/p&gt;

&lt;p&gt;Agora vamos precisar alterar algumas coisas dentro do arquivo &lt;strong&gt;__document.tsx&lt;/strong&gt;, devido a utilizarmos o TS, provavelmente ele deve reclamar do retorno da função &lt;strong&gt;getInitialProps&lt;/strong&gt;, vamos tipar o retorno dela da seguinte forma:&lt;/p&gt;

&lt;p&gt;Vamos importar de &lt;strong&gt;next/document&lt;/strong&gt; o tipo pronto desse retorno que o next disponibiliza para usarmos, o &lt;strong&gt;DocumentinitialProps&lt;/strong&gt;&lt;br&gt;
ele será o tipo da promessa que a função assincronia vai retornar, e teremos que tipar o &lt;strong&gt;contexto&lt;/strong&gt; ("ctx" passado como argumento da função) também, vamos importar do mesmo cara o &lt;strong&gt;DocumentContext&lt;/strong&gt;. Ficaremos com um arquivo parecido com isso:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F1w8s2ysrfjqqlu8ve0h7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F1w8s2ysrfjqqlu8ve0h7.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pronto, temos o styled-componentes configurado, porém precisamos usa-lo, para isso vamos fazer umas alterações na nossa estrutura.&lt;/p&gt;

&lt;p&gt;Vamos criar um arquivo &lt;strong&gt;src&lt;/strong&gt; na raiz do projeto e dentro dela outra pagina chamada &lt;strong&gt;styles&lt;/strong&gt; e vamos criar um arquivo de estilos globais, &lt;strong&gt;esse arquivo é criado para fins de exemplos não uma regra&lt;/strong&gt;. E por fim vamos mover a pasta &lt;strong&gt;pages&lt;/strong&gt; para dentro da pasta &lt;strong&gt;src&lt;/strong&gt;. Teremos algo assim no final:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fv43f87ad532vtpxs2hkg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fv43f87ad532vtpxs2hkg.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora vamos colocar nosso arquivo de configuração de estilos globais pra fazer efeito na aplicação. Inicialmente vamos importar nele a função &lt;strong&gt;createGlobalStyle&lt;/strong&gt; do &lt;strong&gt;styled-components&lt;/strong&gt;, &lt;br&gt;
vamos exportar ele de forma default, ele vai criar a nossa tag de estilização global para usarmos no início da aplicação.&lt;br&gt;
Vamos adicionar alguns estilos padrão para a aplicação e para a tag &lt;strong&gt;body&lt;/strong&gt;: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fz5ignl0qoe6q1e88dssl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fz5ignl0qoe6q1e88dssl.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos adicionar o nosso componente na aplicação, no arquivo &lt;strong&gt;__app.tsx&lt;/strong&gt; vamos importar ele e adicionar no retorno da função &lt;strong&gt;MyApp&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F8s39ujygcpk4fn8hkd9n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F8s39ujygcpk4fn8hkd9n.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Rodando o &lt;strong&gt;yarn dev&lt;/strong&gt; podemos ver as estilizações funcionando!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmzhzd1mg757qhffcvnbm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmzhzd1mg757qhffcvnbm.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E pronto, mais uma etapa chega ao fim, configuramos o styled- components no nosso projeto!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Uma ressalva aqui sobre o styled-component no Next.JS, Toda a estilização esta sendo feita no serve side, no servidor node que o next cria, se desabilitarmos o javascript no browser e dermos um F5 vamos ver que a estilização continua, por mais que estejamos usando o styled-components que funciona de forma dinamica com o JS&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Next Images
&lt;/h3&gt;

&lt;p&gt;Eu quis trazer esse plugin do Next para o artigo pôs enquanto estava estudando vi que ele tem algumas limitações para lidar com imagens, ele pede para que coloquemos as imagens que vamos usar na pasta &lt;strong&gt;./public&lt;/strong&gt;, e não conseguiríamos utilizar de outra pasta, por exemplo,  e não conseguiríamos tratar as imagens, mas com o plugin &lt;a href="https://www.npmjs.com/package/next-images" rel="noopener noreferrer"&gt;Next images&lt;/a&gt; isso muda, vamos conseguir lidar melhor.&lt;/p&gt;

&lt;p&gt;Para instalar vamos começar com:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

yarn add next-images


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Vamos precisar criar um arquivo na raiz chamado &lt;strong&gt;next.config.js&lt;/strong&gt;&lt;br&gt;
e nele vamos adicionar essas linhas de código como configuração:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;withImages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next-images&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;withImages&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;esModule&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Por último, como estamos utilizando Typescript vamos precisar adicionar mais uma linha de código no arquivo &lt;strong&gt;next-env.d.ts&lt;/strong&gt;, para que o Next entenda os arquivos de imagem:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;

/// &lt;span class="nt"&gt;&amp;lt;reference&lt;/span&gt; &lt;span class="na"&gt;types=&lt;/span&gt;&lt;span class="s"&gt;"next-images"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Agora para ver se funcionou, vamos criar uma pasta de &lt;strong&gt;assets&lt;/strong&gt; dentro de &lt;strong&gt;./src&lt;/strong&gt; e colocar um SVG para usarmos, ficaremos com uma estrutura assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgrbt2tritr9bz8gft7vz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgrbt2tritr9bz8gft7vz.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora vamos usar a imagem na nossa pagina inicial:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fjtodrfnxwv9bso949rup.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fjtodrfnxwv9bso949rup.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E dependendo da sua imagem, teremos algo assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fjtodrfnxwv9bso949rup.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fjtodrfnxwv9bso949rup.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Porem se inspecionarmos a imagem, vamos ver que ela foi convertida para &lt;strong&gt;base64&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fnrdxr7pnwm1ibr9jfk7z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fnrdxr7pnwm1ibr9jfk7z.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Essa conversão não e legal para imagens grandes, elas podem aumentar bastante de tamanho. Podemos melhorar isso com o plugin do babel &lt;a href="https://github.com/airbnb/babel-plugin-inline-react-svg" rel="noopener noreferrer"&gt;inline-react-svg&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;vamos instalar o plugin:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

yarn add babel-plugin-inline-react-svg &lt;span class="nt"&gt;-D&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Em seguida vamos usar ele nas configurações do babel, no arquivo &lt;strong&gt;./babel.rc&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fdowm5mgnsg985l3n3huz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fdowm5mgnsg985l3n3huz.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E vamos usar agora a imagem como uma tag mesmo. Bem mais simples, não?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fks776qe12nzwvjqqwaw0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fks776qe12nzwvjqqwaw0.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora vamos rodar o projeto de novo e ver a diferença:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fq38s4164r98bzliw4w10.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fq38s4164r98bzliw4w10.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pronto, configuramos a utilização de imagens e o tratamento dos SVG's.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;lembrando que esse tratamento da base64 serve somente para os SVG's.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Jest
&lt;/h3&gt;

&lt;p&gt;Bom agora, vamos aos testes!&lt;/p&gt;

&lt;p&gt;Eu escolhi o &lt;a href="https://jestjs.io/" rel="noopener noreferrer"&gt;Jest&lt;/a&gt; por ter uma certa familiaridade e querer aprender um pouco mais como testar unitariamente com ele.&lt;/p&gt;

&lt;p&gt;Vamos precisar instalar algumas dependências para o Jest funcionar no nosso projeto:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

yarn add jest @testing-library/react @types/jest @testing-library/jest-dom babel-jest @babel/core &lt;span class="nt"&gt;-D&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Em seguida nós vamos criar na raiz do projeto o arquivo de configuração do Jest, &lt;strong&gt;./jest.config.js&lt;/strong&gt;, ficaremos com uma estrutura parecida com essa:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fo3mvpsnimdrr2izugr91.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fo3mvpsnimdrr2izugr91.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos adicionar a configuração:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;testPathIgnorePatterns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;rootDir&amp;gt;/.next/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;rootDir&amp;gt;/node_modules/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;bail&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;clearMocks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;collectCoverage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;collectCoverageFrom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;components/**/*.tsx&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pages/**/*.tsx&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;coverageReporters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;lcov&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Agora vamos adicionar ao &lt;strong&gt;babel.rc&lt;/strong&gt; o &lt;strong&gt;presset&lt;/strong&gt; para o Jest:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="nl"&gt;"presets"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"next/babel"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;


&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;No meu caso, na configuração que fizemos anteriormente, já havíamos colocado esse presset, porem pode ser que isso não aconteça com você então é bom lembrar!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Com a configuração feita,  estamos prontos para rodar os testes! Vamos adicionar dois comandos no &lt;strong&gt;./package.json&lt;/strong&gt; para deixar pronto para rodar:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="nl"&gt;"test"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"jest --watch"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"coverage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"jest --coverage"&lt;/span&gt;&lt;span class="w"&gt;


&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Agora vamos adicionar um teste simples do arquivo &lt;strong&gt;./pages/index.tsx&lt;/strong&gt; para vermos o Jest em funcionamento.&lt;/p&gt;

&lt;p&gt;Dentro da pasta pages vamos criar um arquivo chamado &lt;strong&gt;index.test.tsx&lt;/strong&gt; e vamos adicionar esse teste simples:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;render&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@testing-library/react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@testing-library/jest-dom/extend-expect&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Home&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./index&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;should render Header&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;getByText&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Home&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;getByText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Pagina inicial&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toBeTruthy&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Aqui nos estamos vendo se o texto &lt;em&gt;Pagina inicial&lt;/em&gt; vai ser renderizado.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Vamos para o terminal e rodar o comando de teste:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

yarn &lt;span class="nb"&gt;test&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Se a instalação e a configuração estiverem certas, vamos ter um resultado assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fcj61ete9i68brtx47bz9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fcj61ete9i68brtx47bz9.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E pronto! Podemos testar o projeto sempre que quiser.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Uma ressalva, existem varias convenções de estruturas e formas de organizar os testes, eu particularmente prefiro, em projetos Next.JS a utilização da pasta &lt;code&gt;__test__&lt;/code&gt; para organizar os testes, e mantenho eles sempre no escopo do que eu to testando, por exemplo, como estamos testando o index dentro de &lt;strong&gt;./pages&lt;/strong&gt; teríamos uma pasta &lt;code&gt;__test__&lt;/code&gt;, o Jest vai conseguir entender tudo e rodar os nossos testes. Decidi fazer dessa forma, pôs é mais simples de entender, na minha opinião.&lt;/p&gt;

&lt;p&gt;Gostaria de Incentivar você a testar o máximo que puder do seu projeto, existem vários conteúdos sobre testes com ou sem o Jest e afins então manter sempre seu projeto testado torna mais seguro para você e para seu possível cliente.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Cypress
&lt;/h3&gt;

&lt;p&gt;Para os testes e2e eu decidi usar o &lt;a href="https://www.cypress.io/" rel="noopener noreferrer"&gt;Cypress&lt;/a&gt; para aprender e conhecer a ferramenta.&lt;/p&gt;

&lt;p&gt;Vamos instalar o Cypress:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

yarn add cypress &lt;span class="nt"&gt;--dev&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Agora vamos abrir o Cypress:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

yarn run cypress open


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;O Cypress vai criar o arquivo de configuração dele, &lt;strong&gt;cypress.json&lt;/strong&gt;, a pasta na raiz do projeto e alguns testes de exemplo, não vamos precisar deles, vamos deletar o que for exemplo e ficaremos com uma estrutura assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fqtlw22sz2jvnyw7vhcwv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fqtlw22sz2jvnyw7vhcwv.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora vamos adicionar um teste simples, para vermos o Cypress funcionando. Dentro da pasta &lt;strong&gt;cypress/integrations&lt;/strong&gt; vamos adicionar um novo arquivo, &lt;strong&gt;index_spec.ts&lt;/strong&gt; e adicionar as seguintes linhas de código:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;The Home Page&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;beforeEach&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;visit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;successfully loads title&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Pagina inicial&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Vamos perceber que ele vai acusar um erro no &lt;strong&gt;cy&lt;/strong&gt;, basicamente o Typescript não esta entendendo o tipo dele, vamos adicionar o &lt;strong&gt;cypress&lt;/strong&gt; nos tipos do TS no arquivo, &lt;strong&gt;tsconfig.json&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

"types": ["cypress"],
...


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Agora vamos rodar o Cypress para ver se o teste esta funcionando. Vamos ver que não funcionou :/.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F058igzcavbwpp1nxs248.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F058igzcavbwpp1nxs248.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O Cypress precisa acessar o nosso servidor local para conseguir visitar a nossa pagina, para isso acontecer precisamos configurar a URL base, vamos adicionar no arquivo &lt;strong&gt;cypress.json&lt;/strong&gt; :&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"baseUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:3000"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;


&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Agora vamos abrir outro terminal, e rodar a nossa aplicação, atualmente esta na &lt;strong&gt;porta 3000&lt;/strong&gt;, e no outro terminal vamos rodar o &lt;strong&gt;cypress open&lt;/strong&gt; e ver que agora os testes estão passando!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fl1gfeqx8mlhz8ol0bhfw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fl1gfeqx8mlhz8ol0bhfw.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Temos o Cypress configurado, como um bônus, vou usar o Github Actions para rodar o Cypress nos nossos pull requests e commits :)&lt;/p&gt;

&lt;p&gt;Inicialmente vamos criar o repositório no GitHub e fazer um &lt;strong&gt;git push&lt;/strong&gt;. Vamos à aba de repositórios do Git, clicar em &lt;strong&gt;novo&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fwfwxx30ycamgmpzw3efx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fwfwxx30ycamgmpzw3efx.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em seguida vamos dar um nome ao repositório e desmarcar qualquer coisa, &lt;strong&gt;além da opção de public&lt;/strong&gt;, que esteja marcada para não dar conflito e clicar em criar repositório:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fw3ccnthgyasmum39xzbg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fw3ccnthgyasmum39xzbg.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora vamos voltar ao terminal e adicionar o nosso repositório ao Git:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fjy2qyuom3kagittfe5xi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fjy2qyuom3kagittfe5xi.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Lembre-se de commitar as nossas alterações antes de fazer o push :)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Para você esse endereço na caixa vermelha vai ser outro, não tem problema algum, isso SO quer dizer que o projeto esta na minha conta do Github e o seu vai estar no seu Git.&lt;/p&gt;

&lt;p&gt;Com isso vamos ter o nosso projeto no GitHub, dai para frente você pode alterar do jeito que quiser o projeto, deixar com a sua cara no Git!&lt;/p&gt;

&lt;p&gt;Agora vamos adicionar o Cypress ao nosso projeto:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;vamos ir na &lt;a href="https://dashboard.cypress.io/" rel="noopener noreferrer"&gt;dashboard do cypress&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ao logar, vamos precisar autorizar o Cypress no nosso github:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fso7vva7flzois4u78n0m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fso7vva7flzois4u78n0m.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;vamos criar uma organização nova:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Funfgmb6lte41p2u7orz1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Funfgmb6lte41p2u7orz1.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;vamos &lt;strong&gt;pular&lt;/strong&gt; essa etapa de criação de times.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;vamos criar um projeto novo:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fl4m9imslds7pap2oxlut.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fl4m9imslds7pap2oxlut.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;selecione a opção &lt;strong&gt;public&lt;/strong&gt;:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fc6kqleqko1mcag8tp3xn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fc6kqleqko1mcag8tp3xn.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Vamos adicionar o &lt;strong&gt;projectId&lt;/strong&gt; gerado no arquivo &lt;strong&gt;cypress.json&lt;/strong&gt; no nosso projeto.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Vamos &lt;strong&gt;guardar essa chave que nos permite enviar os vídeos para o dashboard do Cypress&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pronto temos um projeto no Cypress.io, agora vamos criar uma ligação entre ele e o nosso projeto no GitHub&lt;/p&gt;

&lt;p&gt;Vamos entrar na aba &lt;strong&gt;Project Settings&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fi3it52vzkhbb7e7z2f5m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fi3it52vzkhbb7e7z2f5m.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos descer ate a parte de &lt;strong&gt;GitHub Integration&lt;/strong&gt; e clicar em &lt;strong&gt;Install the Cypress GitHub App&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fqsr8gyl5kxkjpwytyzb8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fqsr8gyl5kxkjpwytyzb8.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Selecione o seu GitHub:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F8z574oa391y9z0c8dre7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F8z574oa391y9z0c8dre7.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos descer ate a parte de &lt;strong&gt;Repository acess&lt;/strong&gt; e selecionar o nosso repositório:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fwbdsi3kuatkbl4xr3kj0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fwbdsi3kuatkbl4xr3kj0.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos salvar e seremos redirecionados para o Cypress de novo,&lt;br&gt;
em seguida vamos selecionar o repositório que vamos usar do github:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fu499a3sdlz3545j6n5ph.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fu499a3sdlz3545j6n5ph.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O Cypress vai fazer a configuração necessária para o hook funcionar no Git, só vamos precisar ativar no GitHub.&lt;/p&gt;

&lt;p&gt;Vamos Agora na aba &lt;strong&gt;settings&lt;/strong&gt; do projeto no GitHub:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F3qpzs8rl451odirtfsqb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F3qpzs8rl451odirtfsqb.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos selecionar a opção &lt;strong&gt;Branches&lt;/strong&gt; depois &lt;strong&gt;Add Rule&lt;/strong&gt;, vamos adicionar um nome para a regra, e selecionar a opção de &lt;strong&gt;status checks&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Faofu5pxaavf7o9txcr25.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Faofu5pxaavf7o9txcr25.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E já vamos ver o Cypress checando os commits que subimos para o GitHub:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgtyw489jlm9gmuaahwnw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgtyw489jlm9gmuaahwnw.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bom Agora vamos à aba de &lt;strong&gt;actions&lt;/strong&gt; e selecionar a opção &lt;strong&gt;set up a workflow yourself&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fztve1q5o8m6f9gmi4djz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fztve1q5o8m6f9gmi4djz.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora vamos adicionar o workflow do cypress no script:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;

&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;End-to-end tests&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;cypress-run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-16.04&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v1&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Cypress run&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cypress-io/github-action@v2&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
           &lt;span class="na"&gt;record&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
           &lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yarn run dev&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="c1"&gt;# pass the Dashboard record key as an environment variable&lt;/span&gt;
          &lt;span class="na"&gt;CYPRESS_RECORD_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;SUA CHAVE GERADA PELO CYPRESS&amp;gt;&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;E se abrirmos um pull request, vamos ver que só vamos poder fazer merge, quando o status do Cypress liberar:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fh531ap62fudgh8d8t07m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fh531ap62fudgh8d8t07m.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E uma coisa legal e que o Cypress sempre reporta no pull request:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fs18e6ticqdq7ls0lxl3g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fs18e6ticqdq7ls0lxl3g.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E assim finalizamos a questão do Cypress!&lt;/p&gt;

&lt;h3&gt;
  
  
  Travis
&lt;/h3&gt;

&lt;p&gt;Eu considerei colocar o Travis CI como processo de CI aqui para deixar mais completo o projeto e se você quiser aprender mais sobre CI/CD recomendo muito a &lt;a href="https://docs.travis-ci.com/user/tutorial/" rel="noopener noreferrer"&gt;documentação&lt;/a&gt; deles, e bem completa!&lt;br&gt;
Não vou configurar um processo de CD pôs o projeto tem a finalidade de ser um inicial, o CD fica a critério da evolução do projeto.&lt;/p&gt;

&lt;p&gt;Inicialmente vamos entrar na dashboard do &lt;a href="https://travis-ci.com/" rel="noopener noreferrer"&gt;Travis CI&lt;/a&gt;, assim como no Cypress, vamos precisar &lt;strong&gt;instalar&lt;/strong&gt; a App no Git e autorizar o mesmo.&lt;/p&gt;

&lt;p&gt;Agora vamos adicionar a integração no nosso projeto, vamos clicar no &lt;strong&gt;+&lt;/strong&gt; para adicionar uma integração nova, em seguida precisamos buscar pelo nosso projeto:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgrhlal27ewvf42ktnom9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgrhlal27ewvf42ktnom9.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fi3ongabxlwcdvjkbcfna.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fi3ongabxlwcdvjkbcfna.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos ser redirecionado para a tela anterior porem nao teremos configuração:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fzm0ov7ezf8egpiol0nsp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fzm0ov7ezf8egpiol0nsp.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos precisar criar um arquivo novo no nosso projeto, o &lt;strong&gt;.travis.yml&lt;/strong&gt;, e vamos adicionar a ele as seguintes linhas de código:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;

&lt;span class="na"&gt;language&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;node_js&lt;/span&gt;
&lt;span class="na"&gt;node_js&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;10"&lt;/span&gt;

&lt;span class="na"&gt;install&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yarn install --frozen-lockfile&lt;/span&gt;

&lt;span class="na"&gt;cache&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;yarn&lt;/span&gt;

&lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;yarn run test&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Em seguida, vamos remover o &lt;strong&gt;--watch&lt;/strong&gt; do script de testes, ficando com `&lt;code&gt;"test": "jest"&lt;/code&gt;, para que o Travis não fique travado quando rodar os testes na pipeline, podemos também fazer um script novo para o Travis na pipeline, fique a vontade.&lt;/p&gt;

&lt;p&gt;Vamos comitar e fazer o &lt;strong&gt;git push&lt;/strong&gt;, já vamos perceber que o Travis esta rodando automaticamente:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fw1s912c72tcfj9e1bhx4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fw1s912c72tcfj9e1bhx4.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos fazer a mesma configuração nas &lt;strong&gt;regras&lt;/strong&gt; que fizemos com o Cypress, vamos à aba de &lt;strong&gt;Settings&lt;/strong&gt;, depois em &lt;strong&gt;Branches&lt;/strong&gt;, precisamos editar a regra que já tínhamos adicionando mais um &lt;strong&gt;status check&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fr6rwjuchz8nnk1ww1f6h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fr6rwjuchz8nnk1ww1f6h.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E com isso, configuramos o Travis para rodar nossos testes unitários no momento do pull request:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Figpvz73emkss0ghkegv9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Figpvz73emkss0ghkegv9.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusão
&lt;/h3&gt;

&lt;p&gt;Bom, chegamos ao fim, eu queria concluir dizendo que sei que o texto ficou longo, espero que não massivo, mas minha intenção é expor o que estou aprendendo e aperfeiçoando, ao longo do meu aprendizado, vi poucos conteúdos em português dos assuntos que eu abordei aqui então espero que ajude a comunidade Brasileira nesse sentido, qualquer dúvida é só entrar em contato comigo pelo &lt;a href="https://twitter.com/caiomdias_" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Vou deixar o link para o repositório do projeto que construímos e as referências que usei para construção do projeto:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/caiomdias/starter-next-example" rel="noopener noreferrer"&gt;projeto de exemplo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nextjs.org/docs/getting-started" rel="noopener noreferrer"&gt;Next&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=1nVUfZg2dSA&amp;amp;ab_channel=Rocketseat" rel="noopener noreferrer"&gt;Configuração de projeto Next pela rocketseat&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.typescriptlang.org/" rel="noopener noreferrer"&gt;Typescript&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://eslint.org/docs/user-guide/getting-started" rel="noopener noreferrer"&gt;EsLint&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://styled-components.com/docs" rel="noopener noreferrer"&gt;StyledComponents&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=QdfjWRc4ySA&amp;amp;t=645s&amp;amp;ab_channel=DevSoutinho" rel="noopener noreferrer"&gt;vantagens do styled components pelo Dev Soutinho&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/vercel/next.js/tree/master/examples/with-styled-components" rel="noopener noreferrer"&gt;Template do Next.JS usando styled components&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/twopluszero/next-images" rel="noopener noreferrer"&gt;Next Image&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/airbnb/babel-plugin-inline-react-svg" rel="noopener noreferrer"&gt;React inline SVG&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jestjs.io/docs/en/getting-started" rel="noopener noreferrer"&gt;Jest&lt;/a&gt;&lt;br&gt;
&lt;a href="https://segredo.dev/configurar-testes-no-nextjs/" rel="noopener noreferrer"&gt;Artigo - Configurar testes no Next.JS&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.cypress.io/guides/overview/why-cypress.html#In-a-nutshell" rel="noopener noreferrer"&gt;Cypress&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=gTRMuWCp8mE&amp;amp;t=1593s&amp;amp;ab_channel=Agilizei" rel="noopener noreferrer"&gt;Cypress pelo Agilize&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.travis-ci.com/" rel="noopener noreferrer"&gt;Travis CI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mais uma vez obrigado a todos que gostaram e espero ter ajudado, não esqueça de deixar seu feedback.&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
