<?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: Guilherme Moraes</title>
    <description>The latest articles on DEV Community by Guilherme Moraes (@guimoraes).</description>
    <link>https://dev.to/guimoraes</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%2F279428%2F85b2b20f-3ed1-413c-b715-e3b89406c0a2.png</url>
      <title>DEV Community: Guilherme Moraes</title>
      <link>https://dev.to/guimoraes</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/guimoraes"/>
    <language>en</language>
    <item>
      <title>How to have your portfolio up-to-date with your published articles</title>
      <dc:creator>Guilherme Moraes</dc:creator>
      <pubDate>Thu, 28 Mar 2024 21:00:00 +0000</pubDate>
      <link>https://dev.to/guimoraes/how-to-have-your-portfolio-up-to-date-with-your-published-articles-am4</link>
      <guid>https://dev.to/guimoraes/how-to-have-your-portfolio-up-to-date-with-your-published-articles-am4</guid>
      <description>&lt;p&gt;Let's use the public dev.to API to query the last articles. Take a look at how it looks: &lt;a href="https://dev.to/api/articles?username=guimoraes"&gt;link&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;TL;DR: Using dev.to public API endpoint &lt;code&gt;https://dev.to/api/articles?username=${your_username}&lt;/code&gt; will give you a JSON array with enough information to integrate it into your website. This article demonstrates the step-by-step process of ensuring your portfolio remains dynamic and up-to-date with your most recent content and a fancy card to show your links. You can check the code in this &lt;a href="https://codepen.io/guiimoraes/pen/GRLMKep" rel="noopener noreferrer"&gt;link&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Scenario
&lt;/h2&gt;

&lt;p&gt;You have a portfolio website showcasing your work, but manually updating it with your latest articles becomes tedious and time-consuming. Enter the dev.to public API to automate this process and keep your portfolio fresh with minimal effort and it's reactions and comments always up-to-date.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;Of course, I'll not only throw a concept to you, and let you find out how to use it, let's create a card to show the articles into a website using vanilla HTML, CSS and JS.&lt;/p&gt;

&lt;h3&gt;
  
  
  The structure
&lt;/h3&gt;

&lt;p&gt;To make things easier, I'll put the HTML and CSS right below, using the pretty plum color, same I had used in my own portfolio.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- HTML --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ul&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"wrapper"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* CSS */&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;box-sizing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;border-box&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;#wrapper&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;flex-direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;justify-content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;600px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.item&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;list-style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.item&lt;/span&gt; &lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;inline-flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;flex-direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;12px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;73&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;33&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;59&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.9&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.item&lt;/span&gt; &lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;73&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;33&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;59&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.95&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Good, now let's add some magic into it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* JavaScript */&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;wrapperEle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#wrapper&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://dev.to/api/articles?username=guimoraes&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;articles&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;articles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;itemEle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;li&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="nx"&gt;itemEle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;item&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;anchorEle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;a&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="nx"&gt;anchorEle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nx"&gt;anchorEle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="nx"&gt;itemEle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;anchorEle&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;wrapperEle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;itemEle&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ok, but what's this code doing?&lt;br&gt;
The step-by-step process is the following.&lt;/p&gt;

&lt;p&gt;First, we save the &lt;code&gt;ul&lt;/code&gt; tag in a variable to reuse it in the future to attach the items inside of it;&lt;/p&gt;

&lt;p&gt;Second, the reason for all of it &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch" rel="noopener noreferrer"&gt;fetch&lt;/a&gt; the articles from dev.to API endpoint. While this returns a &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise" rel="noopener noreferrer"&gt;JS Promise&lt;/a&gt;, we need to use the method &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then" rel="noopener noreferrer"&gt;then&lt;/a&gt; to work with asynchronous code, so let's first parse JSON response into native JavaScript objects, and we are ready to work with the articles already.&lt;/p&gt;

&lt;p&gt;At this stage, we have an array of objects with useful values like "title, "URL", etc. Let's use these values to create a link card that sends the user to the article itself from our portfolio.&lt;/p&gt;

