<?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: Gabriel Duete</title>
    <description>The latest articles on DEV Community by Gabriel Duete (@gabrielduete).</description>
    <link>https://dev.to/gabrielduete</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%2F510676%2Fa544af9f-935e-4147-bf01-a544b046ffc8.png</url>
      <title>DEV Community: Gabriel Duete</title>
      <link>https://dev.to/gabrielduete</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gabrielduete"/>
    <language>en</language>
    <item>
      <title>The Art of Lazy Loading: How to improve your frontend app performance. (Next.js/React)</title>
      <dc:creator>Gabriel Duete</dc:creator>
      <pubDate>Mon, 17 Feb 2025 12:55:51 +0000</pubDate>
      <link>https://dev.to/gabrielduete/the-art-of-lazy-loading-how-to-improve-your-frontend-app-performance-nextjsreact-4h5l</link>
      <guid>https://dev.to/gabrielduete/the-art-of-lazy-loading-how-to-improve-your-frontend-app-performance-nextjsreact-4h5l</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;You noted that your application is freezing at certain times or showing poor performance? Maybe using lazy loading can resolve your performance problems.&lt;/p&gt;

&lt;p&gt;Lazy Loading is a performance optimization strategy. With this strategy, we ensure that some resources are loaded only when they are really needed, when they are about to enter the page's viewport (visible area).&lt;/p&gt;

&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;By default we can use Lazy Loading in Javascript, CSS, Fonts, Images and iframes.&lt;/p&gt;

&lt;p&gt;We can instantiate the loading attribute on an &lt;code&gt;img&lt;/code&gt; or &lt;code&gt;iframe&lt;/code&gt; element:&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%2F71u1kqx5sncswurvi1uo.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%2F71u1kqx5sncswurvi1uo.png" alt="example-attribute_loading.html" width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With this, we are able to instruct the browser that we need the loading of this element to be delayed until it arrives in the browser's viewport.&lt;/p&gt;

&lt;h1&gt;
  
  
  Lazy Loading in Nextjs
&lt;/h1&gt;

&lt;p&gt;Using nextjs, things work differently, we have two main native strategies that we can use to create components with lazy loading, but I want to add one more to make our lives easier:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nextjs.org/docs/pages/building-your-application/optimizing/lazy-loading#nextdynamic" rel="noopener noreferrer"&gt;Dynamic Imports&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://react.dev/reference/react/lazy" rel="noopener noreferrer"&gt;Lazy - React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/react-lazy-load" rel="noopener noreferrer"&gt;react-lazyload&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Dynamic Imports
&lt;/h1&gt;

&lt;p&gt;With the Dynamic Imports of Nextjs, we can do dynamic imports, very useful for when a React component is not required in the initial page loading.&lt;/p&gt;

&lt;p&gt;A good example of use is in feedback components such as modes or alerts, are usually displayed after some particular user action, so why load it in the initial load?&lt;/p&gt;

&lt;p&gt;We can only import it when it is really necessary!&lt;/p&gt;

&lt;p&gt;Let's see an example where I have a button component and a Snackbar component of the material ui. After clicking the snackbar button should be opened with a warning:&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%2Fmny2gzxqeek3itovxdr4.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%2Fmny2gzxqeek3itovxdr4.png" alt="code" width="800" height="1094"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Result:&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%2Fvgf51ji9vr6fj00w6qyc.gif" 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%2Fvgf51ji9vr6fj00w6qyc.gif" alt="Code Result on Web Application" width="500" height="598"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can see that the Snackbar and Alert component is initially charged on the page, but is it only used if the user clicks the button, so why load it initially? What if the user doesn't click the button?Snackbar and Alert loading becomes useless.&lt;/p&gt;

&lt;p&gt;Let's look at Build's time, pay attention to the first point of Size and First Load 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuwhnnhg46rn2thj1xnqj.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%2Fuwhnnhg46rn2thj1xnqj.png" alt="Image showing the build of a Nextjs application" width="586" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;OK. Now let's make the same page, but using dynamic imports on Snackbar and Alert, after all they should only be charged if the click the button is done.&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%2Fq73g9cu49o3ujejs22xp.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%2Fq73g9cu49o3ujejs22xp.png" alt="Example code using dynamic imports from next.js" width="800" height="1160"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Same result:&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%2F3jee9bnacpc9idqfm01l.gif" 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%2F3jee9bnacpc9idqfm01l.gif" alt="Code Result on Web Application" width="512" height="592"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Build:&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%2F6kn8w0dslvp44uq6hayl.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%2F6kn8w0dslvp44uq6hayl.png" alt="Image showing the build of a Nextjs application" width="633" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can see that the size of the size of First Load JS fell sponsoly!&lt;/p&gt;

&lt;p&gt;From &lt;code&gt;43 KB&lt;/code&gt; to &lt;code&gt;35.6 KB&lt;/code&gt;&lt;br&gt;
And from &lt;code&gt;148 KB&lt;/code&gt; to &lt;code&gt;141 KB&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You may be claiming, "But wasn't that little?" We are talking about just one page with a simple functionality and it was already a gain, now imagine the total gains that your site would have if it was more pages?&lt;/p&gt;

&lt;p&gt;Let's calculate the total size for 10 pages before and after optimization:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Before optimization:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Size per page: &lt;strong&gt;43 KB&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Total for 10 pages: &lt;strong&gt;43 KB × 10 = 430 KB&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;After optimization:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Size per page: &lt;strong&gt;35.6 KB&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Total for 10 pages: &lt;strong&gt;35.6 KB × 10 = 356 KB&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Total Savings&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Total reduction:&lt;/strong&gt; 430 KB - 356 KB = &lt;strong&gt;74 KB&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Percentage reduction:&lt;/strong&gt; (74 KB ÷ 430 KB) × 100 ≈ &lt;strong&gt;17.2%&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This shows that in a website with multiple pages, small optimizations can make a significant difference in overall resource consumption and loading speed.&lt;/p&gt;

&lt;p&gt;We have seen how dynamic imports can impact page load times, it's a great and easy resource to use and raise the performance of your projects.&lt;/p&gt;

&lt;h1&gt;
  
  
  Lazy React
&lt;/h1&gt;

&lt;p&gt;We can also use Lazy native react functionality that allows us to make dynamic imports, very similar to the Next.js Dynamic Imports, but has a difference.&lt;/p&gt;

&lt;p&gt;In Lazy, we need to use suspense as the component's father we want to render, and pass a component that in Fallback, which will be shown in a loading while the component is being imported. But this will only happen the first time the component will be imported, the next no longer will be loading, because the component has been loaded, unless the page is recharged, so will have the loading in the first load.&lt;/p&gt;

&lt;p&gt;Let's see in practice:&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%2Fdyi8m0yt6lje5cev6dv7.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%2Fdyi8m0yt6lje5cev6dv7.png" alt="Example code next.js using lazy react" width="800" height="1019"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Result:&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%2Fudehn5nfq9kxtq055yf4.gif" 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%2Fudehn5nfq9kxtq055yf4.gif" alt="Code Result on Web Application" width="472" height="572"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note that in the first click of the button, it was displaying an element with "loading ...", that's what we went through in the component's fallback. But it will be displayed only the first time the component is clicked, and will only be displayed if the page is recharged.&lt;/p&gt;

&lt;p&gt;Ok, but let's see now with data, the impact Lazy had on page 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%2Fvmrqapbfiaibdpk23t6e.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%2Fvmrqapbfiaibdpk23t6e.png" alt="Image showing the build of a Nextjs application" width="737" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note that it had a higher reduction to the Dynamic Imports of Next.js! But on the other hand, it will now have an extra loading component, which can interfere with UX (user experience).&lt;/p&gt;

&lt;p&gt;So this type of practice should be aligned with the design and product team, to understand what type of loading would be used, but it is not recommended, as it can negatively impact user experience, so it is recommended to use only in specific cases, such as For example the page is really slow.&lt;/p&gt;

&lt;h1&gt;
  
  
  React Lazyload
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;React-Lazyload&lt;/code&gt; works slightly different from previous ones, and does not directly impact the initial loading on the page. &lt;code&gt;React-Lazyload&lt;/code&gt; monitors the position of the elements in relation to the page. When a Lazyload Son element is close to Viewport, it is rendered.&lt;/p&gt;

&lt;p&gt;So we can put elements that are heavy to render as the user Scrolla the page.&lt;/p&gt;

&lt;p&gt;Let's see in practice:&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%2Fsbeoxao9npd352j2anyz.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%2Fsbeoxao9npd352j2anyz.png" alt="Example code next.js using react-lazyload" width="800" height="939"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The code basically generates 15 images and displays on the screen, imagine how heavy it would be for the user to download it all at once? With Lazyload, it can download by steps, as you browse the page.&lt;/p&gt;

&lt;p&gt;Result:&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%2Fxmex10qd2o3008sh9lw0.gif" 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%2Fxmex10qd2o3008sh9lw0.gif" alt="Code Result on Web Application" width="800" height="1044"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can see in the Network tab, that the generated images are downloaded while scrolling the page, this brings us a large increase in performance, and ensuring that the user's internet can download everything without bottlenecks.&lt;/p&gt;

