<?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>Forem: Marcelle Vargas</title>
    <description>The latest articles on Forem by Marcelle Vargas (@marcellevargas).</description>
    <link>https://forem.com/marcellevargas</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%2F946250%2F74915e87-9def-4ddf-a480-d7e4144f77dc.jpg</url>
      <title>Forem: Marcelle Vargas</title>
      <link>https://forem.com/marcellevargas</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/marcellevargas"/>
    <language>en</language>
    <item>
      <title>Discovering React’s useCallback</title>
      <dc:creator>Marcelle Vargas</dc:creator>
      <pubDate>Mon, 28 Oct 2024 20:16:44 +0000</pubDate>
      <link>https://forem.com/marcellevargas/discovering-reacts-usecallback-mnd</link>
      <guid>https://forem.com/marcellevargas/discovering-reacts-usecallback-mnd</guid>
      <description>&lt;p&gt;There are several React hooks, and recently, while studying, I found that this hook deserves more of my attention.&lt;/p&gt;

&lt;p&gt;But before diving into what useCallback actually is, let’s start with a preliminary question: What exactly is a hook?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is a hook?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Informally, hooks can be thought of as the “components” of business logic. When you need to execute the same logic in multiple places, you can isolate that logic in a hook and call it from any part of your system. This concept also applies to React’s native hooks.&lt;/p&gt;

&lt;p&gt;Now that we understand that hooks are encapsulated logics meant for reuse, we can move on to the second topic necessary to understand useCallback: React’s rendering process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How does React.js render components?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;React introduced the component-based architecture pattern in a very efficient way, where each part of your interface can be isolated and reused within the system. This significantly improved the organization and maintenance of web systems. To render these components, they need to be called within a parent component that functions as your page.&lt;/p&gt;

&lt;p&gt;So far, this setup isn’t problematic, but it still doesn’t solve the performance issue, as every state change requires updating the entire page. There are other approaches to address this issue, depending on the context, but today we’ll focus on useCallback.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So, what does&lt;/strong&gt;  &lt;strong&gt;useCallback do?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Basically, it’s a hook that caches your function, preventing it from being recreated unnecessarily. It will only be executed again if one of its dependencies changes (similar to useEffect).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example with code&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let’s create a counter where the user can click a button to increment a value and also increase the interval step.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useState, useCallback } from "react";

const ChildComponent = React.memo(({ onIncrement }) =&amp;gt; {
  console.log("ChildComponent rendered");
  return (
    &amp;lt;div&amp;gt;
      &amp;lt;button onClick={onIncrement}&amp;gt;Increment in Child&amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
  );
});

function ParentComponent() {
  const [count, setCount] = useState(0);
  const [otherState, setOtherState] = useState(false);
  const [incrementStep, setIncrementStep] = useState(1);

  const incrementWithoutCallback = () =&amp;gt; {
    setCount((prevCount) =&amp;gt; prevCount + incrementStep);
  };

  console.log("ParentComponent rendered");

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;h1&amp;gt;Counter: {count}&amp;lt;/h1&amp;gt;

      &amp;lt;h2&amp;gt;Without useCallback&amp;lt;/h2&amp;gt;
      &amp;lt;ChildComponent onIncrement={incrementWithoutCallback} /&amp;gt;

      &amp;lt;button onClick={() =&amp;gt; setOtherState(!otherState)}&amp;gt;
        Toggle Other State
      &amp;lt;/button&amp;gt;

      &amp;lt;button onClick={() =&amp;gt; setIncrementStep((prev) =&amp;gt; prev + 1)}&amp;gt;
        Increase Increment Step
      &amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default ParentComponent;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example above, the child component is rendered each time there is a change in the parent component.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmu4qk0elsaj5aaoysjw6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmu4qk0elsaj5aaoysjw6.png" width="620" height="750"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useState, useCallback } from "react";

const ChildComponent = React.memo(({ onIncrement }) =&amp;gt; {
  console.log("ChildComponent rendered");
  return (
    &amp;lt;div&amp;gt;
      &amp;lt;button onClick={onIncrement}&amp;gt;Increment in Child&amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
  );
});

function ParentComponent() {
  const [count, setCount] = useState(0);
  const [otherState, setOtherState] = useState(false);
  const [incrementStep, setIncrementStep] = useState(1);

  const incrementWithCallback = useCallback(() =&amp;gt; {
    setCount((prevCount) =&amp;gt; prevCount + incrementStep);
  }, [incrementStep]);

  console.log("ParentComponent rendered");

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;h1&amp;gt;Counter: {count}&amp;lt;/h1&amp;gt;

      &amp;lt;h2&amp;gt;With useCallback&amp;lt;/h2&amp;gt;
      &amp;lt;ChildComponent onIncrement={incrementWithCallback} /&amp;gt;

      &amp;lt;button onClick={() =&amp;gt; setOtherState(!otherState)}&amp;gt;
        Toggle Other State
      &amp;lt;/button&amp;gt;

      &amp;lt;button onClick={() =&amp;gt; setIncrementStep((prev) =&amp;gt; prev + 1)}&amp;gt;
        Increase Increment Step
      &amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default ParentComponent;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When we use useCallback, the child component will only re-render when the dependency changes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdj9rzmdmek40ljhfgsuh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdj9rzmdmek40ljhfgsuh.png" width="601" height="594"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I hope this text has helped you better understand how useCallback works.&lt;/p&gt;

&lt;p&gt;Hi, my name is Marcelle, and I’m a web developer. :)&lt;/p&gt;

&lt;p&gt;I’ve been working in tech since 2016, and I’m passionate about what I do. That’s why I’m always studying and sharing my study notes in the form of articles.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/marcellevargas" rel="noopener noreferrer"&gt;marcellevargas - Overview&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>reacthook</category>
      <category>hooks</category>
    </item>
    <item>
      <title>Descobrindo o useCallback do React</title>
      <dc:creator>Marcelle Vargas</dc:creator>
      <pubDate>Mon, 28 Oct 2024 20:10:40 +0000</pubDate>
      <link>https://forem.com/marcellevargas/descobrindo-o-usecallback-do-react-464o</link>
      <guid>https://forem.com/marcellevargas/descobrindo-o-usecallback-do-react-464o</guid>
      <description>&lt;p&gt;Existem vários hooks do React e recentemente estudando achei que esse hook merece uma atenção maior da minha parte.&lt;/p&gt;

&lt;p&gt;Mas antes de entrar efetivamente no que seria o useCallback, vamos começar com uma pergunta anterior. O que seria um hook ?&lt;/p&gt;

&lt;h4&gt;
  
  
  O que é um hook ?
&lt;/h4&gt;

&lt;p&gt;Hooks de forma informal, podemos dizer que seriam os “componentes” das regras de negócio. Quando você precisa executar a mesma lógica em mais de um lugar, você pode isolar essa lógica em um hook e chamar ela em qualquer área do seu sistema. Essa conceito também pode ser extendido aos hooks nativos do React.&lt;/p&gt;

&lt;p&gt;Agora que entendemos que hooks são lógicas encapsuladas para serem reutilizadas nós podemos ir para o segundo tópico necessário para entender o useCallback que é o processo de renderização do React.&lt;/p&gt;

&lt;h4&gt;
  
  
  Como o React.js renderiza os componentes?
&lt;/h4&gt;

&lt;p&gt;O React introduziu de forma muito eficiente o padrão de arquitetura de componentização, onde cada parte da sua interface pode ser isolada e reaproveitada no sistema. Isso facilitou muito a organização e a manutenção de sistemas web, para você renderizar esses componentes eles precisam ser chamados em um componente pai que se comporta como a sua página.&lt;/p&gt;

&lt;p&gt;Até o momento esse cenário não é ruim, mas você ainda não consegue resolver o problema de performance pois a cada alteração de estado você precisar atualizar toda a página. E para resolver isso existem outras abordagens dependendo do contexto, mas hoje vamos trazer um destaque para o useCallback.&lt;/p&gt;

&lt;h4&gt;
  
  
  Enfim, o que o useCallback faz ?
&lt;/h4&gt;

&lt;p&gt;Basicamente ele é um hook que cria um cache da sua função e evita que ela seja recriada sem necessidade pois ela só vai ser executada novamente quando houver uma alteração em uma das dependências (assim como o useEffect faz).&lt;/p&gt;

&lt;h4&gt;
  
  
  Exemplo com código
&lt;/h4&gt;

&lt;p&gt;Vamos criar um código de contador aonde o usuário pode clicar em um botão para incrementar um valor e também aumentar o valor do intervalo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useState, useCallback } from "react";