&lt;p&gt;Third, we will use the array method &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach" rel="noopener noreferrer"&gt;forEach&lt;/a&gt; to create an element for each article in that array. Using &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Document/createElement" rel="noopener noreferrer"&gt;document.createElement&lt;/a&gt; method will allow us to create a new element inside the loop, so we will create two elements, first a &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/li" rel="noopener noreferrer"&gt;li&lt;/a&gt; element, because we are creating an unordered list (&lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ul" rel="noopener noreferrer"&gt;ul&lt;/a&gt;) to wrap the content up, so the children of a list should be a list item, and an &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a" rel="noopener noreferrer"&gt;anchor&lt;/a&gt; element with a hyperlink to the article.&lt;/p&gt;

&lt;p&gt;Last, but not least, let's use the method &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Node/appendChild" rel="noopener noreferrer"&gt;appendChild&lt;/a&gt; to append the anchor inside the list item, and the list item inside the unordered list.&lt;/p&gt;
&lt;h3&gt;
  
  
  And our result is
&lt;/h3&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%2Fhk5arvrn3lagg1rkmrxk.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%2Fhk5arvrn3lagg1rkmrxk.png" alt="two square elements one the article " width="800" height="139"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Great, so that's it, right? No, please, copy a link and a title is too simple
&lt;/h2&gt;
&lt;h2&gt;
  
  
  Next step, add metadata to the card.
&lt;/h2&gt;

&lt;p&gt;Each article has some really important metadata that's great to show more about your article and the people interacting with it.&lt;/p&gt;
&lt;h3&gt;
  
  
  Let's select some data to add to the card.
&lt;/h3&gt;

&lt;p&gt;For this tutorial, I'll pick only two keys of the article object, the &lt;code&gt;reading_time_minutes&lt;/code&gt;, and &lt;code&gt;positive_reactions_count&lt;/code&gt; to add to the card.&lt;/p&gt;

&lt;p&gt;Let's change the CSS a bit.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Remove the underline from the wrapper&lt;/li&gt;
&lt;li&gt;Add a title element.&lt;/li&gt;
&lt;li&gt;add a metadata wrapper to change the &lt;code&gt;flex-direction&lt;/code&gt; of its children to row.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* CSS */&lt;/span&gt;
&lt;span class="nc"&gt;.item&lt;/span&gt; &lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;text-decoration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.item&lt;/span&gt; &lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="nc"&gt;.title&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;text-decoration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;underline&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.item&lt;/span&gt; &lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="nc"&gt;.metadata-wrapper&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;12px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now the javascript.&lt;br&gt;
It's basically the same structure from the initial.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;titleEle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;p&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;titleEle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;titleEle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;metadataWrapperEle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;section&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;metadataWrapperEle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;metadata-wrapper&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;thumbsUpEle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;p&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;thumbsUpEle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;thumbs up: &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;positive_reactions_count&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;clockEle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;p&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;clockEle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;time to read: &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;reading_time_minutes&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;metadataWrapperEle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;thumbsUpEle&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;metadataWrapperEle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;clockEle&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;anchorEle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;anchorEle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;titleEle&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;anchorEle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;metadataWrapperEle&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Result
&lt;/h2&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%2Fxi03lvwx17wcn4h1qw53.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%2Fxi03lvwx17wcn4h1qw53.png" alt="Same image as before, but with the metadata for positive_reactions_count and reading_time_minutes" width="602" height="181"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;** Final code: &lt;a href="https://codepen.io/guiimoraes/pen/GRLMKep**" rel="noopener noreferrer"&gt;https://codepen.io/guiimoraes/pen/GRLMKep**&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;By using the dev.to public API, you can automate the process of keeping your portfolio up-to-date with your latest articles, and their last metadata. This not only saves time but also ensures that your portfolio remains dynamic and reflective of your current work.&lt;/p&gt;

&lt;p&gt;Let's keep our portfolios fresh and engaging together! 👨‍💻✨&lt;/p&gt;