&lt;p&gt;Imagine the performance gains we would have in our applications using Lazyload and dynamic imports at the same time? 🤯&lt;/p&gt;

&lt;p&gt;It will surely positiously impact the user's experience, and he will be grateful for using a service without crashes or bottlenecks.&lt;/p&gt;

&lt;p&gt;If you want, you can view the code &lt;a href="https://codesandbox.io/p/sandbox/q44yzd" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;We have seen some valuable practices on how to improve the performance of your applications using Lazy Loading in Next JS, how advantageous it can be for the user's exhibition, load something only when really needed.&lt;/p&gt;

&lt;p&gt;I hope it was clear in the explanations. Any questions can call me to talk, stay with God and good studies! =)&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>performance</category>
      <category>javascript</category>
      <category>react</category>
    </item>
    <item>
      <title>Mastering Compound Components: Building Flexible and Reusable React Components</title>
      <dc:creator>Gabriel Duete</dc:creator>
      <pubDate>Sat, 09 Nov 2024 17:07:01 +0000</pubDate>
      <link>https://dev.to/gabrielduete/mastering-compound-components-building-flexible-and-reusable-react-components-3bnj</link>
      <guid>https://dev.to/gabrielduete/mastering-compound-components-building-flexible-and-reusable-react-components-3bnj</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;One of the most useful and widely used concepts in the world of React is design patterns, as they help keep code scalable and give added meaning to the components we create.&lt;/p&gt;

&lt;p&gt;There are various patterns, and in this article, we’ll discuss &lt;strong&gt;Compound Components&lt;/strong&gt;, an advanced pattern that is especially useful for creating flexible and composable interfaces.&lt;/p&gt;

&lt;h1&gt;
  
  
  What is Compound Components?
&lt;/h1&gt;

&lt;p&gt;Compound Components is an advanced pattern in React. Its goal is to create a more flexible design by enabling the sharing of state and logic among a group of components. This way, communication between the parent component and child components can be achieved in a flexible manner.&lt;/p&gt;

&lt;p&gt;The components work together to achieve certain behaviors without creating complex prop trees or overly complicated logic that would be difficult to refactor or understand in the future.&lt;/p&gt;

&lt;p&gt;This pattern helps eliminate prop drilling, where we pass down a large number of props through several component layers. Prop drilling can be problematic, as it may cause unnecessary re-renders every time the state is updated, since each state change will update all child components.&lt;/p&gt;

&lt;p&gt;An example of Compound Components can be seen in the HTML structure of &lt;code&gt;select&lt;/code&gt; and &lt;code&gt;option&lt;/code&gt; tags:&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%2F1yjykolwr98hxb2xwmf2.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%2F1yjykolwr98hxb2xwmf2.png" alt="image of select and option tags example in html" width="800" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The select element works as the interface’s state manager, while the option elements configure how the select component should function.&lt;/p&gt;

&lt;h1&gt;
  
  
  Example Using Compound Components
&lt;/h1&gt;

&lt;p&gt;In this example, we’ll create a &lt;code&gt;Modal&lt;/code&gt;, which is divided into two compound components: &lt;code&gt;Toggle&lt;/code&gt; and &lt;code&gt;Content&lt;/code&gt;. They will share the open/close state of the modal.&lt;/p&gt;

&lt;p&gt;Let’s walk through how to create this component step by step:&lt;/p&gt;

&lt;p&gt;We can start by creating the context that will manage the open/close state of the 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%2F98nmutvnysllb2gtlvkk.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%2F98nmutvnysllb2gtlvkk.png" alt="Context to modal component" width="800" height="585"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Creating the base of the Modal 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%2Frwgum0ljtz6amax6bv9u.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%2Frwgum0ljtz6amax6bv9u.png" alt="Base of the modal component" width="800" height="486"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Notice that we’re using &lt;code&gt;children&lt;/code&gt; to grab the components that will be placed inside the Modal. We want to use it like this:&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%2F3pywyv641pt9eqkxk6vd.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%2F3pywyv641pt9eqkxk6vd.png" alt="Example of what the component will look like" width="800" height="523"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we need to create the toggle component, which will be responsible for opening the 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%2Fhihluw65x96i2ej5rewd.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%2Fhihluw65x96i2ej5rewd.png" alt="Component Toggle" width="800" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We also need a content component that will be responsible for displaying the Modal’s content:&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%2Fzh70d75ovuabmk6wgzxl.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%2Fzh70d75ovuabmk6wgzxl.png" alt="Component content" width="800" height="657"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, we can add both components to our Modal component, and it’s ready to go! 😊&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%2Fpu4ll3u2len5asysjper.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%2Fpu4ll3u2len5asysjper.png" alt="Using the other components in Modal component" width="800" height="696"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Usage:&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%2Fyxulwjh7h22g723a11ru.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%2Fyxulwjh7h22g723a11ru.png" alt="Using modal component in app" width="800" height="750"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Result:&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%2F9j8d40ids8i8iifbdp5t.gif" 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%2F9j8d40ids8i8iifbdp5t.gif" alt="Visual result of the component’s functionality" width="478" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This way, we make creating and using modals extremely flexible and reusable. &lt;code&gt;Modal.Toggle&lt;/code&gt; is responsible for triggering the modal display, while &lt;code&gt;Modal.Content&lt;/code&gt; should display the modal content.&lt;/p&gt;

&lt;p&gt;This structure allows developers to easily customize the behavior and content of modals according to the specific needs of their applications, making the code cleaner and more organized.&lt;/p&gt;

&lt;h2&gt;
  
  
  Other Examples
&lt;/h2&gt;

&lt;p&gt;We can also use Compound Components in other contexts, such as:&lt;/p&gt;

&lt;p&gt;Accordion components:&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%2Flxnk77ej4kj1d8ha3k4d.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%2Flxnk77ej4kj1d8ha3k4d.png" alt="Example of an accordion component using compound components" width="800" height="486"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Menu components:&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%2Fg47w6mcvosew2alrhk5k.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%2Fg47w6mcvosew2alrhk5k.png" alt="Example of an menu component using compound components" width="800" height="592"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All of these examples are flexible and adaptable, making development, scalability, and component usage easier.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exercise
&lt;/h2&gt;

&lt;p&gt;We noticed that the close button was placed inside the content component, but it would be interesting to have a component dedicated to managing the closing of the modal. You could create something like &lt;code&gt;&amp;lt;Modal.Close&amp;gt;Close&amp;lt;/Modal.Close&amp;gt;&lt;/code&gt;. Try experimenting and adding this component as well!&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;We’ve seen how writing components using the Compound Components pattern can be useful in our applications. We also explored how to implement it and reviewed examples of where this pattern can fit.&lt;/p&gt;

&lt;p&gt;Feel free to explore and experiment with creating components using Compound Components. Use it wisely and assess if it makes sense to apply in your context, as if not implemented well, it could end up being more of a hindrance than a help.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: I posted this same content on &lt;a href="https://github.com/he4rt/react4noobs" rel="noopener noreferrer"&gt;react4noobs&lt;/a&gt;, a BR repository that brings together articles created by developers in the React universe. It’s worth checking out!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>react</category>
      <category>designpatterns</category>
    </item>
    <item>
      <title>Dominando Compound Components: Construindo Componentes React Flexíveis e Reutilizáveis</title>
      <dc:creator>Gabriel Duete</dc:creator>
      <pubDate>Fri, 08 Nov 2024 23:19:16 +0000</pubDate>
      <link>https://dev.to/gabrielduete/dominando-compound-components-construindo-componentes-react-flexiveis-e-reutilizaveis-30e</link>
      <guid>https://dev.to/gabrielduete/dominando-compound-components-construindo-componentes-react-flexiveis-e-reutilizaveis-30e</guid>
      <description>&lt;h1&gt;
  
  
  Introdução
&lt;/h1&gt;

&lt;p&gt;Algo que é muito útil e abrangente no mundo do React são os seus design patterns, pois eles ajudam a manter o código escalável e adicionam significado aos componentes que criamos.&lt;/p&gt;

&lt;p&gt;Existem vários padrões, e neste artigo falaremos sobre Compound Components, um padrão avançado que é especialmente útil para criar interfaces flexíveis e compostas.&lt;/p&gt;

&lt;h1&gt;
  
  
  O Que é Compound Components?
&lt;/h1&gt;

&lt;p&gt;O Compound Components é um padrão avançado em React. Tem como objetivo criar um design mais flexível, permitindo o compartilhamento de estado e lógica entre um grupo de componentes, onde a comunicação entre o componente pai e os componentes filhos devem ser feitas de maneira flexível. &lt;/p&gt;

&lt;p&gt;Os componentes devem trabalhar juntos para realizarem algum comportamento sem criar árvores de props embaraçosas ou uma lógica complexa demais para ser refatorado ou compreendido futuramente.&lt;/p&gt;

&lt;p&gt;Esse padrão nos ajuda a eliminar inflamações de props, onde temos que passar uma árvore de props entre os componentes. Essa injeção de props é um problema, pois pode causar vários re-renders desnecessários a cada estado que for atualizado, já que cada estado irá atualizar todos os componentes filho.&lt;/p&gt;