const ChildComponent = React.memo(({ onIncrement }) =&amp;gt; {
  console.log("ChildComponent renderizado");
  return (
    &amp;lt;div&amp;gt;
      &amp;lt;button onClick={onIncrement}&amp;gt;Incrementar no Filho&amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
  );
});

function ParentComponent() {
  const [count, setCount] = useState(0);
  const [otherState, setOtherState] = useState(false);
  const [incrementStep, setIncrementStep] = useState(1);

  const incrementWithoutCallback = () =&amp;gt; {
    setCount((prevCount) =&amp;gt; prevCount + incrementStep);
  };

  console.log("ParentComponent renderizado");

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;h1&amp;gt;Contador: {count}&amp;lt;/h1&amp;gt;

      &amp;lt;h2&amp;gt;Sem useCallback&amp;lt;/h2&amp;gt;
      &amp;lt;ChildComponent onIncrement={incrementWithoutCallback} /&amp;gt;

      &amp;lt;button onClick={() =&amp;gt; setOtherState(!otherState)}&amp;gt;
        Toggle Other State
      &amp;lt;/button&amp;gt;

      &amp;lt;button onClick={() =&amp;gt; setIncrementStep((prev) =&amp;gt; prev + 1)}&amp;gt;
        Aumentar Passo de Incremento
      &amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default ParentComponent;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No exemplo de cima, o componente filho é renderizado a cada alteração que acontece no componente pai&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1omeokyf8tclno7i9xlo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1omeokyf8tclno7i9xlo.png" width="618" height="743"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useState, useCallback } from "react";

const ChildComponent = React.memo(({ onIncrement }) =&amp;gt; {
  console.log("ChildComponent renderizado");
  return (
    &amp;lt;div&amp;gt;
      &amp;lt;button onClick={onIncrement}&amp;gt;Incrementar no Filho&amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
  );
});

function ParentComponent() {
  const [count, setCount] = useState(0);
  const [otherState, setOtherState] = useState(false);
  const [incrementStep, setIncrementStep] = useState(1);

  const incrementWithCallback = useCallback(() =&amp;gt; {
    setCount((prevCount) =&amp;gt; prevCount + incrementStep);
  }, [incrementStep]);

  console.log("ParentComponent renderizado");

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;h1&amp;gt;Contador: {count}&amp;lt;/h1&amp;gt;

      &amp;lt;h2&amp;gt;Com useCallback&amp;lt;/h2&amp;gt;
      &amp;lt;ChildComponent onIncrement={incrementWithCallback} /&amp;gt;

      &amp;lt;button onClick={() =&amp;gt; setOtherState(!otherState)}&amp;gt;
        Toggle Other State
      &amp;lt;/button&amp;gt;

      &amp;lt;button onClick={() =&amp;gt; setIncrementStep((prev) =&amp;gt; prev + 1)}&amp;gt;
        Aumentar Passo de Incremento
      &amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default ParentComponent;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quando usamos o useCallback ele só irá atualizar o componente filho quando a dependência sofrer uma alteração&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Femj295mh4jeb599q4qbp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Femj295mh4jeb599q4qbp.png" width="604" height="610"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Espero que esse texto tenha te ajudado a entender melhor como funciona o useCallback.&lt;/p&gt;

&lt;p&gt;Oi, meu nome é Marcelle e eu sou desenvolvedora web :)&lt;br&gt;&lt;br&gt;
Eu trabalho com tecnologia desde 2016, mas eu sou apaixonada pelo que faço. Por isso eu estou sempre estudando e compartilhando as minhas anotações de estudo em forma de artigo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/marcellevargas" rel="noopener noreferrer"&gt;marcellevargas - Overview&lt;/a&gt;&lt;/p&gt;

</description>
      <category>hooks</category>
      <category>react</category>
      <category>web</category>
    </item>
    <item>
      <title>Secure Front-End Development</title>
      <dc:creator>Marcelle Vargas</dc:creator>
      <pubDate>Wed, 10 Apr 2024 13:48:33 +0000</pubDate>
      <link>https://forem.com/marcellevargas/secure-front-end-development-2phk</link>
      <guid>https://forem.com/marcellevargas/secure-front-end-development-2phk</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnej2zxnnuwyj2vu7k1yt.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnej2zxnnuwyj2vu7k1yt.jpeg" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;html tag&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Front-end development is a crucial area for &lt;a href="https://arctouch.com/services/web-developers" rel="noopener noreferrer"&gt;web developers&lt;/a&gt;, standing out for its ability to create interactive and appealing user interfaces. This area encompasses a variety of technologies and tools, enabling developers to work in an agile and efficient way, implementing innovative functionalities that enhance the user experience. However, in addition to focusing on performance, accessibility, and usability, front-end developers must adopt secure development practices to ensure the protection and privacy of users.&lt;/p&gt;
&lt;h3&gt;
  
  
  Attacks Originating from the Front-end
&lt;/h3&gt;

&lt;p&gt;Certain types of cyber attacks can originate from the front-end if it is developed with some vulnerabilities. Gaining an understanding of how to enhance the security of an application necessitates a comprehension of some attacks that may stem from the front-end.&lt;/p&gt;
&lt;h4&gt;
  
  
  Cross-Site Scripting (XSS)
&lt;/h4&gt;

&lt;p&gt;Cross-Site Scripting (XSS) attacks are exploited through vulnerabilities in web applications, allowing external malicious code to be injected and executed in the context of the original application. This type of attack can have serious consequences, including the leakage of sensitive information, both from the system and from users interacting with the compromised site. This potential vulnerability puts the integrity and confidentiality of data at risk, making it essential to implement appropriate security measures to protect applications against this type of threat.&lt;/p&gt;
&lt;h4&gt;
  
  
  Cross-Site Request Forgery (CSRF)
&lt;/h4&gt;

&lt;p&gt;Cross-Site Request Forgery (CSRF) attacks occur when authenticated users in a system are manipulated to perform unwanted actions without their knowledge. In these attacks, the malicious script is not directly inserted into the target system. Instead, these attacks exploit the active sessions of users, using cookies stored in the browser. This causes the system to mistake the malicious requests as legitimate, originating from the users themselves, leading to the execution of unauthorized actions.&lt;/p&gt;
&lt;h4&gt;
  
  
  Insecure Direct Object References (IDOR)
&lt;/h4&gt;

&lt;p&gt;Insecure Direct Object References (IDOR) is a vulnerability that occurs when a web application exposes direct references to internal data. This allows attackers to access or manipulate data that they should not have access to, by exploiting these references. Essentially, IDOR violates access restrictions and permissions, enabling the attacker to view or modify information beyond their authorized permission scope.&lt;/p&gt;
&lt;h3&gt;
  
  
  Fortifying the Front-end
&lt;/h3&gt;

&lt;p&gt;Although the front-end alone cannot ensure the full security and integrity of a system, this article aims to explore ways in which the front-end can significantly contribute to the security of applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CSP Configuration&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CSP (Content Security Policy) is a policy that, when configured on the front-end, informs the browser about the origin of the scripts it can execute, disregarding external scripts. Ideally, this configuration should be implemented both on the back-end and the front-end, but if that’s not possible, adding it on the front-end will already contribute to making users more secure when accessing your site.&lt;/p&gt;

&lt;p&gt;Recognizing the need to ensure user security, since 2016, the W3C has been advising developers to implement these configurations. To set it up in React.js, you can add a meta tag in the index.html file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;meta http-equiv="Content-Security-Policy" content="default-src 'self'"&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Using Cookies Securely&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I think many people, upon reading about the vulnerability in the use of cookies, might consider stopping their use. Therefore, I need to emphasize that one of the principles of secure development is not the sole use of one practice, but rather a combination of practices that involve all areas of the development process. However, focusing on cookies, using them securely requires that some configurations be made on the back-end (such as Anti-CSRF Tokens and adding the ‘samesite’ attribute to cookies).&lt;/p&gt;

&lt;p&gt;On the front-end, as a way to ensure the security of the application, do not store sensitive data in cookies and use them only as a means to enhance the user experience, such as storing their usage preferences.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use of Local Storage&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Local storage is often used in day-to-day development, but the data stored in it and the way it is stored require some care, as it is possible to access the information through JavaScript. Therefore, avoid storing sensitive information and, if you need to store session tokens, opt for tokens that expire.&lt;/p&gt;

&lt;p&gt;For example, assume you are working on the front-end of a sales system and will store the session token to ensure that the user has access to the sales area of the system. Within the system, to ensure that this user can have access, it will be necessary to present a credential (a token) whenever information is requested. Ideally, this token should be generated and managed by the backend and needs to contain an expiration date. This way, on the front necessary, this token will be sent to the back end to validate that it is still valid.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function verifyToken(apiUrl, key) {
    const token = localStorage.getItem(key);
    if (!token) {
        return;
    }

    fetch(apiUrl, {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
            'Authorization': token
        }
    })
    .then(response =&amp;gt; {
        if (response.status === 498) {
            localStorage.removeItem(key);
            return;
        } else if(response.status === 200) {
            return token;
        } else {
            console.log('Received unexpected status:', response.status);
            return;
        }
    })
    .catch(error =&amp;gt; {
        console.error(error);
    });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Input Sanitization&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Input sanitization is a fundamental practice in the development of secure applications, especially in terms of front-end security. This process involves cleaning and validating data entered by users to prevent vulnerabilities, such as SQL injection or Cross-Site Scripting (XSS) attacks.&lt;/p&gt;

&lt;p&gt;By sanitizing inputs, potentially malicious characters are removed or escaped, ensuring that only safe and correctly formatted data are processed by the application. This approach not only protects the system against malicious manipulations but also preserves the integrity of the data and maintains the reliability of the user interface, being a critical component for the security and stability of modern web applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tools to Help You Ensure Security
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;DOMPurify&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;DOMPurify plays a role in input security, which is an effective measure to mitigate the risks associated with the injection of malicious scripts, such as Cross-Site Scripting (XSS) attacks. This JavaScript library specializes in sanitizing HTML content, efficiently removing potentially dangerous elements and attributes.&lt;/p&gt;

&lt;p&gt;By integrating DOMPurify into an application, developers can ensure that any content entered by users, such as comments or form entries, is cleansed of harmful scripts before being rendered in the browser. This not only protects the application but also enhances user safety, preventing the execution of malicious code and maintaining the integrity of the user interface.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3xqhgeb7xenw3ifgu225.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3xqhgeb7xenw3ifgu225.png" width="720" height="503"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;DOMPurify library&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NPM Audit&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The npm audit command is a built-in npm command that helps to check all dependencies installed in the project, to validate security vulnerabilities that have already been identified. When executed, it compares the versions of the packages used with a database of known security vulnerabilities and generates a detailed report. This report not only identifies vulnerable libraries but also presents alternatives to help with replacement and how to update to safer versions.&lt;/p&gt;

&lt;p&gt;This functionality is extremely valuable for developers, as it helps to maintain the integrity and security of their applications, alerting them to potential risks and facilitating the management of vulnerable dependencies. Additionally, npm audit is a fundamental tool in continuous integration (CI) processes, contributing to the automation of vulnerability identification in the early stages of the development cycle.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Falpj7wwilux4g56q33vn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Falpj7wwilux4g56q33vn.png" width="722" height="395"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;npm audit documentation&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Library for Anti-CSRF Tokens&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Depending on the project’s requirements, it may be necessary to store some information such as cookies on the server, and an alternative to do this securely, in addition to configuring the meta tag, is to use the csfr library.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1e9flvdko1k4q8qtckt3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1e9flvdko1k4q8qtckt3.png" width="715" height="347"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;CSFR library&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Front-end development security is an area where the adoption of safe practices becomes fundamental, integrating them from the beginning of the development process. Strategies such as the implementation of CSP, secure use of cookies, effective management of local storage, and sanitization of inputs are crucial steps for the protection of user data and the integrity of web applications.&lt;/p&gt;

&lt;p&gt;With the introduction of AI tools in development, developers need to be even more attentive to the codes generated, adopting a critical approach in implementation to ensure security. This continuous process requires vigilance and constant updating, ensuring that applications not only impress with functionality and design but also stand out for their robust security.&lt;/p&gt;

&lt;p&gt;At &lt;a href="https://arctouch.com" rel="noopener noreferrer"&gt;ArcTouch&lt;/a&gt;, we help companies create engaging and secure apps, websites, and connected experiences. See some of &lt;a href="https://arctouch.com/portfolio" rel="noopener noreferrer"&gt;our work&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;References&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://owasp.org/www-community/attacks/xss/" rel="noopener noreferrer"&gt;Cross Site Scripting (XSS)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://owasp.org/www-community/attacks/csrf" rel="noopener noreferrer"&gt;Cross Site Request Forgery (CSRF)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cheatsheetseries.owasp.org/cheatsheets/Insecure_Direct_Object_Reference_Prevention_Cheat_Sheet.html" rel="noopener noreferrer"&gt;Insecure Direct Object Reference Prevention - OWASP Cheat Sheet Series&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://content-security-policy.com/" rel="noopener noreferrer"&gt;Content-Security-Policy (CSP) Header Quick Reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.w3.org/TR/CSP2/" rel="noopener noreferrer"&gt;Content Security Policy Level 2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>webdev</category>
      <category>cybersecurity</category>
      <category>bestpractices</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Formação gratuita para novos desenvolvedores</title>
      <dc:creator>Marcelle Vargas</dc:creator>
      <pubDate>Wed, 31 Jan 2024 16:25:07 +0000</pubDate>
      <link>https://forem.com/marcellevargas/formacao-gratuita-para-novos-desenvolvedores-3mp0</link>
      <guid>https://forem.com/marcellevargas/formacao-gratuita-para-novos-desenvolvedores-3mp0</guid>
      <description>&lt;p&gt;Olá pessoas ! &lt;br&gt;
A Fundação Bradesco está com inscrições abertas para cursos de programação de nível iniciante.&lt;/p&gt;

&lt;h2&gt;
  
  
  Python 🐍
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.ev.org.br/cursos/linguagem-de-programacao-python-basico" rel="noopener noreferrer"&gt;Python - Básico&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ev.org.br/cursos/criando-um-projeto-com-interface-grafica-utilizando-a-linguagem-python" rel="noopener noreferrer"&gt;Criando uma interface gráfica com Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ev.org.br/cursos/desenvolvimento-orientado-a-objetos-utilizando-a-linguagem-python" rel="noopener noreferrer"&gt;Desenvolvendo um Projeto Completo Python com Estruturas de Dados&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ev.org.br/cursos/Desenvolvendo-um-Projeto-Completo-Python-com-Estruturas-de-Dados" rel="noopener noreferrer"&gt;Desenvolvimento Orientado a Objetos Utilizando a Linguagem Python&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Mobile :mobile_phone:
&lt;/h2&gt;

&lt;p&gt;-&lt;a href="https://www.ev.org.br/cursos/desenvolvendo-aplicacoes-mobile-com-android-studio" rel="noopener noreferrer"&gt;Desenvolvendo Aplicações Mobile com Android Studio&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conteúdos gerais sobre programação 💻
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.ev.org.br/cursos/introducao-a-programacao-orientada-a-objetos-poo" rel="noopener noreferrer"&gt;Introdução a POO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ev.org.br/cursos/projetos-de-sistemas-de-ti" rel="noopener noreferrer"&gt;Projetos de Sistemas de TI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Web 🛜
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.ev.org.br/cursos/crie-um-site-simples-usando-html-css-e-javascript" rel="noopener noreferrer"&gt;Crie um site simples usando HTML, CSS e JavaScript&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>curso</category>
      <category>javascript</category>
      <category>python</category>
    </item>
    <item>
      <title>Criando meu primeiro Widget para o Notion</title>
      <dc:creator>Marcelle Vargas</dc:creator>
      <pubDate>Wed, 03 Jan 2024 18:44:04 +0000</pubDate>
      <link>https://forem.com/marcellevargas/criando-meu-primeiro-widget-para-o-notion-191i</link>
      <guid>https://forem.com/marcellevargas/criando-meu-primeiro-widget-para-o-notion-191i</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2AUoqEbYmrPOVgn8Tr" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2AUoqEbYmrPOVgn8Tr" width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Photo by Sigmund on Unsplash&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Notion é uma ferramenta que faz parte do meu dia a dia, toda a minha vida é organizada nele. E algo que sempre me chamou a atenção foram os widgets que podemos adicionar nele. E recentemente eu descobri uma forma de criar os meus e é isso que nós vamos fazer nesse artigo.&lt;/p&gt;
&lt;h4&gt;
  
  
  Pré-requisitos
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Ter o node.js instalado&lt;/li&gt;
&lt;li&gt;Ter uma conta no github&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Setup do projeto
&lt;/h4&gt;

&lt;p&gt;Criar um projeto react&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx create-react-app notion-clock-widget
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instalar a bibioteca react-gh-pages (ela irá agilizar o processo de deploy no Github pages)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install gh-pages --save-dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Criando o componente de relógio
&lt;/h4&gt;

&lt;p&gt;Vamos começar criando a estrutura básica de um function component&lt;br&gt;
&lt;/p&gt;

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

import React from 'react';
function Relogio() 
  return (
    &amp;lt;div&amp;gt;
      &amp;lt;h2&amp;gt;relogio&amp;lt;/h2&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default Relogio;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E como estamos criando um relógio eu preciso que ele sempre me mostre o horário atualizado. Para isso vamos utilizar dois hooks do react o useState (para armazenar a hora) e o useEffect (para manter a atualização do estado mesmo depois da página ser renderizada).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useState, useEffect } from 'react';

function Relogio() {
  const [horarioAtual, setHorarioAtual] = useState(new Date());

  useEffect(() =&amp;gt; {
    const timerID = setInterval(() =&amp;gt; updateTime(), 1000);

    return function cleanup() {
      clearInterval(timerID);   
    };
  }, []);

  function updateTime() {
    setHorarioAtual(new Date());
  }

  return (
    &amp;lt;div className='clock-container'&amp;gt;
      &amp;lt;h2&amp;gt;{horarioAtual.toLocaleTimeString()}&amp;lt;/h2&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default Relogio;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como um relógio tem atualizações a cada 1s nós usamos a função setInterval para chamar a função que irá realizar a atualização do estado do relógio.&lt;/p&gt;

&lt;h4&gt;
  
  
  Fazendo o deploy no Github Pages
&lt;/h4&gt;

&lt;p&gt;Com o código criado vamos fazer a configuração para o deploy. No arquivo package.json logo abaixo de version adicione o nome “homepage” e na URL substitua pelo seu nome de usuário e o nome do repositório criado.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  "name": "my-app",
  "version": "0.1.0",
+ "homepage": "https://{SEU NOME DE USUARIO}.github.io/{NOME DO REPOSITÓRIO}",
  "private": true,
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois adicione os comandos de deploy e predeploy em “scripts”&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"scripts": {
   "predeploy": "npm run build",
   "deploy": "gh-pages -d build",
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quando finalizar faça o commit dessas alterações e o push para o repositório remoto.&lt;/p&gt;

&lt;h4&gt;
  
  
  Configurando o Github pages
&lt;/h4&gt;

&lt;p&gt;No Github abra o seu repositório e vá em settings e depois em pages e em “Build and deployment” altere a branch para “gh-pages” e a pasta para “/root”.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flhtsf0i6mt742km98pek.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flhtsf0i6mt742km98pek.png" width="800" height="514"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Tela do github para configuração do Github Pages&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Importando o widget no Notion
&lt;/h4&gt;

&lt;p&gt;Com a url que foi gerada para o seu site, abra o notion e adicione o bloco “integrar”&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvhmkiv11pyjex3v8uh4n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvhmkiv11pyjex3v8uh4n.png" width="372" height="465"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;tela do notion&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;E cole o link que foi utilizado na “homepage” do seu package.json, se tudo funcionar você vai ter um relógio parecido com esse&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffhe75ilui8yum2los4i2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffhe75ilui8yum2los4i2.png" width="800" height="343"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Captura da tela do Notion com o widget&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Se você gostou desse artigo e quer utilizar esse widget, você encontra o link para ele e outras coisas mais na minha página&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marcellevargas.bio" rel="noopener noreferrer"&gt;Marcelle Vargas&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fonte&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Biblioteca React Gh Pages&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/gitname/react-gh-pages" rel="noopener noreferrer"&gt;GitHub - gitname/react-gh-pages: Deploying a React App (created using create-react-app) to GitHub Pages&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Imagem do Bulbasauro, por &lt;a href="https://br.pinterest.com/dgolsd90/" rel="noopener noreferrer"&gt;Dhiogo Luis&lt;/a&gt; (&lt;a href="https://pin.it/2FJguai" rel="noopener noreferrer"&gt;https://pin.it/2FJguai&lt;/a&gt;)&lt;/p&gt;

</description>
      <category>github</category>
      <category>react</category>
      <category>notion</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Clube de leitura para Devs✨</title>
      <dc:creator>Marcelle Vargas</dc:creator>
      <pubDate>Tue, 26 Dec 2023 19:11:44 +0000</pubDate>
      <link>https://forem.com/marcellevargas/clube-de-leitura-para-devs-2pi4</link>
      <guid>https://forem.com/marcellevargas/clube-de-leitura-para-devs-2pi4</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2AOhqNqYwXAktUl947" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2AOhqNqYwXAktUl947" width="800" height="532"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Photo by Vladyslav Bahara on Unsplash&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A oportunidade de interagir com pessoas do setor de tecnologia sempre foi fundamental para o meu crescimento e evolução como desenvolvedora. Inspirada por essa experiência, decidi criar o Clube de Leitura para Devs. Este clube não apenas incentiva o hábito da leitura, mas também se dedica ao estudo de temas frequentemente negligenciados na rotina diária, porém essenciais para aprimorar suas habilidades de programação. É um espaço para descobrir e explorar aspectos vitais da nossa profissão, contribuindo para o desenvolvimento contínuo de cada membro como um programador mais competente e versátil.&lt;/p&gt;

&lt;h4&gt;
  
  
  E como esse clube irá funcionar ?
&lt;/h4&gt;

&lt;p&gt;Em um canal do Telegram (&lt;a href="https://t.me/clubedeleituraparadevs" rel="noopener noreferrer"&gt;link para o grupo&lt;/a&gt;) eu vou compartilhar as informações da leitura da semana e também um material complementar para você se aprofundar no tópico da semana. E pensando também nas semanas corridas que podem acontecer com todos nós, eu vou disponibilizar também um resumo das páginas da semana, dessa forma você vai poder acompanhar e participar dos debates.&lt;/p&gt;

&lt;p&gt;Caso você goste de utilizar o Notion para organizar a sua vida pessoal, também temos um template gratuito no grupo do telegram para você organizar o seu processo de estudo.&lt;/p&gt;

&lt;h4&gt;
  
  
  Preciso ter algum conhecimento prévio para participar ?
&lt;/h4&gt;

&lt;p&gt;Não vai ser necessário e a ideia é ser um ambiente seguro para tirar dúvidas. Caso você leia algo e não entenda, você pode perguntar porque a ideia é ser um espaço livre e respeitoso.&lt;/p&gt;

&lt;h4&gt;
  
  
  Precisa pagar algo para participar ?
&lt;/h4&gt;

&lt;p&gt;Não temos taxa de mensalidade nem nada do tipo, a única coisa que pode acontecer é em algum momento ser necessário comprar algum livro. Mas geralmente eu sou adepta a livros que estejam disponíveis de forma gratuita, assim vamos conseguir democratizar o acesso ao conteúdo.&lt;/p&gt;

&lt;h4&gt;
  
  
  Quando irá começar ?
&lt;/h4&gt;

&lt;p&gt;Vamos começar no dia 02/01/2024 e no grupo do telegram você já encontra o link para baixar o livro. Durante o mês de janeiro iremos ler Algoritmos — Um Guia Ilustrado Para Programadores e Outros Curiosos do autor (Aditya Y. Bhargava).&lt;/p&gt;

&lt;p&gt;Todos os links você encontra no meu agregador de links abaixo&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marcellevargas.bio" rel="noopener noreferrer"&gt;marcellevargas - Link in Bio &amp;amp; Creator Tools | Beacons&lt;/a&gt;&lt;/p&gt;

</description>
      <category>softwaredevelopment</category>
      <category>development</category>
      <category>computerscience</category>
      <category>reading</category>
    </item>
    <item>
      <title>Next.js 14 as novidades dessa nova versão</title>
      <dc:creator>Marcelle Vargas</dc:creator>
      <pubDate>Wed, 01 Nov 2023 19:54:51 +0000</pubDate>
      <link>https://forem.com/marcellevargas/nextjs-14-as-novidades-dessa-nova-versao-1o7c</link>
      <guid>https://forem.com/marcellevargas/nextjs-14-as-novidades-dessa-nova-versao-1o7c</guid>
      <description>&lt;p&gt;Em outubro de 2023, foi anunciado a nova versão do Next.js 14 e algumas features bem interessantes para facilitar o trabalho dos desenvolvedores e a experiências dos usuários. Dentre elas duas me chamaram bastante atenção principalmente para quem utiliza o Next.js junto com algum CMS para gestão de conteúdo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm6lfni1zue3emnogd812.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm6lfni1zue3emnogd812.png" width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Streaming de Server Rendering Components
&lt;/h4&gt;

&lt;p&gt;O Next.js já permite a renderização dos componentes de UI no servidor, através do SSC (&lt;em&gt;Server Static Components&lt;/em&gt;), e isso fez com que a experiência do usuário melhora-se bastante. Pois ao abrir uma página web o navegador já encontra parte dos componentes prontos para ser exibido sem a necessidade de aguardar o processamento desses componentes a cada requisição. Mas essa forma que melhorou a experiência do usuário, tem alguns problemas. E o principal deles é a dificuldade de tornar o conteúdo desses componentes dinâmicos.&lt;/p&gt;

&lt;p&gt;É dessa forma que o Streaming Server Rendering auxilia para trabalhar com componentes de conteúdo dinâmicos, causando menos impacto nos scores de performance de SEO das páginas. Dessa forma quando o componente termina de ser renderizado no servidor ele é disponibilizado para o navegador do usuário (algo “parecido” com o lazy loading).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2dp7l11ilnk0trhk4qzr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2dp7l11ilnk0trhk4qzr.png" width="649" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Suspense Components
&lt;/h4&gt;

&lt;p&gt;É bem comum hoje em dia páginas web apresentarem animações em quanto carregam os conteúdos dos sites. Dessa forma a experiência do usuário é menos impactada em quanto os dados são processados. Pensando nisso o Next.js criou um componente chamado Suspense que recebe como propriedade um outro componente com uma estrutura de UI que é exibida em quando a página é carregada.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2br7s8pkj4o6mwo17bca.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2br7s8pkj4o6mwo17bca.png" width="622" height="302"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A equipe do Next.js ainda recomenda o uso do componente Suspense junto com o Streaming Server Rendering, para melhorar a performance do site na perspectiva de SEO.&lt;/p&gt;

&lt;p&gt;Outras duas novidades anunciadas no evento para essa nova versão são melhorias no componente de Imagem e a mudança para um novo compilador, o SWC que estaria substituindo o Babel. Mas essas duas novidades eu vou dedicar artigos específicos para eles.&lt;/p&gt;

&lt;p&gt;Fontes&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nextjs.org/docs/app/building-your-application/rendering/server-components#streaming" rel="noopener noreferrer"&gt;Server Components&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nextjs.org/docs/architecture/nextjs-compiler" rel="noopener noreferrer"&gt;Next.js Compiler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nextjs.org/docs/app/building-your-application/routing/loading-ui-and-streaming" rel="noopener noreferrer"&gt;Loading UI and Streaming&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>next14</category>
      <category>webdev</category>
      <category>nextjs</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Code Challenge — 1</title>
      <dc:creator>Marcelle Vargas</dc:creator>
      <pubDate>Mon, 30 Oct 2023 16:44:28 +0000</pubDate>
      <link>https://forem.com/marcellevargas/code-challenge-1-22cl</link>
      <guid>https://forem.com/marcellevargas/code-challenge-1-22cl</guid>
      <description>&lt;h3&gt;
  
  
  Code Challenge — 1
&lt;/h3&gt;

&lt;p&gt;Criando um componente de modal usando React.js&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2A-6bVQ63_IDw5afua" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2A-6bVQ63_IDw5afua" width="800" height="800"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Photo by Goran Ivos on Unsplash&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Procurando praticar mais programação eu estarei publicando uma série de artigos explicando qual foi a solução desenvolvida e disponibilizando o código em cada desafio. E o desafio dessa semana é criar um componente de modal usando React.js com as seguintes condições:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O conteúdo da modal precisa ser passado por props&lt;/li&gt;
&lt;li&gt;O usuário precisa conseguir fechar a modal através de um botão&lt;/li&gt;
&lt;li&gt;O texto do botão também precisa ser passado por props&lt;/li&gt;
&lt;li&gt;O usuário precisa conseguir fechar a modal ao clicar fora da caixa&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Criando a estrutura do componente
&lt;/h3&gt;

&lt;p&gt;A primeira coisa que eu vou fazer então vai ser criar um arquivo para o componente de modal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// src/modal.js
const Modal = () =&amp;gt; 
  return (
    &amp;lt;div&amp;gt;
      Modal
    &amp;lt;/div&amp;gt;
  );
};

export default Modal;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois de criar o componente eu vou adicionar no App.js esse componente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import "./styles.css";
import Modal from "./modal";

export default function App() {
  return (
    &amp;lt;div className="App"&amp;gt;
      &amp;lt;Modal/&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para atender aos requisitos do desafio, eu preciso criar um componente que receba as seguintes propriedades(props):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Um texto que será exibido como conteúdo da modal&lt;/li&gt;
&lt;li&gt;Um texto para o botão
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const Modal = (props) =&amp;gt; {
  if (!props.isOpen) return null;

  const handleClickOutside = (e) =&amp;gt; {
    if (e.target === e.currentTarget) {
      props.closeModal();
    }
  };
  return (
    &amp;lt;div className="modal-container" onClick={handleClickOutside}&amp;gt;
      &amp;lt;div className="modal-content"&amp;gt;
        {props.content}
        &amp;lt;button onClick={props.closeModal}&amp;gt;{props.buttonLabel}&amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};

export default Modal;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como as props são um objeto, eu posso fazer a desestruturação e selecionar as propriedades que eu vou precisar usar(além de tornar o código mais legível).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const Modal = ({ content, buttonLabel}) =&amp;gt; {
  if (!isOpen) return null;

  const handleClickOutside = (e) =&amp;gt; {
    if (e.target === e.currentTarget) {
      closeModal();
    }
  };
  return (
    &amp;lt;div className="modal-container" onClick={handleClickOutside}&amp;gt;
      &amp;lt;div className="modal-content"&amp;gt;
        {content}
        &amp;lt;button onClick={closeModal}&amp;gt;{buttonLabel}&amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};

export default Modal;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E no App.js eu vou adicionar essas propriedades ao &lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;Modal
  content={"Hey! Eu sou uma modal."}
  buttonLabel={"fechar"}
/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Entendendo o CSS
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Estrutura do HTML
&lt;/h4&gt;

&lt;p&gt;Para essa modal eu criei uma estrutura com 2 &lt;em&gt;divs,&lt;/em&gt; onde a div principal (modal-container) irá ser responsável por posicionar o elemento na tela e a div interna (modal-content) vai ser responsável por posicionar os elementos da modal.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp46sgq150leziaziho49.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp46sgq150leziaziho49.png" width="647" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  CSS da div principal
&lt;/h4&gt;

&lt;p&gt;Como a ideia dessa div é auxiliar no posicionamento da modal na tela, ela precisa ter o tamanho total da tela e não pode ser afetado pelo restante dos elementos do site. Para isso vamos usar a propriedade “position” e outras propriedades, mas ela é a mais importante.&lt;/p&gt;

&lt;p&gt;Um elemento com “position:fixed” passa a ser posicionado de acordo com a janela de visualização, não seguindo mais o posicionamento herdado pelos elementos mais altos da hierarquia.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.modal-container {
  display: flex;
  width: 100%;
  height: 100%;
  flex-direction: row;
  justify-content: center;
  align-items: center;
  background-color: rgba(0, 0, 0, 0.7);
  position: fixed;
  top: 0;
  left: 0;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  CSS da caixa de modal
&lt;/h4&gt;

&lt;p&gt;Esse elemento tem um CSS simples então eu vou apenas liberar o código abaixo&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.modal-content {
  display: flex;
  flex-direction: column;
  background-color: white;
  border: 1px solid black;
  padding: 30px;
  border-radius: 5%;
}

.modal-content button {
  border: none;
  margin-top: 5px;
  padding: 5px 0px;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Usando hooks para controlar a exibição da modal
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Hooks&lt;/em&gt; são funções javascript que são encapsuladas pela biblioteca do React.js. Permitindo que você economize tempo no processo de desenvolvimento. E para o componente de modal, eu vou usar o hook de useState() para me ajudar a controlar quando a modal deve, ou não, ser exibida. Como eu não quero que a página abra com a modal aberta, eu já adicionei o valor padrão como false.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import "./styles.css";
import Modal from "./modal";
import { useState } from "react";

export default function App() {
  const [statusModal, setModalStatus] = useState(false);

  return (
    &amp;lt;div className="App"&amp;gt;
      &amp;lt;Modal
        content={"Hey! Eu sou uma modal."}
        buttonLabel={"fechar"}
      /&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois disso eu vou editar o componente de modal e adicionar duas propriedades: uma para gerenciar o status da modal e uma para que a modal possa ser fechada quando ela já estiver aberta. Dessa forma o componente da modal ficaria dessa forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// app.js
&amp;lt;Modal
  content={"Hey! Eu sou uma modal."}
  buttonLabel={"fechar"}
  isOpen={statusModal}
  closeModal={() =&amp;gt; setModalStatus(false)}
/&amp;gt;

// modal.js
const Modal = ({ content, buttonLabel, isOpen, closeModal }) =&amp;gt; {
  if (!isOpen) return null;

  return (
    &amp;lt;div className="modal-container" onClick={handleClickOutside}&amp;gt;
      &amp;lt;div className="modal-content"&amp;gt;
        {content}
        &amp;lt;button onClick={closeModal}&amp;gt;{buttonLabel}&amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};

export default Modal;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A propriedade &lt;em&gt;“isOpen”&lt;/em&gt; irá receber o valor do state declaro no App.js, como ele é um &lt;em&gt;booleano&lt;/em&gt; caso o valor dele esteja como false ao invés de retornar o componente eu retorno &lt;em&gt;null&lt;/em&gt; e a modal não é exibida na tela. Já a propriedade “&lt;em&gt;closeModal”&lt;/em&gt; ela recebe a função closeModal() declarada no App.js, e quando essa função é executada ela altera o estado da Modal para false.&lt;/p&gt;

&lt;p&gt;Espero que tenham gostado e que esse artigo possa te ajudar de alguma forma :)&lt;/p&gt;

&lt;p&gt;O link para o código completo do componente:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/media/efe34736edbd64881f77c4172e717ceb/href" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://medium.com/media/efe34736edbd64881f77c4172e717ceb/href" rel="noopener noreferrer"&gt;https://medium.com/media/efe34736edbd64881f77c4172e717ceb/href&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>react</category>
      <category>reacthook</category>
    </item>
    <item>
      <title>Sanity CMS, uma alternativa aos altos custos de hospedagem</title>
      <dc:creator>Marcelle Vargas</dc:creator>
      <pubDate>Mon, 18 Sep 2023 11:53:57 +0000</pubDate>
      <link>https://forem.com/marcellevargas/sanity-cms-uma-alternativa-aos-altos-custos-de-hospedagem-19md</link>
      <guid>https://forem.com/marcellevargas/sanity-cms-uma-alternativa-aos-altos-custos-de-hospedagem-19md</guid>
      <description>&lt;p&gt;Existem diversos frameworks e CMS’s disponíveis para utilizar e alguns de forma gratuita, desde que você pague um serviço de hospedagem. E é justamente nesse ponto em que o Sanity se diferencia dos demais.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2AUUV91KZXhmLAwMFw" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2AUUV91KZXhmLAwMFw" width="800" height="532"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Photo by Anete Lūsiņa on Unsplash&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  O que é o Sanity ?
&lt;/h4&gt;

&lt;p&gt;O Sanity é um CMS(Content Management System), feito em JavaScript que permite que você organize o conteúdo de um site usando a estrutura de schemas, algo similar ao que é feito no GraphQL e no Strapi (outro CMS javascript). O Sanity também tem suporte para typescript.&lt;/p&gt;

&lt;h4&gt;
  
  
  Quais as vantagens de utilizar de utilizar o Sanity ?
&lt;/h4&gt;

&lt;p&gt;1- Modelagem de conteúdo de acordo com o site&lt;/p&gt;

&lt;p&gt;Assim como outros CMS feitos em JavaScript, a possibilidade de modelar o conteúdo de acordo com o site não é algo inovador, mas eu considero um ponto importante na escolha de um CMS.&lt;/p&gt;

&lt;p&gt;2- Ter mais de um nível de usuário nos planos gratuitos&lt;/p&gt;

&lt;p&gt;Ter a possibilidade de criar um usuário com permissão de administrador e um de editor, ainda no plano gratuito, me permite como desenvolvedora testar como determinadas funções serão exibidas para o usuário final. No plano gratuito, você tem a opção de criar 3 usuários com a role de editor e a quantidade de usuários da role de administrador são ilimitados. Outro detalhe importante é que inclusive os usuários com a role de editor, tem a opção de fazer login via SSO (sem custo adicional).&lt;/p&gt;

&lt;p&gt;3- “Generous usage quota”&lt;/p&gt;

&lt;p&gt;Nos últimos meses eu tenho procurado diversas alternativas de CMSs gratuitos para testar funcionalidades de desenvolvimento com frameworks como o Next.js. E de vários CMSs que eu testei esse realmente é o que tem a maior cota de uso no plano gratuito. Permitindo o armazenamento de imagens utilizando inclusive a CDN.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgzeolwsnsox1spn0ghh4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgzeolwsnsox1spn0ghh4.png" width="800" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Essas são as minhas impressões iniciais e se você dev, está procurando uma ferramenta para desenvolver sem precisar investir alto em ferramentas apenas para estudo. Esse CMS pode ser uma boa opção até o momento.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.sanity.io/" rel="noopener noreferrer"&gt;Sanity: The Composable Content Cloud&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>nextjs</category>
      <category>cms</category>
      <category>sanityio</category>
    </item>
    <item>
      <title>Next.js: bests practices for optimizing your website for search engines</title>
      <dc:creator>Marcelle Vargas</dc:creator>
      <pubDate>Mon, 19 Jun 2023 17:20:19 +0000</pubDate>
      <link>https://forem.com/marcellevargas/nextjs-bests-practices-for-optimizing-your-website-for-search-engines-4pik</link>
      <guid>https://forem.com/marcellevargas/nextjs-bests-practices-for-optimizing-your-website-for-search-engines-4pik</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F37axm7l5k1gqim5l6fa7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F37axm7l5k1gqim5l6fa7.png" alt="three people working with SEO" width="700" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SEO is one of the fundamentals of digital marketing and is essential if you want to sell something on the web, whether it’s an idea or a product. Robots, such as those used by Google to rank pages in search engines, have specific requirements for selecting content, and the key to success is optimization. As developers, we need to create a webpage that helps customers achieve these goals. But the question is, how do we do this? In this article, we will discuss tips on how to improve the SEO of web pages using one of the most popular frameworks of the moment, Next.js.&lt;/p&gt;

&lt;h4&gt;
  
  
  Friendly URL’s
&lt;/h4&gt;

&lt;p&gt;Prefer simple, logical URLs. When setting up a URL for a page, avoid using IDs, random numbers, underscores, or multiple words without separating them. This will increase the chances that your content will reach the intended user. Next.js automatically generates user-friendly URLs. When we create a file inside the “pages” folder, Next.js generates a URL for that page with the same path we defined on that page. Therefore, we should choose intuitive names for our pages.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Good Practice
https://mywebsite.com/articles/how-to-be-developer

// Bad Practice
https://mywebsite.com/articles/how_to_be_developer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Semantic HTML
&lt;/h4&gt;

&lt;p&gt;If you want your site to appear more easily on search pages, you need to develop sites with semantic HTML. Google uses HTML tags to find content and index it correctly. In addition to the use focused on SEO and semantic HTML accessibility, it is part of the Clean Code practices for HTML. If you want to understand more about semantic HTML, I recommend reading the article below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/arctouch/clean-html-1acda5c0326e" rel="noopener noreferrer"&gt;Clean HTML&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Use an Open Graph on your project
&lt;/h4&gt;

&lt;p&gt;Creating optimized content is not only important for the Google search engine, but it is also important for social networks. To help us create an optimized structure for social networks, Facebook created the Open Graph. The Open Graph Protocol is a set of meta-tags that allows any web page to have content optimized for sharing on social networks. The tag list below is very useful for different types of content. Remember to focus on keywords when configuring this content.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;og:title - The title optimized for SEO
og:description - The description of your content optimized for SEO
og:image - An URL of image for sharing.
og:url - The canonical URl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here is an example of how to configure this in Next.js.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div&amp;gt;
  &amp;lt;title&amp;gt;Product Title&amp;lt;/title&amp;gt;

  &amp;lt;meta property="og:title" content="The title optimized for SEO" /&amp;gt;
  &amp;lt;meta
    property="og:description"
    content="Description of your content optimized for SEO"
  /&amp;gt;
  &amp;lt;meta
    property="og:image"
    content="An URL of image for sharing"
  /&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Generate a sitemap.xml (next-sitemap)
&lt;/h4&gt;

&lt;p&gt;The sitemap file contains data about links within our website and when this internal content has been modified. This file helps Google index pages and not forget any important ones. But now maybe you think, “Well, Google robots are not working too well?” Calm down, this recommendation is not for every case. Google lists these three topics to assess whether using sitemap.xml is recommended:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Large sites
For Google, large sites have more than 500 pages, and it’s more difficult to ensure that every page has links from at least one other page. In this case, GoogleBot may not find new pages.&lt;/li&gt;
&lt;li&gt;New website and if your website has few external links
Google’s crawler finds new sites more easily by following links from page to page. When your site is new, GoogleBot might not find it.&lt;/li&gt;
&lt;li&gt;Your site has a lot of rich content (like images and videos)
It is recommended to include this information in the sitemap to help Google with search.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Optimize Images
&lt;/h4&gt;

&lt;p&gt;The SEO of a page is calculated based on some metrics, such as LCP — Largest Contentful Paint. LCP is calculated by taking the largest text or image element present on the page and evaluating how long that element takes to load after the page starts loading, for having a good score the indicated is 2,5 seconds or less. To help with this score, Next.js has a component called next/image. This component wraps the HTML “img” tag and adds some very useful properties to improve SEO score. The trick here is in your larger image you add a bracket called “priority”. This makes your image preloaded and ready to use when the user opens the page. In addition, the next/image component has other properties that can improve the user experience, such as the placeholder that has the blur value, which presents the user with either a blurred image or a color box.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fglkl2u8o5nio4ntysyni.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fglkl2u8o5nio4ntysyni.png" alt="flowers image before loading" width="719" height="474"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff0zhr0ilw65twuwhkvrc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff0zhr0ilw65twuwhkvrc.png" alt="flowers image after loading" width="706" height="469"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Lazy imports
&lt;/h4&gt;

&lt;p&gt;React proposes that we create components to organize our web page and separate the code in the project. But when we need to use multiple components on one page, sometimes it makes the page load slow and affects the SEO score. To avoid this, Next.js has a component called Dynamic(). This component causes the loading of certain components to be loaded only when necessary, reducing the number of components that will be initially loaded. Let’s assume that your site will display a completely different banner on some pages. Using the Next.js dynamic import, managing the use of this component becomes simpler.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import dynamic from 'next/dynamic';

const CustomBanner= dynamic(() =&amp;gt; import('../components/customBannerComponent'));

export default function Home() {
  return &amp;lt;CustomBanner/&amp;gt;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Optimize third-party scripts
&lt;/h4&gt;

&lt;p&gt;Likewise, we have an image component to help us with preloading images, we have a component called Scripts. This component enables us management some life cycles to improve performance, using a property called strategy. This property can receive three values (beforeInteractive, afterInteractive, lazyOnload) to define when this script will be executed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; &amp;lt;Script src="https://coolscript.com/coolscript.js" strategy="beforeInteractive" /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>marketing</category>
      <category>nextjs</category>
      <category>bestpractices</category>
      <category>seo</category>
    </item>
    <item>
      <title>Promises()</title>
      <dc:creator>Marcelle Vargas</dc:creator>
      <pubDate>Tue, 28 Mar 2023 22:06:14 +0000</pubDate>
      <link>https://forem.com/marcellevargas/promises-d8a</link>
      <guid>https://forem.com/marcellevargas/promises-d8a</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2A5ngnfuQbzDGYB-TB" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2A5ngnfuQbzDGYB-TB" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;According to the MDN Web Docs “ &lt;em&gt;A promise is a&lt;/em&gt; &lt;a href="https://pt.wikipedia.org/wiki/Proxy" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;em&gt;proxy&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt; &lt;em&gt;for a value not necessarily known&lt;/em&gt; “. In other words, a promise is an intermediary between the web application and the server.&lt;/p&gt;

&lt;h3&gt;
  
  
  How does a Promise work?
&lt;/h3&gt;

&lt;p&gt;To understand how a promise works let’s analyze the fetch function. Fetch is a JavaScript function for performing HTTP requests. And when we make an HTTP request the first thing fetch() returns us is a promise object with a status of pending, because the fetch is making us a “promise” that the request was made and that it will return us with the server’s response.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fetch('https://jsonplaceholder.typicode.com/todos/1') .then( console.log(response.json()))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then the second return is effectively the server response&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fetch('https://jsonplaceholder.typicode.com/todos/1') .then( console.log(response.json())) .then( console.log(json))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why use?
&lt;/h3&gt;

&lt;p&gt;1- Simplified Error Management: Promises allow you to catch errors in an easier and more organized way compared to nested callbacks. Instead of dealing with multiple levels of nested callbacks, Promises can use a single function catch() to handle all errors in one place.&lt;/p&gt;

&lt;p&gt;2- More readability and less nesting: Using Promises can improve code readability as Promises allow code to be written in a more logical and linear sequence rather than using nested callbacks which can make code difficult to read . This can make the code easier to understand and maintain.&lt;/p&gt;

&lt;p&gt;3- More modular and reusable code: Promises can be easily used in multiple places in the code and can be chained together to create control flows in a modular way. This makes the code more reusable and easier to maintain and update over time. Additionally, Promises can be used in conjunction with other JavaScript functionality such as async/await to create more efficient and cleaner code.&lt;/p&gt;

&lt;p&gt;In other articles we will talk more about synchronous functions with async/await.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at&lt;/em&gt; &lt;a href="https://marcellecode.com/promises-en" rel="noopener noreferrer"&gt;&lt;em&gt;https://marcellecode.com&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>How to make a Health Site Bot</title>
      <dc:creator>Marcelle Vargas</dc:creator>
      <pubDate>Wed, 22 Mar 2023 22:15:12 +0000</pubDate>
      <link>https://forem.com/marcellevargas/how-to-make-a-health-site-bot-41pl</link>
      <guid>https://forem.com/marcellevargas/how-to-make-a-health-site-bot-41pl</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fukj184m7r2zkxvsmpw8b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fukj184m7r2zkxvsmpw8b.png" width="800" height="420"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;banner how to make a health site bot&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  When we create a website be it for a client or personal, it’s important to guarantee the service is up. Thinking help with this, that’s the objective of this article. With that in mind, let’s create a bot using Node.js to let us know when our site responds to HTTP Status other than 200.
&lt;/h3&gt;
&lt;h3&gt;
  
  
  Step 1: Start the project
&lt;/h3&gt;

&lt;p&gt;The first step of our project is to create the folder of our bot, so insert this line of code below on your terminal&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir health-site-bot &amp;amp;&amp;amp; cd health-site-bot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we’ll run a command for Node.js to create the basic structure necessary to run the project&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm init -y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If everything is ok, now we’ll be creating the two files to define our bot.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;touch config.js &amp;amp;&amp;amp; touch server.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Install the Libraries
&lt;/h3&gt;

&lt;p&gt;Run all the lines below on your terminal&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm i dotenv &amp;amp;&amp;amp; npm i express &amp;amp;&amp;amp; npm i nodemailer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Editing Config.js
&lt;/h3&gt;

&lt;p&gt;Let’s import the dotenv and path libraries, and export the global variables EMAIL and PASSWORD.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const dotenv = require("dotenv");
const path = require("path");

dotenv.config({
  path: ".env",
});

module.exports = {
  EMAIL: process.env.EMAIL,
  PASS: process.env.SENHA
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Create a .env file
&lt;/h3&gt;

&lt;p&gt;The .env file is a file that saves information like credentials. With this method, we can make configurations for the production and development environments just set what .env file I want to use.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#.env
EMAIL=email@teste.com
PASS=123456
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;How the .env file serves to store credentials it’s not so good if you save this on your repository. In the next step, we’ll configure the .gitignore to remove this file from our repository and prevent accidental commits.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Configure .gitignore file
&lt;/h3&gt;

&lt;p&gt;In this file we’ll add a name of two files for git not add when we make a commit.&lt;br&gt;
&lt;/p&gt;

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

node_modules
.env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 6: Create a serve.js file
&lt;/h3&gt;

&lt;p&gt;The serve.js is a file we use to configure our bot. So, the first thing we’ll do is, import the necessary libraries.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//serve.js
const nodemailer = require("nodemailer");
const config = require("./config.js");
const moment = require("moment");
const https = require("https");
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After that, we create a constant variable for storing the URL application we want to monitor.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const url = "https://www.google.com/"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this URL defined, we can create a function for making requests HTTP to verify the status. If this status is not equal to 200, we’ll call a function to notify us.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function healthCheck() {
  https.get(_url, function (res) {
    if (res.statusCode !== 200) {
      _sendMail();
    }
  });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this tutorial, our bot notifies us by e-mail. So, let’s create a function called “_sendMail()”&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function _sendMail(statusHTTP) {
  var transporter = nodemailer.createTransport({
    host: "HOST_EMAIL",
    auth: {
      user: config.EMAIL,
      pass: config.SENHA,
    },
  });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the above code, we use a function from nodemailer to create a connection with e-mail host. The username and password used in this file are imported from the .env file, they are the email account data we will use to send the notifications.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var mailOptions = {
    from: "YOUR_EMAIL",
    to: "EMAIL_RECEIVE",
    subject: `ERROR WITH ${url}`,
    text: `Oops! Your service is having problems.
           Problem description:
           Received code: ${statusHTTP}`,
  };
  transporter.sendMail(mailOptions, function (error, info) {
    if (error) {
      console.log(error);
    }
  });
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The last part of our script is to create a function for call _sendMail if the website return status different than 200.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function healthCheck() {
  https.get(_url, function (res) {
    if (res.statusCode !== 200) {
      _sendMail();
    }
  });
}

healthCheck();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At this moment, the serve.js file is like this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const nodemailer = require("nodemailer");
const config = require("./config.js");
const https = require("https");

const _url = 'URL_APP';

function _sendMail(statusHTTP) {
  var transporter = nodemailer.createTransport({
    host: "HOST_EMAIL",
    auth: {
      user: config.EMAIL,
      pass: config.SENHA,
    },
  });
  var mailOptions = {
    from: "SEU_EMAIL",
    to: "EMAIL_DO_REMETENTE",
    subject: `ERROR WITH ${url}`,
    text: `Oops! Your service is having problems.
           Problem description:
           Received code: ${statusHTTP}`,
  };
  transporter.sendMail(mailOptions, function (error, info) {
    if (error) {
      console.log(error);
    }
  });
}

function healthCheck() {
  https.get(_url, function (res) {
    if (res.statusCode !== 200) {
      _sendMail();
    }
  });
}

healthCheck();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="http://www.buymeacoffee.com/marcellecode" rel="noopener noreferrer"&gt;MarcelleCode is digital content creator about web development&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>development</category>
      <category>node</category>
    </item>
  </channel>
</rss>