&lt;p&gt;Check out my links&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://www.guimoraes.dev/" rel="noopener noreferrer"&gt;https://www.guimoraes.dev/&lt;/a&gt;&lt;br&gt;
Linkedin: &lt;a href="https://www.linkedin.com/in/guimoraesdev/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/guimoraesdev/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you find any error or just want to say hi, leave a comment below.&lt;br&gt;
See ya! 👋&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>portfolio</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Why { ...defaultValues, ...newValues } can hide a bug</title>
      <dc:creator>Guilherme Moraes</dc:creator>
      <pubDate>Fri, 22 Mar 2024 14:39:10 +0000</pubDate>
      <link>https://dev.to/guimoraes/why-defaultvalues-newvalues-can-hide-a-bug-54hc</link>
      <guid>https://dev.to/guimoraes/why-defaultvalues-newvalues-can-hide-a-bug-54hc</guid>
      <description>&lt;p&gt;Using the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax#spread_in_object_literals" rel="noopener noreferrer"&gt;spread operator&lt;/a&gt; to create a new object using other objects is not unusual, but what happens if both objects have the same key?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;TL;DR: This article explores a common issue with the spread operator in JavaScript when merging objects with overlapping keys and potentially falsy values. It explains how the spread operator can override default values with null or falsy values, leading to unexpected behavior. The article offers two solutions: a simpler one that directly checks and assigns values based on truthiness and a more scalable approach using &lt;code&gt;Object.entries&lt;/code&gt; and &lt;code&gt;Object.fromEntries&lt;/code&gt; to filter out falsy values before merging.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The scenario
&lt;/h2&gt;

&lt;p&gt;You are creating a new object in Javascript with default values and want to update it with new values from another object.&lt;/p&gt;

&lt;p&gt;Knowing that JavaScript has spread operator since ES6, you use the following structure.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;defaultValues&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Bar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;fruit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;banana&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;newValues&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Baz&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;outputValues&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;defaultValues&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;newValues&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What is the expected output?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You are right if you say that the &lt;code&gt;newValues&lt;/code&gt; object will update the &lt;code&gt;outputValues&lt;/code&gt; object.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// { foo: "Baz", number: 40, fruit: "banana" }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Great, so it's done, right?!&lt;br&gt;
Hmm... maybe not&lt;/p&gt;
&lt;h2&gt;
  
  
  The issue
&lt;/h2&gt;

&lt;p&gt;When using the spread operator to create a new object, we are not making any validation about the values coming from the &lt;code&gt;newValues&lt;/code&gt; object, which can cause some weird results.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The possible problem&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you need to have the &lt;code&gt;defaultValues&lt;/code&gt;object to be replaced only by &lt;a href="https://developer.mozilla.org/en-US/docs/Glossary/Truthy" rel="noopener noreferrer"&gt;truthy Javascript values&lt;/a&gt;, you have a bug in the previous code.&lt;/p&gt;

&lt;p&gt;Given the same last scenario, but a different object &lt;code&gt;newValues&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;defaultValues&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Bar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;fruit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;banana&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;newValues&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Baz&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;fruit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;outputValues&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;defaultValues&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;newValues&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What is the expected output?&lt;/strong&gt;&lt;br&gt;
If you expect to have &lt;code&gt;fruit: "banana"&lt;/code&gt; think twice.&lt;/p&gt;

&lt;p&gt;The final value will be &lt;code&gt;fruit: null&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why? 👀
&lt;/h2&gt;

&lt;p&gt;Based on the spread operator MDN definition&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Overriding properties&lt;br&gt;
When one object is spread into another object, or when multiple objects are spread into one object, and properties with identical names are encountered, the property takes the last value assigned while remaining in the position it was originally set.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This means that the spread operator does not validate if the value is or isn't a truth value.&lt;/p&gt;
&lt;h2&gt;
  
  
  And how do we solve it?
&lt;/h2&gt;

&lt;p&gt;Well, there's the simple, non-scalable solution and the more complex, but scalable solution. Let's discuss each of them.&lt;/p&gt;
&lt;h3&gt;
  
  
  Simpler solution
&lt;/h3&gt;

&lt;p&gt;Let's create a simple validation for the &lt;code&gt;fruit&lt;/code&gt; key.&lt;br&gt;
Getting back to the last scenario, but with a change in the fruit value.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;defaultValues&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Bar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;fruit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;banana&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;newValues&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Baz&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;fruit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;outputValues&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;defaultValues&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;newValues&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;fruit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;newValues&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fruit&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;defaultValues&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fruit&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Ok, it can work in a few validations but is not scalable at all, so let's create a validation for each value in the &lt;code&gt;newValues&lt;/code&gt; object.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scalable solution
&lt;/h3&gt;