&lt;p&gt;Temos um exemplo de Compound Components na estrutura do &lt;code&gt;select&lt;/code&gt; e &lt;code&gt;option&lt;/code&gt; das tags em HTML:&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%2F1yjykolwr98hxb2xwmf2.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%2F1yjykolwr98hxb2xwmf2.png" alt="Image description" width="800" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O select funciona como um gerenciador de estados da inferface, enquanto o option são configurados em como o select deve funcionar.&lt;/p&gt;

&lt;h1&gt;
  
  
  Exemplo utilizando Compound Components
&lt;/h1&gt;

&lt;p&gt;Neste exemplo, vamos criar um &lt;code&gt;Modal&lt;/code&gt;, que é dividida em dois componentes compostos: &lt;code&gt;Toggle&lt;/code&gt; e &lt;code&gt;Content&lt;/code&gt;. Onde vão compartilhar o estado de abrir e fechar o modal entre eles.&lt;/p&gt;

&lt;p&gt;Vamos ver como seria criar esse componente passo a passo:&lt;/p&gt;

&lt;p&gt;Podemos começar criando a context responsável por gerênciar o state de abrir e fechar o 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%2F98nmutvnysllb2gtlvkk.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%2F98nmutvnysllb2gtlvkk.png" alt="Image description" width="800" height="585"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Criando a base do componente 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%2Frwgum0ljtz6amax6bv9u.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%2Frwgum0ljtz6amax6bv9u.png" alt="Image description" width="800" height="486"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Perceba que estamos usando children, para pegar os componentes que serão inseridos dentro do Modal, vamos querer usa-lo assim:&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%2Fppvfyksguygycivy7c08.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%2Fppvfyksguygycivy7c08.png" alt="Image description" width="800" height="627"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora precisamos criar o componente toggle, que vai ser responsável por abrir o 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%2Fhihluw65x96i2ej5rewd.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%2Fhihluw65x96i2ej5rewd.png" alt="Image description" width="800" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Também precisamos do componente content que vai ser responsável por exibir o conteúdo do 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%2Fk6yzfjopo05xiy0jutrf.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%2Fk6yzfjopo05xiy0jutrf.png" alt="Image description" width="800" height="649"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Por fim, podemos atribuir os dois ao nosso componente Modal e já ta no jeito (:&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%2Fpu4ll3u2len5asysjper.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%2Fpu4ll3u2len5asysjper.png" alt="Image description" width="800" height="696"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Utilizando&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%2F8x7qfojh9izz5a98d8qs.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%2F8x7qfojh9izz5a98d8qs.png" alt="Image description" width="800" height="727"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Resultado&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%2F30kzdskeo43cv7d9npqu.gif" 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%2F30kzdskeo43cv7d9npqu.gif" alt="Resultado visual do funcionamento do componente" width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Assim, a gente torna a criação e o uso de modais extremamente flexíveis e reutilizáveis. &lt;code&gt;Modal.Toggle&lt;/code&gt; é responsável por ativar a exibição do modal, enquanto &lt;code&gt;Modal.Content&lt;/code&gt; deve exibir o conteúdo do nosso modal.&lt;/p&gt;

&lt;p&gt;Essa estrutura permite que os desenvolvedores personalizem facilmente o comportamento e o conteúdo dos modais de acordo com as necessidades específicas de suas aplicações, tornando o código mais limpo e organizado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Outros exemplos
&lt;/h2&gt;

&lt;p&gt;Também podemos utilizar Compound Components em outros contextos, por exemplo:&lt;/p&gt;

&lt;p&gt;Componentes de Accordion:&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%2F244m0nvbc9b1pljvwzbr.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%2F244m0nvbc9b1pljvwzbr.png" alt="Image description" width="800" height="486"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Componentes de Menu:&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%2Fg47w6mcvosew2alrhk5k.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%2Fg47w6mcvosew2alrhk5k.png" alt="Image description" width="800" height="592"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Todos são flexivéis e adptavéis, facilitando o desenvolvimento, escalabilidade e uso do componente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exercício
&lt;/h2&gt;

&lt;p&gt;Vimos que o botão de fechar ficou dentro do componente do conteúdo, seria interessante ter um componente para gerenciar o fechamento do modal, algo que poderíamos usar como &lt;code&gt;&amp;lt;Modal.Close&amp;gt;Fechar&amp;lt;/Modal.Close/&amp;gt;&lt;/code&gt;, vale a pena dar uma brincada e incluir esse componente também.&lt;/p&gt;

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

&lt;p&gt;Vimos o quanto escrever componentes no padrão Compound Components pode ser útil em nossas aplicações, vimos também como utilizar e alguns exemplos em que esse padrão pode encaixar.&lt;/p&gt;

&lt;p&gt;Fique à vontade para explorar e brincar criando componentes com Compoud Components, use com sabedoria e veja se realmente faz sentido aplicar no seu contexto, as vezes, se não for bem aplicado, ele pode mais atrapalhar doque ajudar.&lt;/p&gt;

&lt;p&gt;OBS: Postei esse mesmo conteúdo no &lt;a href="https://github.com/he4rt/react4noobs" rel="noopener noreferrer"&gt;react4noobs&lt;/a&gt;, repositório destinado a agrupar artigos criados por desenvolvedores no universo do react. Vale a pena conferir =).&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>javascript</category>
      <category>react</category>
      <category>designpatterns</category>
    </item>
    <item>
      <title>Conceitos de internet - HTTP/HTTPS, DNS, DOMÍNIO E SERVIDOR</title>
      <dc:creator>Gabriel Duete</dc:creator>
      <pubDate>Fri, 14 Jul 2023 01:56:40 +0000</pubDate>
      <link>https://dev.to/gabrielduete/conceitos-de-internet-httphttps-dns-dominio-e-servidor-1fke</link>
      <guid>https://dev.to/gabrielduete/conceitos-de-internet-httphttps-dns-dominio-e-servidor-1fke</guid>
      <description>&lt;h1&gt;
  
  
  Conceitos de internet
&lt;/h1&gt;

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

&lt;p&gt;Entender alguns conceitos da internet é crucial no dia a dia de um programador, acredite! Compreender esses termos pode salvar você inúmeras vezes ao resolver problemas em suas tarefas ou ao lidar com situações em produção. Isso o ajudará a identificar rapidamente os problemas e economizar várias horas de trabalho extra.&lt;/p&gt;

&lt;p&gt;Vamos agora explorar os principais e mais básicos conceitos da internet.&lt;/p&gt;

&lt;h1&gt;
  
  
  Funcionamento HTTP
&lt;/h1&gt;

&lt;p&gt;Hipertext Transfer Protocol (Protocolo de transferência de hipertexto) é o protocolo de comunicação utilizado no WWW, ou seja, utilizado na comunicação entre cliente e servidor.&lt;/p&gt;

&lt;p&gt;Vejamos no diagrama a seguir um exemplo simples de uma comunicação HTTP:&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%2F0gdcoe95zpp0l9wcl5wr.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%2F0gdcoe95zpp0l9wcl5wr.png" alt="diagrama de uma comunicação HTTP" width="800" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Perceba que o usuário envia uma requisição de determinados dados pro servidor, essa requisição é denominada de &lt;code&gt;HTTP REQUEST&lt;/code&gt;. Por outro lado, o servidor recebe a requisição feita pelo usuário e retorna uma resposta de acordo, a resposta é denominada de &lt;code&gt;HTTP RESPONSE&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Métodos HTTP
&lt;/h2&gt;

&lt;h3&gt;
  
  
  GET
&lt;/h3&gt;

&lt;p&gt;O método &lt;code&gt;GET&lt;/code&gt; solicita um recurso do serviço/servidor, onde deve ser retornado os dados da requisição. &lt;/p&gt;

&lt;p&gt;Veja a imagem a seguir:&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%2F4bgcqr0qs3v3lmsxt7we.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%2F4bgcqr0qs3v3lmsxt7we.png" alt="mesmo diagrama anterior, mas apontando pro método HTTP REQUEST" width="688" height="464"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Podemos definir o &lt;code&gt;HTTP REQUEST&lt;/code&gt; como um método &lt;code&gt;GET&lt;/code&gt;, que iria solicitar algum dado do servidor ou serviço.&lt;/p&gt;

&lt;h3&gt;
  
  
  HEAD
&lt;/h3&gt;

&lt;p&gt;O método &lt;code&gt;HEAD&lt;/code&gt; é semelhante do &lt;code&gt;GET&lt;/code&gt;, a diferença é que não tem contém o corpo da resposta no response.&lt;/p&gt;

&lt;h2&gt;
  
  
  POST
&lt;/h2&gt;

&lt;p&gt;O &lt;code&gt;POST&lt;/code&gt; é responsável por enviar dados para o serviço, o serviço por sua vez, recebe os dados e armazena.&lt;/p&gt;

&lt;h2&gt;
  
  
  PUT
&lt;/h2&gt;

&lt;p&gt;O método &lt;code&gt;PUT&lt;/code&gt; tem a responsabilidade de atualizar/substituir o dado do serviço. Seria preciso enviar os dados que seriam necessários para atualizar essa entidade. Também é importante saber que é possível criar um recurso em uma entidade usando o &lt;code&gt;PUT&lt;/code&gt;, por exemplo, se tentarmos fazer uma modificação em um usuário com o &lt;code&gt;id 1234&lt;/code&gt;, ele seria criado com todos os dados, e caso existisse, seria modificado.&lt;/p&gt;