&lt;p&gt;To make it scalable for whatever the object size, let's use the methods &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries" rel="noopener noreferrer"&gt;entries&lt;/a&gt; from &lt;code&gt;Object&lt;/code&gt;, to parse the values.&lt;br&gt;
Using this method, we will have an array of &lt;code&gt;[key, value]&lt;/code&gt;, that we can use the arrays method &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter" rel="noopener noreferrer"&gt;filter&lt;/a&gt; to check if the second element is &lt;a href="https://developer.mozilla.org/en-US/docs/Glossary/Truthy" rel="noopener noreferrer"&gt;truth&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newValues&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Boolean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;span class="c1"&gt;// [ ['foo', 'Baz'], ['number', 40] ]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Perfect, now we have validations for falsy values in the object, but I need an object, not an array, genius.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Calm down, there's another &lt;code&gt;Object&lt;/code&gt; method so solve it, the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/fromEntries" rel="noopener noreferrer"&gt;fromEntries&lt;/a&gt; method.&lt;br&gt;
From MDN: "The Object.fromEntries() static method transforms a list of key-value pairs into an object.", and that's the magic, take a look.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;defaultValues&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Bar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;fruit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;banana&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;newValues&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Baz&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;fruit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;outputValues&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;defaultValues&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromEntries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newValues&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Boolean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What is the expected output?&lt;/strong&gt;&lt;br&gt;
Yes, you're right, now the output is the same as the simpler solution, but you can use in bigger objects.&lt;br&gt;
The final value is: &lt;code&gt;{foo: 'Baz', number: 40, fruit: 'banana'}&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;In conclusion, while the spread operator in JavaScript offers a convenient way to merge objects, it can lead to unexpected behavior when dealing with overlapping keys and potentially falsy values. The issue arises because the spread operator does not discriminate based on the truthiness of merged values. This can result in undesired outcomes, such as overriding default values with null or other falsy values.&lt;/p&gt;

&lt;p&gt;Check out my links&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://www.guimoraes.dev/" rel="noopener noreferrer"&gt;https://www.guimoraes.dev/&lt;/a&gt;&lt;br&gt;
Linkedin: &lt;a href="https://www.linkedin.com/in/guimoraesdev/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/guimoraesdev/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you find any error or just want to say hi, let a comment below.&lt;br&gt;
See ya! 👋&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>softwaredevelopment</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>O guia de estudos que eu usei e sempre passo pra frente (javascript)</title>
      <dc:creator>Guilherme Moraes</dc:creator>
      <pubDate>Tue, 18 Aug 2020 19:56:41 +0000</pubDate>
      <link>https://dev.to/guimoraes/o-guia-de-estudos-que-eu-usei-e-sempre-passo-pra-frente-javascript-49an</link>
      <guid>https://dev.to/guimoraes/o-guia-de-estudos-que-eu-usei-e-sempre-passo-pra-frente-javascript-49an</guid>
      <description>&lt;h1&gt;
  
  
  Meu Guia de estudos (javascript)
&lt;/h1&gt;

&lt;p&gt;Sempre que alguém me pergunta como começar a estudar programação me vem uma série de perguntas&lt;/p&gt;

&lt;p&gt;&lt;em&gt;O que tu já sabe?&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Sabe a área que tu quer seguir?&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Sabe quais áreas tem dentro de programação?&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Já criou uma base sólida do básico?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Todas essas perguntas (e &lt;strong&gt;muitas&lt;/strong&gt; outras) são essenciais pra começar a criar uma lista do que estudar&lt;/p&gt;

&lt;h2&gt;
  
  
  Maaaas...
&lt;/h2&gt;

&lt;p&gt;Acredito que uma pessoa que se interessou a te fazer essa pergunta e mostra interesse no assunto, pode ser uma oportunidade de tu apresentar a ela a nova carreira e fazer essa de uma forma menos penosa&lt;/p&gt;

&lt;h3&gt;
  
  
  Então...
&lt;/h3&gt;