&lt;h2&gt;
  
  
  DELETE
&lt;/h2&gt;

&lt;p&gt;O método &lt;code&gt;DELETE&lt;/code&gt; é usado para remover um dado específico.&lt;/p&gt;

&lt;h2&gt;
  
  
  CONNECT
&lt;/h2&gt;

&lt;p&gt;O &lt;code&gt;connect&lt;/code&gt; é o menos utilizado, serve para fazer a conexão entre aplicações que possuem configurações de proxy. Basicamente é utilizado em aplicações com seguranças específicas, onde seria preciso se conectar a um servidor proxy pra seguir com a conexão.&lt;/p&gt;

&lt;h2&gt;
  
  
  OPTIONS
&lt;/h2&gt;

&lt;p&gt;O &lt;code&gt;OPTIONS&lt;/code&gt; é usado para retornar informações do serviço/servidor. É o principal método utilizado em plataformas que realizam &lt;code&gt;deploys&lt;/code&gt; de aplicações, porque é o método responsável por pegar as configurações necessárias para o &lt;code&gt;deploy&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  PATCH
&lt;/h2&gt;

&lt;p&gt;O método &lt;code&gt;PATCH&lt;/code&gt; é semelhante ao &lt;code&gt;PUT&lt;/code&gt;, nele você consegue alterar alguns dados de um recurso, como por exemplo mudar apenas o nome de um usuário, sem a necessidade de passar todos os dados. Além disso, não é possível criar um recurso como no &lt;code&gt;PUT&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  TRACE
&lt;/h2&gt;

&lt;p&gt;O método &lt;code&gt;TRACE&lt;/code&gt; funciona como uma espécie de debug do serviço, é responsável por realizar um teste de &lt;code&gt;loopback&lt;/code&gt; enviando a última &lt;code&gt;request&lt;/code&gt; para o servidor, e percorre a conexão para verificar se ocorreu tudo corretamente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exemplo real
&lt;/h2&gt;

&lt;p&gt;Podemos usar um exemplo real para pegar o método &lt;code&gt;GET&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Se entrarmos na página inicial do Youtube, podemos ir no buscador e fazer a busca por algum vídeo.&lt;/p&gt;

&lt;p&gt;Comecei buscando por ‘’Teste GET’’ e em seguida ele já mostrou algumas sugestões de pesquisa. Se entrarmos na inspecionar elemento e buscar pela aba de Network, conseguimos enxergar as conexões sendo feitas.&lt;/p&gt;

&lt;p&gt;Confira as imagens:&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%2Fus8pxjrfbf043zald05n.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%2Fus8pxjrfbf043zald05n.png" alt="pesquisando Teste GET no buscador do youtube" width="462" height="310"&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%2Ftdlv73ho0obgef4y0zw4.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%2Ftdlv73ho0obgef4y0zw4.png" alt="exibindo o preview da request anterior" width="800" height="380"&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%2Fmjnug7n42unayl5hybsa.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%2Fmjnug7n42unayl5hybsa.png" alt="exibindo resultado da request anterior" width="800" height="196"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Indo em Network, depois clicando na requisição e indo em preview, podemos ver a resposta do servidor ao nosso método GET, que foi responsável por puxar do servidor as informações de sugestão para nossa pesquisa ‘’Teste GET’’. Além do &lt;code&gt;status code&lt;/code&gt; da requisição que retornou 200. &lt;/p&gt;

&lt;h2&gt;
  
  
  HTTPS
&lt;/h2&gt;

&lt;p&gt;A sigla HTTPS vem de "Hypertext Transfer Protocol Secure" ou "Protocolo de Transferência de Hipertexto Seguro". Percebe-se que é bastante semelhante a sigla HTTP, com a diferença do "s" atribuído para segurança.&lt;/p&gt;

&lt;p&gt;O HTTPS oferece uma camada extra de segurança para proteger suas informações utilizando a tecnologia de criptografia TLS/SSL, onde as transferências de dados são criptografadas. Todo e qualquer dado contendo em um site utilizando o HTTPS será codificado em uma mensagem hiper complexa, dessa maneira irá proteger seus dados de serem capturados e decodificados, a não ser que possua a chave de criptografia. Note que na maioria dos sites que utilizam o protocolo HTTPS possuem a flag de ''site seguro'' nos navegadores.&lt;/p&gt;

&lt;p&gt;Para utilizar do protocolo HTTPS em um site é necessário utilizar o certificado SSL nele. Existem algumas maneira de conseguir o certificado, a maioria das plataformas oferecem planos que já contem o certificado SSL, vai da sua preferência a forma de adquiri-lo.&lt;/p&gt;

&lt;h1&gt;
  
  
  Funcionamento DNS
&lt;/h1&gt;

&lt;p&gt;DNS ou Domain Name System(Sistema de nome de Domínio) é um banco de dados responsável por armazenar endereços de sites e traduzi-los para nomes simples.&lt;/p&gt;

&lt;p&gt;Quando hospedamos algo na web, por padrão, o endereço do site é registrado em um IP, como por exemplo: 192.46.254.15. Imagina sempre que ter que fazer uma busca, buscar por esse tipo de nome? Seria péssimo em vários aspectos. Porém com o DNS configurado, ele consegue fazer a conversão desse IP para uma nome que você preferir, contanto que esteja no padrão estabelecido.&lt;/p&gt;

&lt;p&gt;Observe a imagem a seguir:&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%2F6164gdo33m7ajexxkmlp.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%2F6164gdo33m7ajexxkmlp.png" alt="diagrama do funcionamento de um servidor DNS" width="800" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vimos que o navegador faz a requisição da página ‘’www.gabriel.com’’, então o DNS retorna o IP do site, para que o navegador solicite no servidor web uma cópia dos arquivos da página solicitada.&lt;/p&gt;

&lt;p&gt;A entidade responsável por armazenar os endereço de IP é a &lt;strong&gt;Internet Corporation for Assigned Names and Numbers (ICANN),&lt;/strong&gt; em português “Corporação da Internet para Atribuição de Nomes e Números”. A ICANN não possui fins lucrativos e é mantida por vários comitês ao redor do mundo.&lt;/p&gt;

&lt;h1&gt;
  
  
  Funcionamento de um Domínio
&lt;/h1&gt;

&lt;p&gt;Como vimos antes, cada site tem um endereço especifico baseado em IP’s, em que o DNS converte em um nome específico. Podemos dizer que nesse endereço: &lt;code&gt;http://www.meusitehehe.com.br&lt;/code&gt;, tudo que vem depois do &lt;code&gt;www.&lt;/code&gt; seria o domínio do site, ficando &lt;code&gt;meusitehehe.com.br&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;O domínio é como se fosse o endereço físico do seu site. É através dele que os usuários conseguem identifica-lo, sem precisar saber de cabeça o endereço IP dele.&lt;/p&gt;

&lt;p&gt;Para realizar uma hospedagem de um site, precisamos registrar o domínio em uma plataforma, que fica responsável por entrar em contato com ICANN ou RegistroBR e liberar o domínio. Porém existe algumas regras, como por exemplo, o site deve ter um domínio único nunca escolhido antes na web.&lt;/p&gt;

&lt;h2&gt;
  
  
  Domínios nacionais e internacionais
&lt;/h2&gt;

&lt;p&gt;Quando vamos escolher uma plataforma para fazer a hospedagem do nosso site, devemos escolher entre domínios nacionais e Internacionais.&lt;/p&gt;

&lt;h3&gt;
  
  
  Domínios nacional
&lt;/h3&gt;

&lt;p&gt;O domínio brasileiro é coordenado pelo RegistroBR, que é responsável pelo registro e manutenção dos domínios no Brasil, o domínio mais comum tem a terminação &lt;code&gt;.com.br&lt;/code&gt;, também pode se deparar com outros domínios governamentais, como &lt;code&gt;.gov.br&lt;/code&gt;, ou de pessoas físicas como &lt;code&gt;.blog.br&lt;/code&gt;, e &lt;a href="https://registro.br/dominio/categorias/" rel="noopener noreferrer"&gt;por ai vai&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Domínios internacionais
&lt;/h3&gt;

&lt;p&gt;Nos domínios internacionais temos alguns mais conhecidos, como *&lt;em&gt;**&lt;code&gt;.com&lt;/code&gt;, &lt;code&gt;.org&lt;/code&gt;, &lt;code&gt;.net&lt;/code&gt;,&lt;/em&gt;* etc… Lembrando que são mantidos pela ICANN e qualquer site brasileiro pode usar os domínios internacionais.&lt;/p&gt;

&lt;h1&gt;
  
  
  Funcionamento de um Servidor
&lt;/h1&gt;

&lt;h3&gt;
  
  
  O que é?
&lt;/h3&gt;

&lt;p&gt;Basicamente um servidor é uma espécie de computador, só que bem mais potentes do que um comum, com processadores bem mais avançados, além de outros componentes, como banco de memórias, placa mãe, fonte de alimentação, refrigeração, etc…&lt;/p&gt;

&lt;p&gt;Os servidores são úteis para fornecer serviços de maneira centralizada, assim não é necessário realizar os mesmos procedimentos de um serviço em todas as maquinas que usam do mesmo serviço, só é preciso realizar os procedimentos(como instalação do serviço) no lado do servidor e todas as máquinas irão obter o mesmo resultado.&lt;/p&gt;

&lt;p&gt;Um servidor tem diversos tipos e serviços para oferecer, segue uma lista com alguns exemplos de serviços: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hospedagem&lt;/li&gt;
&lt;li&gt;Banco de dados&lt;/li&gt;
&lt;li&gt;Serviços de e-mail&lt;/li&gt;
&lt;li&gt;Armazenamento de arquivos&lt;/li&gt;
&lt;li&gt;Aplicações de telefonia&lt;/li&gt;
&lt;li&gt;Sistemas de pagamentos&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Como funciona?
&lt;/h3&gt;

&lt;p&gt;A maneira como um servidor funciona depende do tipo dele, como vimos anteriormente, existem vários tipos e serviços diferentes. Entre todos podemos entender como funciona um servidor web, já que tratamos assuntos semelhantes anteriormente e usaremos os mesmos conceitos.&lt;/p&gt;

&lt;p&gt;Quando buscamos algum endereço na aba de pesquisa do navegador passamos pelo processo do DNS, onde será feito o processo de tradução e identificação do endereço. Após isso passamos pelo processo do protocolo do HTTP, onde o navegador irá solicitar ao servidor os arquivos referentes ao endereço pesquisado e retornar uma cópia desses arquivos para o usuário, que no caso de sucesso, irá visualizar a página. Lembrando que o armazenamento desses arquivos pode variar de servidor pra servidor.&lt;/p&gt;

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

&lt;p&gt;Ao final desse artigo espero que você tenha entendido noções sobre como funciona o HTTP, HTTPS, DNS, domínio e servidor. Brinque um pouco no seu navegador usando a aba de network do devtools para acompanhar de perto os processos.&lt;/p&gt;

&lt;p&gt;Se quiser ir mais afundo nos assuntos recomendo ver sobre status code, tipos de servidor, hardware de um servidor e praticar os métodos HTTP.&lt;/p&gt;

&lt;p&gt;Qualquer dúvida ou sugestão estarei aqui para interagir. Valeuu!&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>http</category>
      <category>dns</category>
      <category>web</category>
    </item>
    <item>
      <title>O que é gitflow? - Entendendo gitflow</title>
      <dc:creator>Gabriel Duete</dc:creator>
      <pubDate>Tue, 28 Feb 2023 07:14:51 +0000</pubDate>
      <link>https://dev.to/gabrielduete/gitflow-4dok</link>
      <guid>https://dev.to/gabrielduete/gitflow-4dok</guid>
      <description>&lt;h1&gt;
  
  
  Introdução
&lt;/h1&gt;

&lt;p&gt;Nós desenvolvedores, trabalhamos com git quase todo dia, afinal, o versionamento nos permite acompanhar as mudanças aplicadas nos nossos projetos. Imagina o caos que era antes do Linus ter essa brilhante ideia!&lt;/p&gt;

&lt;p&gt;E com o surgir do git, também sugiram alguns modelos de fluxo de trabalho, que nos auxiliam a trabalhar com o versionamento. Os mais populares e recomendados hoje em dia é o fluxo de desenvolvimento baseado em tronco e o Gitflow. Pessoalmente, eu costumo sempre trabalhar com o Gitflow em qualquer projeto. Então nesse artigo será apresentado os principais conceitos do Gitflow.&lt;/p&gt;

&lt;p&gt;É interessante que você tenha algum conhecimento básico em git e desenvolvimento de software, para melhor assimilação do conteúdo, já que usarei alguns termos dessas áreas.&lt;/p&gt;

&lt;h1&gt;
  
  
  O que é gitflow?
&lt;/h1&gt;

&lt;p&gt;O Gitflow foi publicado e divulgado pelo engenheiro de software Vincent Driessen. Esse modelo pode ser usado na maioria dos projetos, sendo privados ou públicos, mas é altamente recomendando para projetos com ciclos de lançamentos agendados e/ou entregas contínuas. Também é importante entender que você pode fazer alterações no modelo conforme as suas necessidades.&lt;/p&gt;

&lt;p&gt;Um dos benefícios de utilizar o gitflow, é não permitir que os desenvolvedores façam commits diretamente na branch de produção, já que isso pode trazer diversos problemas, como por exemplo: enviar alterações indesejadas, causando uma dor de cabeça gigante para resolver o problema, não só para o desenvolvedor, mas também pros negócios do projeto. O gitflow trambém traz outros benefícios importantes como revisões de pull request, POCS(experimentos isolados) e até torna a colaboração do time bem mais eficiente. Vamos entender mais como o gitflow funciona.&lt;/p&gt;

&lt;h1&gt;
  
  
  Entendendo o Gitflow
&lt;/h1&gt;

&lt;p&gt;O gitfow modulariza duas branchs principais, sendo elas a branch Main/Master onde é feita o deploy do projeto, e a branch Develop, onde deve ser trabalhado as integrações dos recursos que estão sendo desenvolvidos. A branch develop deve conter todo os históricos de commits do projeto, e também vai ser a branch onde os desenvolvedores que desejam contribuir devem bifurcar. Já a master deve conter a versão final e alterações abreviadas que a branch de develop lançou. &lt;/p&gt;

&lt;p&gt;A melhor maneira de configurar a branch Develop, é com apenas um desenvolvedor, de preferência alguém de senioridade avançada na equipe, criando uma ramificação develop no local e fazendo o push. Já a branch master já vem pre-configurada ao criarmos o repositório no github, mas fique a vontade para fazer quaisquer alterações.&lt;/p&gt;

&lt;p&gt;Então temos a branch main e develop, precisamos agora de uma terceira ramificação, que chamaremos de Feature, a feature é uma branch gerada localmente por qualquer desenvolvedor que irá acrescentar, corrigir, ou refatorar algo no projeto. Então, para subir essa feature para a branch develop, deve-se abrir uma PULL REQUEST criado a partir da ramificação de develop mais recente, e ser aprovado por outros desenvolvedores responsáveis pelo projeto, além de aplicar correções e sugestões dos mesmos.&lt;/p&gt;

&lt;p&gt;Após ter aplicado as alterações e ter recebido os aproves dos demais devs, a branch é mergeada para a branch de develop. Então a branch de develop já atualizada com suas devidas features, pode-se ser megeada para a branch master onde é realizado o deploy para a produção!&lt;/p&gt;

&lt;p&gt;Vejamos a seguir um fluxograma que demonstra como funciona o gitflow com as ramificações que apresentamos até agora:&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%2Fuploads%2Farticles%2Fix1q2mppqw3nl774kh82.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%2Fuploads%2Farticles%2Fix1q2mppqw3nl774kh82.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Percebemos que são geradas novas versões da branch master toda vez que a branch de develop é mesclada, note também que cada bolinha laranja é uma feature(Pull request) que após passar por suas etapas de aprovação, é mesclado para a branch develop, que após receber X número de features, que provavelmente foram planejadas, é mesclado para a branch master, dando fim ao fluxo.&lt;/p&gt;

&lt;h1&gt;
  
  
  Release
&lt;/h1&gt;

&lt;p&gt;Podemos progredir mais, e entender o processo de Release. Release é uma ramificação que serve como ponte para o merge da branch develop para a master, também é nela onde são realizados os testes estabelecidos no projeto/empresa. Essa ramificação é responsável pelo próximo lançamento, então depois de criada, nenhuma nova feature deve ser adicionada nessa ramificação, somente em caso de alterações, onde deve-se realizar as alterações em uma branch de feature, mesclar com a develop e realizar novamente a mesclagem da develop na release.&lt;/p&gt;

&lt;p&gt;Vamos analisar o fluxograma a seguir:&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%2Fuploads%2Farticles%2Ff0und0zmupw0c6t7v8b7.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%2Fuploads%2Farticles%2Ff0und0zmupw0c6t7v8b7.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mantemos a branch Master, Develop e Features, mas perceba que para que haja o merge das alterações de develop para master, é realizado o processo de Release, é preciso subir as alterações da branch de develop para a branch de Release, onde será realizados todos os testes, e finalmente após ser aprovado, podemos subir para a master! É importante saber que caso haja alguma alteração solicitada pelo QA/Tester, a alteração deve ser feita seguindo o começo do fluxo normalmente, abrindo uma PR, subindo pra developer e novamente mesclando e testando na branch de Release.&lt;/p&gt;

&lt;p&gt;Note também que após realizarmos o merge da release, precisamos manter a branch develop atualizada com a última release, para que possa seguir o fluxo de desenvolvimento com a versão correta do projeto.&lt;/p&gt;

&lt;h1&gt;
  
  
  Hotfix
&lt;/h1&gt;