&lt;p&gt;Vou começar me apresentando rápidamente.&lt;br&gt;
Me chamo Guilherme, começei no meu primeiro emprego como dev em 2019 e sou desenvolvedor full-stack pleno, com foco em desenvolvimento front-end (2020). Posso contar mais sobre mim em outro post, o foco aqui é em novos devs.&lt;/p&gt;

&lt;p&gt;Acredito que o que vou passar aqui pode servir pra qualquer um em início de carreira (dev JS), então vamos lá&lt;/p&gt;

&lt;h3&gt;
  
  
  O que eu acho que seria o ideal pra tu estudar
&lt;/h3&gt;

&lt;p&gt;Vou dividir esse post por tema e uns locais que tu pode aprender (pagos e gratuitos). &lt;br&gt;
Por favor, leiam até o final e não usem isso como a única verdade absoluta, tem um monte de conteúdo na internet e provavelmente muita gente que mandariam outros links&lt;br&gt;
Um abraço e bons estudos&lt;br&gt;
Obs.: Não ouve qualquer patrocínio dos cursos pagos aqui listados os coloquei por gostar bastante da plaaforma e metodos de ensino. Vale procurar por outros reviews antes de tomarem a decisão de compra-los, não me responsabilizo por nada.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Base
&lt;/h3&gt;

&lt;h4&gt;
  
  
  HTML5/CSS3, semântica e acessibilidade
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://www.cursoemvideo.com/course/html5/"&gt;Curso em vídeo - HTML5&lt;/a&gt; - gratuito&lt;br&gt;
&lt;a href="https://cursos.alura.com.br/category/front-end#html-css"&gt;Alura&lt;/a&gt; - pago&lt;/p&gt;

&lt;h4&gt;
  
  
  Metodologias CSS (BEM, RSCSS, ITCSS)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://www.maujor.com/tutorial/metodologia-bem-para-criar-codigo-legivel.php"&gt;Post Maujor - Metodologia BEM&lt;/a&gt; - gratuito&lt;br&gt;
&lt;a href="https://willianjusten.com.br/falando-sobre-rscss"&gt;Post William Justen - Falando sobre RSCSS&lt;/a&gt; - gratuito&lt;br&gt;
&lt;a href="https://willianjusten.com.br/organizando-seu-css-com-itcss"&gt;Post William Justen - Organizando seu CSS com ITCSS&lt;/a&gt;- gratuito&lt;/p&gt;

&lt;h4&gt;
  
  
  Lógica de programação/Algoritmos
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://www.cursoemvideo.com/course/curso-de-algoritmo/"&gt;Curso em vídeo - Algoritmo&lt;/a&gt; - gratuito&lt;br&gt;
&lt;a href="https://www.alura.com.br/cursos-online-programacao/logica"&gt;Alura - Lógica de programação&lt;/a&gt; - pago&lt;/p&gt;

&lt;h4&gt;
  
  
  JavaScript
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://www.alura.com.br/cursos-online-front-end/javascript"&gt;Alura - Javascript&lt;/a&gt; - pago&lt;br&gt;
&lt;a href="https://www.cursoemvideo.com/course/javascript/"&gt;Curso em vídeo - Javascript&lt;/a&gt; - gratuito&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=vrSEt5J4q2Y&amp;amp;list=PLbA-jMwv0cuWbas947cygrzfzHIc7esmp"&gt;Programador a bordo - playlist JS conceitos básicos&lt;/a&gt; - gratuito&lt;br&gt;
&lt;a href="https://www.youtube.com/channel/UCmjDevp9Y8r-qi-xueD3Izg"&gt;Canal Roger Melo - focado em JS puro&lt;/a&gt; - gratuito&lt;br&gt;
&lt;a href="https://developer.mozilla.org/pt-BR/"&gt;Documentação oficial da Mozilla&lt;/a&gt; - gratuito&lt;/p&gt;