&lt;p&gt;Vamos falar agora sobre Hotfix, que é uma ramificação usada para corrigir bugs e ajustes com rapidez, sem que precise percorrer todo o fluxo desde do início. É extremamente eficaz para erros inesperados ou de grande impacto. Imagine que algum desenvolvedor subiu um bug para produção que impede que os usuários realizem login, agora imagine você como usuário ter que aturar esse erro por 1 ou 2 dias? O ideal é que seja resolvido de imediato, não é mesmo? Então é nesses tipos de situações que utilizamos o Hotfix, nesse caso, para trazer uma solução rápida. Geralmente esses erros gerados, passam despercebidos na hora dos testes, onde não foi possível detectar o problema e corrigi-lo antes de subir para produção.&lt;/p&gt;

&lt;p&gt;As ramificações de hotfix são baseadas na ramificação master ao invés da ramificação develop, já que é onde precisamos corrigir o problema com rapidez. Após a correção, as alterações devem ser mergeadas tanto na branch master como na develop ou na branch de release (caso esteja aberta).&lt;/p&gt;

&lt;p&gt;Vejamos a seguir o mesmo fluxo anterior, mas com a adição de um hotfix:&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%2Fuploads%2Farticles%2Fl10zap4ejatvgaij03zq.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%2Fuploads%2Farticles%2Fl10zap4ejatvgaij03zq.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Perceba que a branch do hotfix simplesmente ignorou o fluxo e atualizou as branchs de master e develop com a correção do bug. E assim, não afeta diretamente as branchs de Features, além de corrigir o problema.&lt;/p&gt;

&lt;h1&gt;
  
  
  Ambiente Homologado/QA
&lt;/h1&gt;

&lt;p&gt;É importante entender que seguir arduamente o gitflow é opcional! Cada empresa/projeto pode ter um gitflow específico para suprir suas necessidades. Vamos mostrar aqui um modelo onde os testes das features não são realizados apenas na branch de release, mas são testados individualmente toda vez que a feature é mergeada para a branch de QA e develop.&lt;/p&gt;

&lt;p&gt;Observe o fluxo a seguir:&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%2Fuploads%2Farticles%2Fkzzmh353jt676lwqaoy2.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%2Fuploads%2Farticles%2Fkzzmh353jt676lwqaoy2.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Perceba que após uma feature ser finalizada em sua branch individual, ela é mergeada para as branchs de QA e develop e lá deve ser testada pelo QA. Após a alteração ser aprovada, ela é mergeada diretamente na master, e após isso, todas as branchs de features locais devem ser atualizadas com as alterações da master. O mais interessante é que as outras features podem ser testadas individualmente enquanto é realizada o merge de outras.&lt;/p&gt;

&lt;h1&gt;
  
  
  Fluxo de desenvolvimento
&lt;/h1&gt;

&lt;p&gt;É interessante entender o fluxo de desenvolvimento quando estamos estudando gitflow, para saber que ações tomar em cada tipo de branch. Também é importante frisar que esse fluxo pode variar de empresa pra empresa e de gitflow para gitflow, apenas irei trazer exemplos mais comuns e recomendados.&lt;/p&gt;

&lt;p&gt;Lembra do nosso fluxograma de um gitflow completinho, com release e hotfix? Observe como poderia ser o fluxo de desenvolvimento dele:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fluxograma do Gitflow&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%2Fuploads%2Farticles%2Ffn11s0v2fpg1evyf6q8c.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%2Fuploads%2Farticles%2Ffn11s0v2fpg1evyf6q8c.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fluxo de desenvolvimento&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%2Fuploads%2Farticles%2Fkmyppd4olx5l3rs0fc3r.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%2Fuploads%2Farticles%2Fkmyppd4olx5l3rs0fc3r.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Podemos tratar individualmente cada ponto:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Local:&lt;br&gt;
Aqui é onde você vai abrir a branch para feature solicitada, baseado na develop.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Deve codificar a solução da sua tarefa.&lt;/li&gt;
&lt;li&gt;Dependendo do projeto, você precisa criar testes unitários, e rodar os testes do projeto para garantir que sua solução não quebrou nenhuma outra funcionalidade.&lt;/li&gt;
&lt;li&gt;Caso necessário, é preciso de validações externas, como validar um layout, ou uma regra de negocio que não foi muito bem entendida.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pull Request:&lt;br&gt;
Nessa etapa é onde você abre sua PR para validação dos demais desenvolvedores.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Caso haja sugestões de alterações, você deve avaliar se faz ou não sentido e aplicar em sua solução. Também pode haver questionamentos, ou requisições de mudança no caso de encontrarem algum erro severo.&lt;/li&gt;
&lt;li&gt;Grande parte dos projetos requerem aprovação do time, ou de pelo menos um ou dois desenvolvedores para que possa seguir o fluxo.&lt;/li&gt;
&lt;li&gt;Depois de aprovado, basta subir suas alterações para a branch de desenvolvimento.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Develop:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Deve-se verificar se ocorreu tudo certo com o merge, envolvendo pipelines, testes unitários, builds, etc…&lt;/li&gt;
&lt;li&gt;É interessante também conferir se todas as alterações foram realizadas com sucesso, pode ter gerado algum erro envolvendo variáveis de ambiente, build, etc…&lt;/li&gt;
&lt;li&gt;Agora é só abrir a branch de Release e mesclar as alterações!&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Release:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Nessa etapa também é interessante verificar se ocorreu tudo certo com o merge.&lt;/li&gt;
&lt;li&gt;É aqui onde ocorrem os testes nos ambientes homologados/qa.&lt;/li&gt;
&lt;li&gt;Caso haja a necessidade de alguma alteração, pode-se fazer o ajuste em uma branch de feature, mesclar para develop e novamente mesclar a develop na release. Ou seguir algum outro fluxo estabelecido nos padrões do projeto.
Após finalizar, basta finalmente fazer o merge na master!&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Produção:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;E novamente… deve-se verificar as pipelines, para que possa garantir a qualidade do merge.&lt;/li&gt;
&lt;li&gt;Agora com tudo certinho, pode-se verificar as alterações no ambiente de produção! (Só pra ter certeza, né? :he-he:)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essa foi uma demonstração de como funcionaria um fluxo de desenvolvimento em cima do gitflow. Obviamente podem haver etapas diferentes em cada parte do desenvolvimento, variando de projeto para projeto, empresa para empresa.&lt;/p&gt;

&lt;p&gt;Vejamos esse outro exemplo, usando o gitflow que criamos com o ambiente homologado/QA.&lt;/p&gt;

&lt;p&gt;Veja só como ficaria:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fluxograma do gitflow com QA&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%2Fuploads%2Farticles%2F98gwx2wok1zfeguy2ybj.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%2Fuploads%2Farticles%2F98gwx2wok1zfeguy2ybj.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fluxo de desenvolvimento&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%2Fuploads%2Farticles%2Fot064bla4o2ajtp5rp6c.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%2Fuploads%2Farticles%2Fot064bla4o2ajtp5rp6c.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As etapas são bastante similares, com algumas mudanças simples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deve sempre criar branchs de features baseados na master&lt;/li&gt;
&lt;li&gt;Ao concluir as PR’s, deve mesclar as alterações para as branchs de DEV e QA, ao invés de apenas para DEV.&lt;/li&gt;
&lt;li&gt;A branch de DEV agora servirá mais como um ambiente de testes para desenvolvedores, onde também deve-se tomar cuidados especiais, como pipelines, builds, etc…&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Na Branch de QA é onde acontece a magia. As etapas 1 e 2 são exatamente as mesma do fluxo anterior, o que muda é a maneira como trabalhamos na etapa 3(Aplicar possíveis alterações). Veja como ficaria nesse novo fluxo:&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%2Fuploads%2Farticles%2Fvhwlzdahi9pq0zbrdbtp.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%2Fuploads%2Farticles%2Fvhwlzdahi9pq0zbrdbtp.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nesse fluxo, seria preciso retrabalhar em cima da branch, onde seria resolvido a alteração solicitada pelo(a) QA, também seria necessário ter a PR revisada novamente, e por fim, mesclado novamente para as branchs de QA e DEV, onde seriam realizados os testes da nova versão da PR. Caso deva ser feita alguma nova alteração, é preciso refazer o fluxo.&lt;/p&gt;

&lt;p&gt;Por fim, após ter validado as alterações, já podemos mesclar a PR diretamente na master e verificar as alterações no ambiente de produção. O fluxo completo ficaria 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%2Fuploads%2Farticles%2F8ctq7syl3w7mihmz6yfo.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%2Fuploads%2Farticles%2F8ctq7syl3w7mihmz6yfo.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Chegamos ao final do artigo, e espero que tenha conseguido entender como que funciona o gitflow e suas principais características. É importante ressaltar que cada gitflow e fluxo de trabalho podem ter alterações de acordo com o projeto. Existe também uma maneira interessante de usar o gitflow, que é instalando a CLI do gitflow, e executando no seu projeto.&lt;/p&gt;

&lt;p&gt;O ideal é que você coloque em prática tudo que foi aprendido aqui, criar um projeto open-source e trabalhar nele junto com seus amigos, colegas, comunidades, etc… É interessante criar um arquivo readme onde você irá montar o seu gitflow e exigir que os desenvolvedores trabalhem seguindo ele, também é interessante montar um fluxo de desenvolvimento para que ninguém se sinta perdido enquanto trabalha usando o seu gitflow.&lt;/p&gt;