&lt;h4&gt;
  
  
  Git/GitHub
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://www.cursoemvideo.com/course/curso-de-git-e-github/"&gt;Curso em vídeo - Git/Github&lt;/a&gt; - gratuito&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=2alg7MQ6_sI"&gt;Rocketseat - Git/Github&lt;/a&gt; - gratuito&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=FF1f4bKYhoo&amp;amp;list=PLbEOwbQR9lqzK14I7OOeREEIE4k6rjgIj"&gt;Professor José de Assis - Curso GIT e GITHUB&lt;/a&gt; - gratuito&lt;br&gt;
&lt;a href="https://cursos.alura.com.br/course/git-github-controle-de-versao"&gt;Alura - controle de versão&lt;/a&gt; - pago&lt;br&gt;
&lt;a href="https://cursos.alura.com.br/course/git-github-branching-conflitos-pull-requests"&gt;Alura - Estratégias de ramificação, Conflitos e Pull Requests&lt;/a&gt; - pago&lt;/p&gt;

&lt;h3&gt;
  
  
  Frameworks e ferramentas
&lt;/h3&gt;

&lt;p&gt;Agora vamos partir pros frameworks, mas &lt;strong&gt;atenção&lt;/strong&gt; não é porque tem esse monte de conteúdo aí em cima que tu só pode iniciar um framework quando finalizar eles, programação é um estudo constante e nunca deixe de estudar a base.&lt;/p&gt;

&lt;p&gt;Vamos lá!&lt;br&gt;
Existem muitos frameworks e libs no mercado e eu vou apresentar alguns&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Front-end: ReactJS, VueJS, Angular&lt;/li&gt;
&lt;li&gt;Back-end: ExpressJS, AdonisJS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esse é um assunto bem vasto e eu quero aprofundar em alguns posts específicos daqui pra frente, por isso eu vou deixar alguns conteúdos de consulta e início da sua busca por mais conhecimento (até alguma libs úteis de React no final)&lt;/p&gt;

&lt;h3&gt;
  
  
  Pra começar... documentações oficiais
&lt;/h3&gt;

&lt;p&gt;Sério, &lt;strong&gt;nunca&lt;/strong&gt; subestime a doc oficial de uma lib/framework&lt;br&gt;
Afinal de contas, ela é a oficial e foi criada pela galera que criou a parada. Você verá que apenas linkando a documentação oficial já terá uma enorme quantidade de conteúdo para estudo.&lt;br&gt;
Irei listar as docs oficiais e logo abaixo uma série de criadores de conteúdo que falam sobre eles e outros assuntos.&lt;/p&gt;

&lt;h4&gt;
  
  
  JavaScript
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://nodejs.org/en/"&gt;NodeJS&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;É runtime que permite executar JS fora de um navegador web. (a grosso modo)&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Um superset que adiciona tipagem ao JavaScript, é extremamente poderoso e torna suas aplicações ainda mais escaláveis, merece estar no seu radar.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Gerenciadores de pacotes
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Gerenciadores de pacotes nos permitem adicionar novas dependencias ao nosso projeto que já foram criadas por outros devs e nos poupam muito tempo, além disso, elas &lt;em&gt;gerenciam&lt;/em&gt; as versões dos pacotes para que atendam as mais diversas libs que utilizem diversas versões&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/"&gt;NPM&lt;/a&gt;&lt;br&gt;
&lt;a href="https://classic.yarnpkg.com/lang/en/"&gt;YARN&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Front-end
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://reactjs.org/"&gt;ReactJS&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uma das maiores(se não a maior) bibliotecas para criação de SPA(single page aplication[en]/aplicação de página única[ptBR]) e desenvolvimento front-end.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://vuejs.org/"&gt;VueJS&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Framework JavaScript mais recente a ganhar fama e ser amplamente utilizado pelo mercado de desenvolvimento front-end.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://angular.io/"&gt;Angular&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Um dos maiores e mais completos Frameworks para desenvolvimento front-end do mercado, já está a muitos anos sendo usado e está bem consolidado na sua proposta.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://sass-lang.com/"&gt;SASS&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lib para adicionar superpoderes ao CSS (sloghan deles mesmos haha), resolve alguns problemas antigos do CSS puro e melhora a sintaxe.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://styled-components.com/"&gt;Styled-components&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lib pra te ajudar a unir os poderes de CSS e JS, conhecido por CSS-in-JS.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Back-end
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://expressjs.com/"&gt;ExpressJS&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Framework back-end em Node leve e simples de ser usado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://adonisjs.com/"&gt;AdonisJS&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Framework back-end com mais 'opinião' e que lhe tras mais ferramentas e confiabilidade em seus projetos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://sequelize.org/"&gt;Sequelize&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ORM são ferramentas que auxiliam noi tratamento e gerenciamento de SQL aos bancos de dados&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;É uma plataforma open-source cuja finalidade é criar ambientes isolados para aplicações e serviços&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/bcryptjs"&gt;Bcrypt&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jwt.io/"&gt;JWT&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Patterns ou princípios
&lt;/h4&gt;

&lt;p&gt;Padrões e princípios são muito antigos em programação e são as coisas que menos mudam. Existem muitos padrões na área de programação (muitos mesmo)&lt;br&gt;
Vou adicionar aqui alguns que eu gosto bastante e que me ajudam muito a resolver problemas e escolher soluções no dia-a-dia&lt;/p&gt;

&lt;p&gt;S.O.L.I.D - &lt;a href="https://en.wikipedia.org/wiki/SOLID"&gt;wikipedia&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/@mari_azevedo/princ%C3%ADpios-s-o-l-i-d-o-que-s%C3%A3o-e-porque-projetos-devem-utiliz%C3%A1-los-bf496b82b299"&gt;Princípios S.O.L.I.D, por Mariana Azevedo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Factory - &lt;a href="https://en.wikipedia.org/wiki/Factory_method_pattern"&gt;wikipedia&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[Factory Method](&lt;a href="https://refactoring.guru/pt-br/design-patterns/factory-method"&gt;https://refactoring.guru/pt-br/design-patterns/factory-method&lt;/a&gt;}&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;KISS - &lt;a href="https://en.wikipedia.org/wiki/KISS_principle"&gt;wikipedia&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/@rafaelsouzaim/simplificar-n%C3%A3o-%C3%A9-estupidez-%C3%A9-engenhosidade-princ%C3%ADpio-kiss-keep-it-simple-stupid-ffa4a0b1943"&gt;Simplificar Não é Estupidez, é Engenhosidade, por Rafael Souza&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;DRY - &lt;a href="https://en.wikipedia.org/wiki/Don%27t_repeat_yourself"&gt;wikipedia&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.macoratti.net/16/04/net_dry1.htm"&gt;DRY - Don't Repeat Yourself - Não se repita&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Teste! Teste tudo, TU-DO!
&lt;/h4&gt;

&lt;p&gt;Existem vááárias libs de testes, mas vou deixar duas muito difundidas e uma delas com um canal focado e completíssimo&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jestjs.io/"&gt;Jest&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.cypress.io/"&gt;Cypress&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/c/Agilizei?sub_confirmation=1"&gt;Semana Agilizei&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Dicas:
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Seguir alguns blogs
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://willianjusten.com.br/"&gt;william Justen&lt;/a&gt;, &lt;a href="https://woliveiras.com.br/"&gt;William Oliveira&lt;/a&gt;, &lt;a href="https://www.felipefialho.com/"&gt;Felipe Fialho&lt;/a&gt;, &lt;a href="http://gabsferreira.com"&gt;Gabs Ferreira&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Acompanhar devs pela Twitch
&lt;/h4&gt;