&lt;p&gt;Bons estudos! E se precisar de mim para esclarecer alguma dúvida, pode me chamar nas minhas redes sociais, na maioria das vezes é só pesquisar por &lt;a class="mentioned-user" href="https://dev.to/gabrielduete"&gt;@gabrielduete&lt;/a&gt; que você me achará!&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;p&gt;FLUXO DE TRABALHO DE GITFLOW. &lt;strong&gt;Atlassian solutions,&lt;/strong&gt; [s.d.]. Disponível em: &amp;lt;&lt;a href="https://www.atlassian.com/br/git/tutorials/comparing-workflows/gitflow-workflow" rel="noopener noreferrer"&gt;https://www.atlassian.com/br/git/tutorials/comparing-workflows/gitflow-workflow&lt;/a&gt;&amp;gt;. Acesso em: 26 de fev. de 2023.&lt;/p&gt;

&lt;p&gt;PEDROSO, Murillo Godoi. Git Flow: entenda o que é, como e quando utilizar. &lt;strong&gt;Alura,&lt;/strong&gt; 2023. Disponível em: &amp;lt;&lt;a href="https://www.alura.com.br/artigos/git-flow-o-que-e-como-quando-utilizar#:~:text=Vamos%20nessa%3F-,O%20que%20%C3%A9%20Git%20Flow%3F,organiza%C3%A7%C3%A3o%20do%20versionamento%20de%20c%C3%B3digos" rel="noopener noreferrer"&gt;https://www.alura.com.br/artigos/git-flow-o-que-e-como-quando-utilizar#:~:text=Vamos nessa%3F-,O que é Git Flow%3F,organização do versionamento de códigos&lt;/a&gt;&amp;gt;. Acesso em: 27 de fev. de 2023.&lt;/p&gt;

&lt;p&gt;MIKAEL, Hadler. Utilizando o fluxo Git Flow. &lt;strong&gt;Medium,&lt;/strong&gt; 2023. Disponível em: &amp;lt;&lt;a href="https://medium.com/trainingcenter/utilizando-o-fluxo-git-flow-e63d5e0d5e04" rel="noopener noreferrer"&gt;https://medium.com/trainingcenter/utilizando-o-fluxo-git-flow-e63d5e0d5e04&lt;/a&gt;&amp;gt;. Acesso em: 27 de fev. de 2023.&lt;/p&gt;