&lt;p&gt;Quem sabe eu não serei o próximo rsrs&lt;br&gt;
&lt;a href="https://www.twitch.tv/marcobrunobr"&gt;Marco Bruno&lt;/a&gt;, &lt;a href="https://www.twitch.tv/codigofalado"&gt;Código Falado&lt;/a&gt;, &lt;a href="https://www.twitch.tv/glaucia_lemos86"&gt;Glaucia Lemos&lt;/a&gt;, &lt;a href="https://www.twitch.tv/toramaru08"&gt;Toramaru08&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Acompanhar devs pelo YouTube
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/user/aluracursosonline/"&gt;Alura&lt;/a&gt;, &lt;a href="https://www.youtube.com/user/BrazilJS"&gt;BrazilJS&lt;/a&gt;, &lt;a href="https://www.youtube.com/c/CollabCode/"&gt;CollabCode&lt;/a&gt;, &lt;a href="https://www.youtube.com/user/codigofontetv"&gt;Codigo Fonte TV&lt;/a&gt;, &lt;a href="https://www.youtube.com/c/DevEd/"&gt;Dev Ed (en)&lt;/a&gt;, &lt;a href="https://www.youtube.com/c/Devplenocom"&gt;DevPleno&lt;/a&gt;, &lt;a href="https://www.youtube.com/user/AkitaOnRails"&gt;AkitaOnRails&lt;/a&gt;, &lt;a href="https://www.youtube.com/c/FilipeDeschamps"&gt;FilipeDeschamps&lt;/a&gt;, &lt;a href="https://www.youtube.com/c/GlauciaLemos/"&gt;Glaucia Lemos&lt;/a&gt;, &lt;a href="https://www.youtube.com/channel/UCWrqsnPLl6aRX0ECUmPaZEw"&gt;Google Webmasters (en)&lt;/a&gt;, &lt;a href="https://www.youtube.com/c/ProgramadoraBordo"&gt;Programador a Bordo&lt;/a&gt;, &lt;a href="https://www.youtube.com/c/Programadorbr"&gt;ProgramadorBR&lt;/a&gt;, &lt;a href="https://www.youtube.com/c/RocketSeat"&gt;Rocketseat&lt;/a&gt;, &lt;a href="https://www.youtube.com/c/TrainingCenterChannel"&gt;Training Center&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Github! Nele tu pode ver os projetos opensource das pessoas e controlar as versões dos seus próprios, também serve como uma rede social&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/"&gt;GitHub - Home&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/frontendbr/vagas"&gt;Vagas Front-end&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/training-center"&gt;Training Center&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nesse link tu já consegue ver muitos livros gratuitos: &lt;a href="https://github.com/EbookFoundation/free-programming-books/blob/master/free-programming-books-pt_BR.md#javascript"&gt;Free programming books pt_BR&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nesse link tem guia de outra pessoa que ta bem legal e é gratuito: &lt;a href="https://medium.com/opensanca/carreira-front-end-o-guia-7f7fac303382"&gt;Carreira front-end o guia&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esse também é legal: &lt;a href="https://woliveiras.com.br/posts/guia-de-estudos-desenvolvedor-front-end-iniciante"&gt;Guia de estudos desenvolvedor front-end iniciante&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E esse: &lt;a href="https://www.felipefialho.com/blog/do-zero-a-heroi-do-front-end-parte-1/"&gt;Do zero a heroi do front-end parte 1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E esse: &lt;a href="https://www.felipefialho.com/blog/do-zero-a-heroi-do-front-end-parte-2"&gt;Do zero a heroi do front-end parte 2&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esse também: &lt;a href="https://jlcarvalho.github.io/guia-frontend"&gt;Guia front-end&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esse roadmap também é bem daora: &lt;a href="https://roadmap.sh/frontend"&gt;front-end&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pra finalizar, tem uns livros que eu comprei e gostei bastante, tu pode achar eles aqui&lt;br&gt;
&lt;a href="https://www.casadocodigo.com.br"&gt;https://www.casadocodigo.com.br&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.amazon.com.br/universo-programa%C3%A7%C3%A3o-carreira-desenvolvimento-software-ebook/dp/B07JZHXX4J/ref=sr_1_2?qid=1571231432&amp;amp;refinements=p_27%3AWilliam+Oliveira&amp;amp;s=digital-text&amp;amp;sr=1-2&amp;amp;text=William+Oliveira"&gt;O universo da programação: Um guia de carreira em desenvolvimento de software&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.amazon.com.br/Conselhos-gostaria-recebido-in%C3%ADcio-carreira-ebook/dp/B07PGWQ56S"&gt;Conselhos que eu gostaria de ter recebido no início da carreira&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Finalizando
&lt;/h2&gt;

&lt;p&gt;Muitos dos conteúdos que eu reuní durante o passar dos tempos foi de front-end, pois esse é meu foco, mas acredito que tenha deixado bons conceitos e bases para qualquer um que queria iniciar no desenvolvimento web&lt;br&gt;
Um abraço&lt;br&gt;
Críticas construtivas são muitíssimo bem vindas e adições serão mais ainda&lt;br&gt;
I'm sorry about my Portuguese&lt;br&gt;
Flws!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>career</category>
    </item>
  </channel>
</rss>