</description>
      <category>git</category>
      <category>gitflow</category>
      <category>github</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>BEECROWD - Guia de como enviar soluções com javascript</title>
      <dc:creator>Gabriel Duete</dc:creator>
      <pubDate>Tue, 26 Apr 2022 01:16:15 +0000</pubDate>
      <link>https://dev.to/gabrielduete/beecrowd-guia-de-como-enviar-solucoes-com-javascript-ai0</link>
      <guid>https://dev.to/gabrielduete/beecrowd-guia-de-como-enviar-solucoes-com-javascript-ai0</guid>
      <description>&lt;h2&gt;
  
  
  🤠Infos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Guia de como resolver problemas do [Beecrowd](https://www.beecrowd.com.br/judge/p) com JavaScript.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;Esse mesmo artigo também está presente nesse &lt;a href="https://github.com/gabrielduete/BEECROWD-JS-GUIA%20&amp;lt;/p" rel="noopener noreferrer"&gt;repositório&lt;/a&gt; no github, junto com algumas soluções que já enviei.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  💻Tecnologias utilizadas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.javascript.com/" rel="noopener noreferrer"&gt;JavaScript&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🤔Ta com duvida em como enviar respostas com JS??
&lt;/h2&gt;

&lt;p&gt; 
Muitxs programadorxs sentem dificuldades em solucionar os problemas do beecrowd com JavaScript por não entender como funciona a entrada de dados. Relaxa! Eu vou te explicar:

Primeiramente, crie um arquivo chamado 'stdin' em sua pasta. Iremos usar esse arquivo para ler os valores do nosso problema!&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%2Fuploads%2Farticles%2Fh9sub1t9k4d340lhozih.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%2Fuploads%2Farticles%2Fh9sub1t9k4d340lhozih.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora, vamos resolver o problema &lt;a href="https://www.beecrowd.com.br/judge/pt/problems/view/1001" rel="noopener noreferrer"&gt;1001&lt;/a&gt; do Beecrowd. Para isso, temos que iniciar declarando o nosso input:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

var input = require('fs').readFileSync('stdin', 'utf8')


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

&lt;/div&gt;
&lt;p&gt;Para recebermos os valores da entrada, precisamos fazer uma requisição do módulo conhecido como 'fs'. Este módulo fornece operações de I/O (Input/Output ou E/S, Entrada/Saída).&lt;/p&gt;

&lt;p&gt;Não iremos entrar muito em detalhes de como o 'fs' funciona, pois iremos usar apenas a função &lt;a href="https://www.geeksforgeeks.org/node-js-fs-readfilesync-method/" rel="noopener noreferrer"&gt;readFileSync&lt;/a&gt; do 'fs', essa função permite a leitura de forma síncrona do arquivo que iremos passar como parâmetro da função, junto com seu tipo de arquivo 'utf8'.&lt;/p&gt;

&lt;p&gt;Ok, nosso input está pronto! Vamos testar? Entre no arquivo stdin e digite 10 e 9 um em cada linha, em seguida digite &lt;code&gt;console.log(input)&lt;/code&gt; no código.&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%2Fuploads%2Farticles%2Fyg9hjeson20fpebc5imi.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%2Fuploads%2Farticles%2Fyg9hjeson20fpebc5imi.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Perceba que foi impresso 10 e 9, conforme digitados no arquivo stdin! Pois o nosso input está lendo os valores digitados naquele arquivo. &lt;/p&gt;

&lt;p&gt;Vamos agora para o próximo passo!&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

var valoresRecebidos = input.split('\n')


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

&lt;/div&gt;
&lt;p&gt;Digite isso no seu código. Perceba que declaramos uma variável chamada &lt;em&gt;valoresRecebidos&lt;/em&gt;, essa variável irá receber os valores do input e armazena-los. Mas, por que usar o método &lt;em&gt;.split&lt;/em&gt;? A resposta é simples, o nosso input esta retornando uma string, então o método split irá criar uma lista ordenada de substrings de acordo com o nosso divisor, que no caso foi o "\n", pois precisamos quebrar linha na hora de receber os valores conforme o beecrowd pede.&lt;/p&gt;

&lt;p&gt;Vamos imprimir a variável &lt;em&gt;valoresRecebidos&lt;/em&gt; para acompanhar o processo:&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%2Fuploads%2Farticles%2F08uqqbyzcnr86ts9ov6f.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%2Fuploads%2Farticles%2F08uqqbyzcnr86ts9ov6f.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Perceba que foi retornada uma lista com os valores de acordo como nos separamos eles! No caso usando uma quebra de linhas igual o problema pede.&lt;/p&gt;

&lt;p&gt;Agora ficou fácil! Só precisamos armazenar os valores 10 e 9 em suas respectivas variáveis, no caso &lt;em&gt;A&lt;/em&gt; e &lt;em&gt;B&lt;/em&gt;.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

var A = parseInt(valor.shift())
var B = parseInt(valor.shift())


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

&lt;/div&gt;
&lt;p&gt;Ok... vamos entender o que foi feito! O método &lt;em&gt;&lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array/shift" rel="noopener noreferrer"&gt;shift&lt;/a&gt;&lt;/em&gt; em JavaScript remove o primeiro elemento de um array e retorna esse elemento. Ou seja, estamos pegando o primeiro elemento do array &lt;em&gt;valoresRecebidos&lt;/em&gt; e jogando na variável &lt;em&gt;A&lt;/em&gt;, em seguida pegamos o segundo elemento e jogamos na variável &lt;em&gt;B&lt;/em&gt;. Mas não acabou por aí, perceba que temos que receber valores inteiros da entrada/inputs, ou seja, temos que converter o elemento que estamos recebendo do array para valores &lt;em&gt;inteiros&lt;/em&gt;, para isso basta usarmos a função &lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/parseInt" rel="noopener noreferrer"&gt;&lt;em&gt;parseInt()&lt;/em&gt;&lt;/a&gt;, essa função retorna um valor inteiro do elemento que estamos passando!&lt;/p&gt;

&lt;p&gt;Pronto! Agora é só a gente criar a variável X e fazer a soma entre A e B!&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

var X = A + B


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

&lt;/div&gt;
&lt;p&gt;Por fim, nosso código ficará assim:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

var input = require('fs').readFileSync('stdin', 'utf8')

var valoresRecebidos = input.split('\n')

var A = parseInt(valoresRecebidos.shift())
var B = parseInt(valoresRecebidos.shift())

var X = A + B

console.log('X = ' + X)


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

&lt;/div&gt;
&lt;p&gt;Vamos testa-lo para ver se ta funcionando conforme o beecrowd deseja!&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%2Fuploads%2Farticles%2F3dccw3sq58qtv0pdaivm.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%2Fuploads%2Farticles%2F3dccw3sq58qtv0pdaivm.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aeee! Bingo! Você conseguiu resolver o problema 1001 do beecrowd! Não pera... Ainda falta um maldito detalhe 😜. Sabe a nosso input que ta lendo o arquivo 'stdin'? Esse arquivo tem o mesmo nome do arquivo que compila e verifica as entradas no própio beecrowd! Ou seja, com esse comando vamos estar acessando as pastas do beecrowd e receber os valores da entrada. Só que o diretório do arquivo stdin do beecrowd é diferente do nosso! Se enviarmos assim, nossa solução irá dar &lt;em&gt;Runtime error&lt;/em&gt;. Para resolver esse problema, devemos apenas adicionar o "/dev/stdin" no nosso parâmetro da função 😀. &lt;/p&gt;

&lt;p&gt;Veja: &lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

var input = require('fs').readFileSync('/dev/stdin', 'utf8')


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

&lt;/div&gt;
&lt;p&gt;Agora sim! Hehehe, veja o resultado final: &lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

var input = require('fs').readFileSync('/dev/stdin', 'utf8')

var valoresRecebidos = input.split('\n')

var A = parseInt(valoresRecebidos.shift())
var B = parseInt(valoresRecebidos.shift())

var X = A + B

console.log('X = ' + X)


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

&lt;/div&gt;
&lt;p&gt;Parabéns!! Você conseguiu resolver o problema 1001 do beecrowd com JavaScript, a linguagem mais bonita da internet (brincadeira... ou não...).&lt;/p&gt;

&lt;p&gt;Se esse conteúdo foi útil para você, por favor clique na star do respositório, pois ficarei muito feliz em saber que de alguma maneira fiz algo útil para alguém da nossa comunidade. Me adiciona lá no beecrowd pra gente ver nossas conquistas! Basta clicar aqui: &lt;a href="https://www.beecrowd.com.br/judge/pt/profile/412152" rel="noopener noreferrer"&gt;GabrielDuete-beecrowd&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Muito obrigado por ter lido até aqui e ter aprendido, você é incrível mesmo 💜. Nunca desista dos estudos e continue focado mesmo com tantas dificuldades e coisas pra estudar, eu sei que você consegue!&lt;/p&gt;

&lt;p&gt;Você pode verificar minhas soluções com Javascript nesse &lt;a href="https://github.com/gabrielduete/BEECROWD-JS-GUIA%20&amp;lt;/p" rel="noopener noreferrer"&gt;repositório&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;cite&gt; &lt;/cite&gt;&lt;/p&gt;

&lt;blockquote&gt;"COM TRABALHO DURO UM FRACASSADO CONSEGUE ATÉ MESMO SUPERAR UM GÊNIO." - Rock Lee
&lt;/blockquote&gt;



</description>
      <category>javascript</category>
      <category>braziliandevs</category>
      <category>beecrowd</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Acessando/Espelhando tela do celular no PC</title>
      <dc:creator>Gabriel Duete</dc:creator>
      <pubDate>Wed, 16 Mar 2022 03:38:42 +0000</pubDate>
      <link>https://dev.to/gabrielduete/acessandoespelhando-tela-do-celular-no-pc-4jhf</link>
      <guid>https://dev.to/gabrielduete/acessandoespelhando-tela-do-celular-no-pc-4jhf</guid>
      <description>&lt;h1&gt;
  
  
  Sobre
&lt;/h1&gt;

&lt;p&gt;Para prevenir que você perca dados importantes ou perca meios de comunicações como o WPP do seu celular, recomendo que utilize o app &lt;strong&gt;scrcpy&lt;/strong&gt; que permite você espelhar a tela do seu celular no pc via USB. O scrcpy permite acessar seu celular caso venha ocorrer algum problema, no meu caso estou precisando esperar uns vinte minutos pra tela acender após clicar no botão de power.&lt;/p&gt;

&lt;h1&gt;
  
  
  Utilização
&lt;/h1&gt;

&lt;p&gt;Passos para instalação:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Genymobile/scrcpy" rel="noopener noreferrer"&gt;Acesse o repositório do scrcpy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Genymobile/scrcpy" rel="noopener noreferrer"&gt;Baixe o app de acordo com seu sistema operacional(Windows no meu caso)&lt;/a&gt;:
&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3jbeqyi12co8wtku6tkt.png" alt="Image description" width="800" height="755"&gt;
&lt;/li&gt;
&lt;li&gt;Extraia o arquivo zipado.&lt;/li&gt;
&lt;li&gt;Agora ative o modo desenvolvedor e modo depuração no seu celular.

&lt;ul&gt;
&lt;li&gt;Cada celular tem uma maneira, mas vou tentar te ajudar.&lt;/li&gt;
&lt;li&gt;Vá nas configurações -&amp;gt; Sistema -&amp;gt; Sobre -&amp;gt; Informações do Software -&amp;gt; Clique 7 vezes na aba Número da versão&lt;/li&gt;
&lt;li&gt;Após isso deve aparecer uma mensagem "Agora você é um desenvolvedor!" ou algo do tipo&lt;/li&gt;
&lt;li&gt;Volte um pouco e vá em opções de desenvolvedor e habilite a depuração USB&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Vincule o USB no seu celular e no seu PC&lt;/li&gt;

&lt;li&gt;Agora volte para a pasta do arquivo que você extraiu e abra o .exe do scrcpy
&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgvuu9c59mxgxhb1abydw.png" alt="Image description" width="671" height="597"&gt;
&lt;/li&gt;

&lt;/ul&gt;

&lt;h1&gt;
  
  
  Finalização
&lt;/h1&gt;

&lt;p&gt;Pronto, você consegue utilizar seu celular pelo PC. Se preferir pode tentar vincular a conexão do PC e celular via Wi-Fi, posso trazer essa feature para esse artigo mais tarde. Bom uso!&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmspapq6wdastgq9e6c42.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmspapq6wdastgq9e6c42.png" alt="Image description" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>tooling</category>
      <category>github</category>
    </item>
    <item>
      <title>Dale! Concluí minhas quatro contribuções no Hacktoberfest 2K21 :)</title>
      <dc:creator>Gabriel Duete</dc:creator>
      <pubDate>Mon, 25 Oct 2021 20:11:31 +0000</pubDate>
      <link>https://dev.to/gabrielduete/dale-conclui-minhas-quatro-contribucoes-no-hacktoberfest-2k21-1k9f</link>
      <guid>https://dev.to/gabrielduete/dale-conclui-minhas-quatro-contribucoes-no-hacktoberfest-2k21-1k9f</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frcjk01vrdtffqhkzovpk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frcjk01vrdtffqhkzovpk.png" alt="Image description" width="800" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>hacktoberfest</category>
      <category>braziliandevs</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Porque o modelo de ciclo de vida em espiral é considerado um modelo para processos de software evolucionário?</title>
      <dc:creator>Gabriel Duete</dc:creator>
      <pubDate>Sat, 23 Oct 2021 22:31:34 +0000</pubDate>
      <link>https://dev.to/gabrielduete/porque-o-modelo-de-ciclo-de-vida-em-espiral-e-considerado-um-modelo-para-processos-de-software-evolucionario-el9</link>
      <guid>https://dev.to/gabrielduete/porque-o-modelo-de-ciclo-de-vida-em-espiral-e-considerado-um-modelo-para-processos-de-software-evolucionario-el9</guid>
      <description>&lt;p&gt; Os outros modelos de ciclo de vida tendem a não ser flexíveis a mudanças e seguir um trajeto do inicio ao fim do projeto, seguindo uma sequencia de passos para obter, apenas e somente, um objetivo que foi definido no planejamento. &lt;/p&gt;

&lt;p&gt; O modelo de ciclo de vida em espiral é considerado um modelo evolucionário porque ele é flexível à mudanças, e é facilmente manuseável de acordo com os pedidos do cliente. &lt;/p&gt;

&lt;p&gt; O modelo espiral permite que o projeto possa ser modificado conforme interesse do cliente, seja incrementando ou decrementando funcionalidades ou alterando a interface. &lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>programming</category>
      <category>software</category>
      <category>engineering</category>
    </item>
    <item>
      <title>Como a engenharia de software contribui para o desenvolvimento profissional de software?</title>
      <dc:creator>Gabriel Duete</dc:creator>
      <pubDate>Mon, 11 Oct 2021 23:24:30 +0000</pubDate>
      <link>https://dev.to/gabrielduete/como-a-engenharia-de-software-contribui-para-o-desenvolvimento-profissional-de-software-4m94</link>
      <guid>https://dev.to/gabrielduete/como-a-engenharia-de-software-contribui-para-o-desenvolvimento-profissional-de-software-4m94</guid>
      <description>&lt;p&gt; A engenharia de software está presente em todas as etapas da criação de um software. Ela está presente em projetos de longa escala, não é necessário ser usada no desenvolvimento de projetos por hobbies. &lt;b&gt;A engenharia de software traz técnicas que que proporcionam bons atributos para o software desenvolvido, desde funcionalidades, desempenho, manutenções, documentação e etc&lt;/b&gt;. Então, a engenharia de software deve auxiliar a ter uma boa qualidade não apenas no software em si, mas também no projeto como um todo. &lt;/p&gt; 

</description>
      <category>algorithms</category>
      <category>braziliandevs</category>
      <category>software</category>
    </item>
  </channel>
</rss>
