<?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: GabrielOmar</title>
    <description>The latest articles on DEV Community by GabrielOmar (@gabrielomarq).</description>
    <link>https://dev.to/gabrielomarq</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%2F552583%2F5d45386c-f6c1-41c2-80d4-0d36ca60c464.jpg</url>
      <title>DEV Community: GabrielOmar</title>
      <link>https://dev.to/gabrielomarq</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gabrielomarq"/>
    <language>en</language>
    <item>
      <title>Compound Component Pattern en React</title>
      <dc:creator>GabrielOmar</dc:creator>
      <pubDate>Mon, 10 Jan 2022 02:58:45 +0000</pubDate>
      <link>https://dev.to/gabrielomarq/compound-component-pattern-en-react-a63</link>
      <guid>https://dev.to/gabrielomarq/compound-component-pattern-en-react-a63</guid>
      <description>&lt;p&gt;Podemos definir un patrón como una técnica que nos permite llegar a la resolución de problemas de distinta índole, como por ejemplo, problemas de comportamiento, estructurales, creacionales, entre otros.&lt;/p&gt;

&lt;p&gt;En este caso, el &lt;strong&gt;patrón de composición de componentes&lt;/strong&gt; o &lt;strong&gt;Compound Component Pattern&lt;/strong&gt; aplicado a React, nos permite manejar la información desde un componente padre y tener control total de todos los componentes hijos.&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ProductCard&lt;/span&gt;  &lt;span class="nx"&gt;product&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;product&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bg-dark&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ProductImage&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
   &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ProductTitle&lt;/span&gt;  &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
   &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ProductButtons&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/ProductCard&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En este caso tenemos el componente ProductCard, el cual recibe como &lt;strong&gt;children&lt;/strong&gt; 3 componentes los cuales también reciben información desde el padre a través del &lt;strong&gt;React Context&lt;/strong&gt;, a continuación los veremos a detalle&lt;/p&gt;

&lt;h2&gt;
  
  
  ProductCard
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;createContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;ReactElement&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;styles&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../styles/styles.module.css&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;useProduct&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../hooks/useProduct&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Product&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ProductContextProps&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../interfaces&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ProductImage&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./ProductImage&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ProductTitle&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./ProductTitle&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ProductButtons&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./ProductButtons&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ProductContext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;createContext&lt;/span&gt;&lt;span class="p"&gt;({}&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;ProductContextProps&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Provider&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ProductContext&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


 &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Props&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;product&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Product&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ReactElement&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ReactElement&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;className&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&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;ProductCard&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;product&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="nx"&gt;Props&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;increaseBy&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useProduct&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Provider&lt;/span&gt;
      &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt;
        &lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;increaseBy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;product&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;className&lt;/span&gt;
      &lt;span class="p"&gt;}}&lt;/span&gt;
    &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;productCard&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;children&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Provider&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;ProductCard&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ProductImage
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useContext&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ProductContext&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./ProductCard&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;noImage&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../assets/no-image.jpg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;styles&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../styles/styles.module.css&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ProductImage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;product&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ProductContext&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="na"&gt;imgToShow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;img&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;imgToShow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;img&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;img&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;imgToShow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;img&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;imgToShow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;noImage&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;img&lt;/span&gt;
        &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;productImg&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;imgToShow&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nx"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Coffee Mug&lt;/span&gt;&lt;span class="dl"&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="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ProductTitle
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useContext&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ProductContext&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./ProductCard&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;styles&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../styles/styles.module.css&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ProductTitle&lt;/span&gt; &lt;span class="o"&gt;=&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="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;string&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;product&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ProductContext&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;span&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;productDescription&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;title&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;product&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/span&lt;/span&gt;&lt;span class="err"&gt;&amp;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;h2&gt;
  
  
  ProductButtons
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useContext&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ProductContext&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./ProductCard&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;styles&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../styles/styles.module.css&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ProductButtons&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;increaseBy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ProductContext&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;buttonsContainer&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;buttonMinus&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;increaseBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;-&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;countLabel&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;counter&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;buttonAdd&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;increaseBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;+&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;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;Como podemos ver, cada componente hijo recibe diferentes Props como &lt;strong&gt;counter, increaseBy, product y className&lt;/strong&gt;, sin embargo a través del React Context, tenemos el control total desde nuestro componente padre. Esto nos abre una gran variedad de posibilidades para construir componentes reutilizables e incluso librerías personalizadas. Finalmente, aclarar que la meta principal de este patrón es lograr que nuestro componente sea lo más flexible posible.&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>🚀Una revisión rápida a los web components con Lit 🔥</title>
      <dc:creator>GabrielOmar</dc:creator>
      <pubDate>Sat, 02 Oct 2021 02:16:29 +0000</pubDate>
      <link>https://dev.to/gabrielomarq/una-revision-rapida-a-los-web-components-con-lit-2h93</link>
      <guid>https://dev.to/gabrielomarq/una-revision-rapida-a-los-web-components-con-lit-2h93</guid>
      <description>&lt;p&gt;En este post tendremos una pequeña vista de como crear web components utilizando Lit 2.0 el cual hace esta tarea bastante sencilla. Además, nos da la libertad de escalar tanto como lo necesitemos. Ya sea agregando &lt;strong&gt;unit testing, story books, patrones de diseño, entre otros&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Personalmente, he tenido mayor experiencia trabajando con Stenciljs pero con esta librería he encontrado un mundo de posibilidades a la hora de agregar componentes independientes o módulos a una aplicación sea ya creada o una que apenas comienza.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sintáxis de Lit
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;css&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;LitElement&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;lit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;ExampleComponent&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;LitElement&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nx"&gt;styles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;css&lt;/span&gt;&lt;span class="s2"&gt;`p { color: blue }`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="nx"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="kd"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Somebody&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="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="s2"&gt;`&amp;lt;p&amp;gt;Good, &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;! 🚀&amp;lt;/p&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nx"&gt;customElements&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;example-component&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ExampleComponent&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;En este punto es importante mencionar que lit puede trabajar con Typescript o Javascript y elegir entre uno de ellos va a depender de que necesitamos para nuestro proyecto. Asimismo, los componentes de Lit están basados en class components, tienen un ciclo de vida y manejan un método render donde usualmente muestran el HTML del componente.&lt;/p&gt;

&lt;p&gt;La forma de llamar a nuestro componente es tan sencilla como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;script type="module" src="./example-component.js"&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;example-component name="Gabriel"&amp;gt;&amp;lt;/example-component&amp;gt;
&amp;lt;/body&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Algo que hace interesante a Lit, es el peso de sus componentes ya que son bastante ligeros en comparación a otras librerías generadoras de web components.&lt;/p&gt;

&lt;p&gt;Invito a probar esta librería en su link oficial = () =&amp;gt; &lt;a href="https://lit.dev/"&gt;https://lit.dev/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>🚀Creando portales con React🚀</title>
      <dc:creator>GabrielOmar</dc:creator>
      <pubDate>Wed, 08 Sep 2021 00:49:40 +0000</pubDate>
      <link>https://dev.to/gabrielomarq/creando-portales-con-react-2cmh</link>
      <guid>https://dev.to/gabrielomarq/creando-portales-con-react-2cmh</guid>
      <description>&lt;p&gt;Hace poco tuve la oportunidad de ver como se empleaba los portales en React y me pareció una técnica bastante interesante ya que nos permite manejar de forma nativa, componentes en un nodo del DOM que viven fuera de la jerarquía del padre.&lt;/p&gt;

&lt;p&gt;Viéndolo de otro modo, los React Portals son una especie de API que nos permite renderizar componentes saltándonos la ya conocida jerarquía del DOM.&lt;/p&gt;

&lt;p&gt;Al comienzo uno puede pensar ´¿para qué demonios quiero romper la jerarquía del DOM?´, pues según la documentación oficial, los React Portals encajan bastante bien cuando queremos manejar un componente cuyo padre tiene estilos diferentes como un &lt;code&gt;z-index&lt;/code&gt; o un &lt;code&gt;overflow:hidden&lt;/code&gt; y queremos saltarnos esto. Por ejemplo, una ventana de chat, un tooltip, entre otros.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creando un portal con React
&lt;/h2&gt;

&lt;p&gt;Pues para comenzar, lo primero que se necesita es añadir la etiqueta en nuestro archivo &lt;code&gt;index.html&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;body&amp;gt;
&amp;lt;div id='root'&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;div id='myModal'&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como podemos observar, el elemento &lt;strong&gt;myModal&lt;/strong&gt; se encuentra al mismo nivel que el elemento &lt;strong&gt;root&lt;/strong&gt;. Lo genial de los portales es que nos permitirá renderizar nuestro componente, saltándonos la jerarquía del DOM.&lt;/p&gt;

&lt;p&gt;Como siguiente paso tenemos que crear nuestro archivo para el componente Modal&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React from 'react';
import ReactDOM from "react-dom";
import "./Modal.css";

const myModalContainer = document.querySelector("#myModal");

const Modal = ({ title, children, isOpened, closeModal }) =&amp;gt; {
  return (
    isOpened &amp;amp;&amp;amp;
    ReactDOM.createPortal(
      &amp;lt;div className="modal"&amp;gt;
        &amp;lt;div className="modal-title"&amp;gt;{title}&amp;lt;/div&amp;gt;
        &amp;lt;button onClick={closeModal}&amp;gt;X&amp;lt;/button&amp;gt;
        &amp;lt;div className="modal-body"&amp;gt;{children}&amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;,
      myModalContainer
    )
  );
};

export default Modal;


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

&lt;/div&gt;



&lt;p&gt;Como podemos ver en el ejemplo, &lt;code&gt;ReactDOM.createPortal&lt;/code&gt; recibe dos argumentos, lo primero es la estructura a renderizar y luego el elemento donde queremos que aparezca.&lt;/p&gt;

&lt;p&gt;Una vez hecho esto, solo queda añadir el paso final en nuestro componente que activará el modal, en este caso useremos &lt;code&gt;App.js&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

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

export default function App() {
  const [isOpened, setIsOpened] = useState(false);

  const handleOpenModal = () =&amp;gt; setIsOpened(true);
  const handleCloseModal = () =&amp;gt; setIsOpened(false);

  return (
    &amp;lt;div className="App"&amp;gt;
      &amp;lt;h1&amp;gt;Hello I'm Gabriel and I'm using React Portals&amp;lt;/h1&amp;gt;
      &amp;lt;button onClick={handleOpenModal}&amp;gt;Open Modal&amp;lt;/button&amp;gt;
      &amp;lt;Modal title="Success" isOpened={isOpened} closeModal={handleCloseModal}&amp;gt;
        This is my modal content
      &amp;lt;/Modal&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

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

&lt;/div&gt;



&lt;p&gt;De esta forma lograremos renderizar nuestro modal, a este ejemplo falto agregarle estilos 😁&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%2Fj16pdt4sxgkwvi4n1ux4.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%2Fj16pdt4sxgkwvi4n1ux4.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>🚀😎SPA, SSR Y SSG ¿cómo, cuándo y por qué?</title>
      <dc:creator>GabrielOmar</dc:creator>
      <pubDate>Fri, 20 Aug 2021 15:53:37 +0000</pubDate>
      <link>https://dev.to/gabrielomarq/spa-ssr-y-ssg-como-cuando-y-por-que-2d7e</link>
      <guid>https://dev.to/gabrielomarq/spa-ssr-y-ssg-como-cuando-y-por-que-2d7e</guid>
      <description>&lt;p&gt;Hace unos años, basábamos el desarrollo web en frameworks puros como son &lt;strong&gt;Angular, React y Vue&lt;/strong&gt;, todos ellos proveen lo que conocemos como client-side rendering (Single Page Application). Pero, con el paso del tiempo descubrimos diferentes necesidades a la hora de renderizar las aplicaciones es ahí donde entra lo que conocemos como SSR y SGR. ¿El problema?, muchos desarrolladores no tienen del todo claro cuando optar por alguno.&lt;/p&gt;

&lt;p&gt;Podemos diferir que no tendría mucho sentido usar &lt;strong&gt;SSR&lt;/strong&gt; para una TODO App así como no tendría sentido construir tu blog usando SPA, ¿o quizás si lo tendría?.&lt;/p&gt;

&lt;p&gt;Es ahí el detalle, no existe una lista definida de cuando usar que. Sin embargo, explicaremos en que consiste cada uno, los pro y contras para que puedas tomar la mejor decisión al desarrollar tu próxima aplicación.&lt;/p&gt;

&lt;h2&gt;
  
  
  Client Side Rendering
&lt;/h2&gt;

&lt;p&gt;Es la forma más común de renderizado de las herramientas más populares que tenemos actualmente como &lt;strong&gt;Angular, React, Vuejs, Ember, etc&lt;/strong&gt;. Con esta solución, el servidor renderiza una página en blanco con una etiqueta &lt;strong&gt;script&lt;/strong&gt; que apunta al bundle de nuestra aplicación.&lt;br&gt;
Esta página en blanco es mandada al navegador del cliente, el cual empieza a correr la aplicación, compila todo lo necesario y empieza a hacer las llamadas a las respectivas Apis del proyecto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Es rápida en el servidor: ya que solo estás renderizando una página en blanco, está carga muy rápido.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Soporta SPA: Client-Side Rendering es el único que soporta las aplicaciones SPA.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Contras
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;No hay renderizado inicial: estás enviando una página en blanco al navegador del cliente, así que si tu aplicación es muy grande o si el visitante tiene una conexión a internet lenta, no sería muy buena idea, ¿verdad?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Seguridad: se dice mucho que comparadas a las páginas tradicionales, las SPA son menos seguras frente a un ataque de Cross-site scripting (XSS).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Empieza siendo un &lt;/p&gt; vacío: esto significa que no habrá data inicial para los sistemas y scripts de SEO. Recalcar que existen herramientas en cada uno de estos frameworks basados en SPA para poder mejorar el aspecto del SEO.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Server Side Rendering
&lt;/h2&gt;

&lt;p&gt;Se puede definir como la forma de renderizar una página web en el servidor en vez de usar el navegador. La principal diferencia con una SPA sería que cuando el usuario requiera pasar de una página a otra, deberá esperar unos segundos a que la página renderice en el servidor para luego ser enviada al browser.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Contenido disponible inmediatamente: ya que estás enviando &lt;em&gt;HTML&lt;/em&gt; renderizado desde el servidor, el contenido se visualizará inmediatamente.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No hay llamadas adicionales en el cliente: lo importante de que el servidor renderice la página es que hará todas las llamadas necesarias en ese momento, en ese sentido no estarás haciendo llamadas adicionales en el lado del cliente.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Muy bueno para el SEO: al tener acceso a la web de forma inmediata, las herramientas de SEO pueden trabajar correctamente.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Contras
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Lento en el servidor: recuerda que estás renderizando la página dos veces, una en el servidor y otra en el cliente. Adicional a ello, probablemente se estén llamando &lt;strong&gt;APIs&lt;/strong&gt; para preparar toda la información. Todo esto, supone un tiempo que el cliente debe esperar. Sin embargo, si mejoras y optimizas el perfomance de tu aplicación, podrás manejarlo de mejor forma.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Incompatible con algunas librerías: Si alguna de tus librerías depende del &lt;strong&gt;document&lt;/strong&gt; o de &lt;strong&gt;window&lt;/strong&gt;, tendrás que buscar la forma de reemplazarlos ya que &lt;strong&gt;Node&lt;/strong&gt; no maneja estos elementos. Una solución ideal podrían ser las &lt;strong&gt;custom NPM libraries&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Static Site Generation
&lt;/h3&gt;

&lt;p&gt;Se podría definir como el software que crea las páginas HTML a partir de ciertos &lt;strong&gt;templates&lt;/strong&gt; o fuentes de información. Le puedes dar unos artículos de texto y el generador creará la web en base a ello.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Alta velocidad: ya que todo el contenido puede ser generado en tiempo real, el cliente empezará a ver la información casi inmediatamente. ¿Lo mejor?, al tener esta fuente de información no tendrás que preocuparte por APIs externas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No hay llamadas adicionales en el lado del cliente: idealmente no tendrás que llamar APIs externas ya que al construirse la página se harán todos los llamados necesarios.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Muy bueno para el SEO.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Seguridad: al ser generados por documentos estáticos, la posibilidad de recibir ataques de seguridad es mínima. Esto principalmente porque este tipo de webs no manejan bases de datos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No hay servidor o backend como también se le conoce: al tener una fuente que produce estos templates de información, no tendrás que monitorear un servidor o ver problemas como los clásicos &lt;strong&gt;memory leak&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Contras
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Puede llegar a ser lento: puede llegar a volverse lento dependiendo de que tanto crezca la aplicación.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Incompatible con algunas librerías UI: por la misma razón que se comentó en las páginas SSR.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ¿Cuándo usar qué?
&lt;/h2&gt;

&lt;p&gt;Bajo mi experiencia, tomar esta decisión dependerá mucho del tipo de aplicación que se vaya a desarrollar. Por eso, lo ideal es primero tener los requerimientos exactos e incluso hasta donde podría escalar a corto y mediano plazo, para que de esa manera pueda satisfacer esas funcionalidades.&lt;/p&gt;

&lt;p&gt;Hoy en día tenemos muchas herramientas para desarrollar software, debemos usarlas con responsabilidad y bajo un sustento técnico siempre:&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>angular</category>
      <category>react</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Trucos en Angular que mejorarán el performance de tus aplicaciones.</title>
      <dc:creator>GabrielOmar</dc:creator>
      <pubDate>Sat, 01 May 2021 22:42:58 +0000</pubDate>
      <link>https://dev.to/gabrielomarq/trucos-en-angular-que-mejoraran-el-performance-de-tus-aplicaciones-5g95</link>
      <guid>https://dev.to/gabrielomarq/trucos-en-angular-que-mejoraran-el-performance-de-tus-aplicaciones-5g95</guid>
      <description>&lt;p&gt;Angular es un framework bastante popular en el mundo empresarial. A pesar de que tiene la curva de aprendizaje más elevada que el resto, mucha gente se anima a aprenderlo. Personalmente, a mi me gusta bastante y es por eso que acá te dejaré unos trucos que tal vez no conocías 😎&lt;/p&gt;

&lt;h2&gt;
  
  
  Lazy Loading
&lt;/h2&gt;

&lt;p&gt;Está característica es bastante popular ya que nos permite configurar nuestra aplicación para que cargue los archivos únicamente cuando son necesarios. Por ejemplo, tenemos dos vistas donde la primera sería la presentación y la segunda el blog. Todos los recursos que se necesiten para cargar el blog, no serán 'llamados/ejecutados' hasta que el usuario no vaya a esa sección.&lt;/p&gt;

&lt;h2&gt;
  
  
  Destruyendo Observables
&lt;/h2&gt;

&lt;p&gt;Si bien los observables son de RxJs, cuando trabajemos con Angular, los vamos a usar bastante ya sea para los servicios o estar escuchando ciertos cambios de nuestra aplicación. Sin embargo, los observables tienen la particular característica que no se destruyen por si solos sino que debemos forzar a que suceda. Esto es necesario ya que sino, nuestros observables seguirán consumiendo espacio de memoria en background y podría hacer nuestra aplicación más lenta. Formas para destruir observables hay muchas, pero una que me gusta bastante es a través del operador &lt;em&gt;takeUntil&lt;/em&gt;, el cual podemos anteponer a nuestra suscripción con el operador &lt;em&gt;pipe&lt;/em&gt;, también de Rxjs. Al mismo tiempo nos apoyamos de un subject de tipo void que su única función sera hacer un &lt;em&gt;next()&lt;/em&gt; y &lt;em&gt;complete()&lt;/em&gt; en el OnDestroy del componente. Lo mejor es que de esta manera, podemos reutilizar nuestro subject en todas las subscripciones que tengamos en nuestro componente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pre fetching
&lt;/h2&gt;

&lt;p&gt;Está funcionalidad es sin duda demasiado buena, parecido a lo que viene por default en otras tecnologías como &lt;em&gt;Gatsby&lt;/em&gt;, podemos hacer que algunos archivos vayan pre cargando antes que el usuario entre a esa página. Por ejemplo, si vamos a entrar a una galería al colocar el mouse sobre el botón que nos llevará, nuestra aplicación irá cargando en background las imágenes respectivas para que de esta manera la experiencia del usuario sea mucho mejor.&lt;/p&gt;

&lt;p&gt;Si te han gustado estos trucos puedes verlos en mis diferentes proyectos de github(&lt;a href="https://github.com/QuispeRosasGabriel"&gt;https://github.com/QuispeRosasGabriel&lt;/a&gt;) 😎 y tú tienes algún truco que te gustaría compartir?&lt;/p&gt;

</description>
      <category>angular</category>
      <category>webdev</category>
      <category>codenewbie</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Mi experiencia participando en la NgConf 2021</title>
      <dc:creator>GabrielOmar</dc:creator>
      <pubDate>Wed, 28 Apr 2021 22:36:09 +0000</pubDate>
      <link>https://dev.to/gabrielomarq/mi-experiencia-participando-en-la-ngconf-2021-3m7g</link>
      <guid>https://dev.to/gabrielomarq/mi-experiencia-participando-en-la-ngconf-2021-3m7g</guid>
      <description>&lt;p&gt;La NgConf es la conferencia mundial de Angular que se organiza en Estados Unidos. Este año, por la coyuntura del Covid-19, el evento pasó a ser virtual. Sin duda, esto permitió que mucha más gente pueda inscribirse como speaker y/o participante.&lt;/p&gt;

&lt;p&gt;En este evento se juntan varios de los mejores desarrolladores del mundo que trabajan en empresas como Google, Amazon, Facebook, Uber, Apple, Microsoft, etc. Y es una gran oportunidad para aprender de ellos.&lt;/p&gt;

&lt;p&gt;Mi experiencia fue bastante buena ya que pude participar en una &lt;strong&gt;lightning  talk&lt;/strong&gt; con un tema que tiene bastante acogida por varios desarrolladores: &lt;strong&gt;Angular and Stencil working together&lt;/strong&gt;. Aquí pude explicar de como estas tecnologías trabajan juntas y que beneficios traen a nuestras aplicaciones. La sesión fue grabada y estará en los canales oficiales de la NgConf en unas semanas. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--o1Stwn5O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://media-exp1.licdn.com/dms/image/C4D22AQFVS5dL3Kd8Tw/feedshare-shrink_800/0/1619119301633%3Fe%3D1622678400%26v%3Dbeta%26t%3DNog7kHD-3wRd9cflm2BNAhHi_RrEeWK5ELZRKtysSJQ" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--o1Stwn5O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://media-exp1.licdn.com/dms/image/C4D22AQFVS5dL3Kd8Tw/feedshare-shrink_800/0/1619119301633%3Fe%3D1622678400%26v%3Dbeta%26t%3DNog7kHD-3wRd9cflm2BNAhHi_RrEeWK5ELZRKtysSJQ" alt="NgConf lightning talks"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finalmente, destacar también mi experiencia como participante, aprendí mucho de las tendencias emergentes con diferentes herramientas tecnológicas como Angular, Typescript, etc. Sin duda, una experiencia que volvería a repetir y espero poder volver a ser speaker en la siguiente NgConf 🚀😎&lt;/p&gt;

</description>
      <category>angular</category>
      <category>webdev</category>
      <category>codenewbie</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Some advice for React projects structure</title>
      <dc:creator>GabrielOmar</dc:creator>
      <pubDate>Sat, 10 Apr 2021 17:30:55 +0000</pubDate>
      <link>https://dev.to/gabrielomarq/some-advice-for-react-projects-structure-58c3</link>
      <guid>https://dev.to/gabrielomarq/some-advice-for-react-projects-structure-58c3</guid>
      <description>&lt;p&gt;Most of frameworks have a strict way to name the components and folders of the project. But, React allows us to make a custom structure. So here are some advice that should be used on your React projects.&lt;/p&gt;

&lt;p&gt;First of all, this post is based on a create-react-app application so we can see the details here:&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%2Fzzszcvhtckfs58ejtoc6.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%2Fzzszcvhtckfs58ejtoc6.png" alt="container components"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Structuring components
&lt;/h3&gt;

&lt;p&gt;In many projects, components are in a shared folder that are used in all the app. So, in this case I'm gonna show 3 types of components:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Components: they are a group of components that have isolated styles and logic. For example, an Input component used in a Form.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Containers: these type of components have a strict rule, they interact with api request and pass or get the information from their children.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pages: usually are different types of components working together.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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%2Fmiro.medium.com%2Fmax%2F424%2F1%2AT7zuODCV5mT6lm7reKxN5A.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%2Fmiro.medium.com%2Fmax%2F424%2F1%2AT7zuODCV5mT6lm7reKxN5A.png" alt="structure of components"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Is important to say that for each page, container and component, we have to create a folder to keep isolated logic and styles.&lt;/p&gt;

&lt;h3&gt;
  
  
  And what about the global constants?
&lt;/h3&gt;

&lt;p&gt;Is a good practice to keep global functions and constants in a separate file, so we can change it quickly.&lt;/p&gt;

&lt;p&gt;Also, we can manage a service file that has all the endpoints for that section.&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%2Fmiro.medium.com%2Fmax%2F274%2F1%2AEGdN-oEA6bLj1-Kp86VCVQ.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%2Fmiro.medium.com%2Fmax%2F274%2F1%2AEGdN-oEA6bLj1-Kp86VCVQ.png" alt="Services"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Custom hooks and global helpers
&lt;/h3&gt;

&lt;p&gt;These files manage a reusable function. For example, a custom hook that can change the currency.&lt;/p&gt;

&lt;p&gt;So we can manage them in two global folders that should be called hooks and utils, so we can access to there from any part of the app.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Global Functions&lt;/em&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F366%2F1%2AnO5k_j97lSe6sfr71iKMwA.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%2Fmiro.medium.com%2Fmax%2F366%2F1%2AnO5k_j97lSe6sfr71iKMwA.png" alt="Global Functions"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Global Hooks&lt;/em&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F336%2F1%2A8cnmbOgOtm5jWg820P88nQ.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%2Fmiro.medium.com%2Fmax%2F336%2F1%2A8cnmbOgOtm5jWg820P88nQ.png" alt="Global Hooks"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Name of folders
&lt;/h3&gt;

&lt;p&gt;This part is very important because we can save a lot of time if we can read our code quickly.&lt;/p&gt;

&lt;p&gt;We can follow Kebab Case rule and use (-). However, there are some general rules:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Components: Is must that our components starts with capital letter. For example, if we have an userform, we should call it UserForm.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Containers: Usually are descriptive and have the name of the children. For example, if the child is UserForm, our container should be calle UserFormContainer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Hooks: It is recommended by the team that mantain React to write the hooks with use. So, if we have a custom hooks that changes the currency, it should be callde useChangeCurrency.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Request: About the request files, usually are called like =&amp;gt; &lt;strong&gt;[get | post | mutation | query…]-[name of the request]-[request].&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Types: These files just save types of actions so they should called like =&amp;gt; [name of the action that will be typed]-types.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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%2Fmiro.medium.com%2Fmax%2F383%2F1%2AdBWN8Si5BT_BuDf3NmMslw.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%2Fmiro.medium.com%2Fmax%2F383%2F1%2AdBWN8Si5BT_BuDf3NmMslw.png" alt="General rules"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;If we show an organized structure for our projects, we will be able to add new feature quickly. Also, it will make easier to work in teams.&lt;/p&gt;

</description>
      <category>react</category>
      <category>discuss</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Angular VS React 🥊</title>
      <dc:creator>GabrielOmar</dc:creator>
      <pubDate>Thu, 08 Apr 2021 03:04:06 +0000</pubDate>
      <link>https://dev.to/gabrielomarq/angular-vs-react-3nop</link>
      <guid>https://dev.to/gabrielomarq/angular-vs-react-3nop</guid>
      <description>&lt;p&gt;Una de las preguntas que más me hacen en las entrevistas laborales es: &lt;strong&gt;'¿Cual es mejor para ti? ¿Angular o React?'&lt;/strong&gt;. Lo que tenemos que tener claro es que ambos tienen características que pueden o no ayudarte en el desarrollo de tu aplicación. A continuación entraremos más en detalle.&lt;/p&gt;

&lt;h2&gt;
  
  
  Peso de la aplicación el producción
&lt;/h2&gt;

&lt;p&gt;Un punto bastante importante es el peso final del bundle de nuestros proyectos, en este caso una aplicación estándar de react bien desarrollada genera un bundle mucho más ligero que una aplicación desarrollada en Angular con similares características.&lt;/p&gt;

&lt;h2&gt;
  
  
  Flexibilidad vs trabajo estricto
&lt;/h2&gt;

&lt;p&gt;En mi opinión personal y habiendo trabajado con ambas herramientas en proyectos grandes y medianos, puedo decir que React ofrece cierta libertad que no encuentras en Angular. Además, posee mayor cantidad de compatibilidad con &lt;em&gt;third party libraries&lt;/em&gt; lo que puede ser beneficioso para agregar funcionalidades de forma rápida. Por otro lado, con Angular el manejo de la aplicación es más estricta y rigurosa, haciendo que desarrollemos bajo patrones estrictos. Un claro ejemplo sería el patrón MVC o MVP. Además, al tener como base TypeScript, nos obliga a tener nuestras variables tipadas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Manejo de formularios
&lt;/h2&gt;

&lt;p&gt;Si bien en React podemos utilizar Formik, React Hooks Form u otra forma para manejar formularios, cuando usamos Angular tenemos la característica de los &lt;strong&gt;reactive forms&lt;/strong&gt;, que son bastante poderosos si se usan de forma correcta. Nos permite manejar formularios dinámicos con campos a donde podemos suscribirnos y escuchar por cambios.&lt;/p&gt;

&lt;h2&gt;
  
  
  Estructura de carpetas
&lt;/h2&gt;

&lt;p&gt;Angular tiene bien definida la estructura a seguir para las aplicaciones. Almacenando métodos compartidos en &lt;strong&gt;servicios&lt;/strong&gt;, manejando transformadores de data en &lt;strong&gt;pipes&lt;/strong&gt; e incluso agrupando componentes en &lt;strong&gt;módulos&lt;/strong&gt;. Por otro lado, React tiene mucha más flexibilidad y te permite ordenar tus componentes como mejor te parezca. Si bien esto se oye genial, puede causar que los principiantes creen proyectos enredados y poco mantenibles.&lt;/p&gt;

&lt;p&gt;PO: ambas herramientas tienen una finalidad, desarrollar componentes del lado del cliente. Si bien la forma de trabajo es distinta, lo ideal es poder entender bien las bases y trabajar con el que te sientas más cómodo. Algo que casi seguro es que si dominas uno y dominas &lt;strong&gt;JS/TS&lt;/strong&gt;, podrás trabajar con cualquier framework frontend. 😎&lt;/p&gt;

</description>
      <category>react</category>
      <category>angular</category>
      <category>webdev</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Module federation, ¿el futuro del micro frontend?</title>
      <dc:creator>GabrielOmar</dc:creator>
      <pubDate>Wed, 07 Apr 2021 03:43:49 +0000</pubDate>
      <link>https://dev.to/gabrielomarq/module-federation-el-futuro-del-micro-frontend-1k0k</link>
      <guid>https://dev.to/gabrielomarq/module-federation-el-futuro-del-micro-frontend-1k0k</guid>
      <description>&lt;p&gt;Estoy seguro que en alguna ocasión hemos escuchado de los micro servicios, una técnica bastante interesante en desarrollo backend que permite dividir tareas en sub tareas independientes que convivan entre si, a través de &lt;strong&gt;module federation&lt;/strong&gt; y del &lt;strong&gt;micro frontend&lt;/strong&gt; podemos lograr un concepto similar en el lado del cliente.&lt;/p&gt;

&lt;p&gt;Si bien este concepto no es nuevo, la forma en como los frameworks de hoy en día se adaptan a esta técnica, permiten un desarrollo eficiente y granular. Pero, ¿en qué consiste exactamente una aplicación hecha con micro frontend?. Veamos la gráfica&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dAgBQXJ0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://micro-frontends.org/ressources/diagrams/organisational/verticals-headline.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dAgBQXJ0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://micro-frontends.org/ressources/diagrams/organisational/verticals-headline.png" alt="microfrontendchart"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como podemos ver consiste en dividir el frontend de un aplicación en pequeñas micro aplicaciones que cumplen un rol específico y se comunican entre si, de esta manera podemos trabajar de forma aislada en cada funcionalidad y hacer que convivan entre si, sin que exista esa dependencia. &lt;/p&gt;

&lt;p&gt;Algunos aspectos importantes de los micro frontend y reglas que se brindaron en la NGConf2020 (Conferencia mundial de Angular 2020):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Tecnologías independientes =&amp;gt; cada micro app es trabajada con la tecnología que mejor se adapte a las funcionalidades de forma que el equipo es libre de decidir.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Código independiente =&amp;gt; en la mayoría de casos y como buena práctica, se pide que cada aplicación conviva con si misma, es decir de no manejar estados o variables globales.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Establecer reglas de trabajo =&amp;gt; se debe coordinar entre todos los equipos la forma en que se trabajara los estilos, los storage sea local storage, session storage, etc con el fin de manejar un estándar en todo el proyecto.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;El DOM es la api =&amp;gt; es preferible usar los &lt;strong&gt;browser events&lt;/strong&gt; para la comunicación. Si es realmente necesario manejar una api general, tratar de mantenerlo lo más simple posible.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Apuntar al clean code, es una prioridad =&amp;gt; si bien se trabaja en equipos separados, se debe manejar un estándar para que cualquier desarrollador front del proyecto pueda dar mantenimiento a cualquiera de las micro aplicaciones.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Bien ahora, hablemos acerca de Module Federation:
&lt;/h2&gt;

&lt;p&gt;Con la llegada de Webpack5, tenemos la posibilidad de trabajar con micro frontend de forma sencilla, a través de un archivo de Webpack, podemos configurar en totalidad la salida y que archivos se estarán compartiendo de nuestros micro frontend. &lt;/p&gt;

&lt;h4&gt;
  
  
  Veamos el archivo de la aplicación principal en Angular...
&lt;/h4&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;ModuleFederationPlugin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;webpack/lib/container/ModuleFederationPlugin&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;mf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@angular-architects/module-federation/webpack&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;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;path&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;sharedMappings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;mf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SharedMappings&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;sharedMappings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../../tsconfig.json&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;session-lib&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="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;uniqueName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;shell&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;optimization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Only needed to bypass a temporary bug&lt;/span&gt;
    &lt;span class="na"&gt;runtimeChunk&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;ModuleFederationPlugin&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;

        &lt;span class="c1"&gt;// For hosts (please adjust)&lt;/span&gt;
        &lt;span class="na"&gt;remotes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;admin&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;admin@http://localhost:3000/remoteEntry.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;

        &lt;span class="na"&gt;shared&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@angular/core&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="na"&gt;singleton&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;strictVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@angular/common&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="na"&gt;singleton&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;strictVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@angular/router&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="na"&gt;singleton&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;strictVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@angular/material/button&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="na"&gt;singleton&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;strictVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@angular/material/icon&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="na"&gt;singleton&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;strictVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@angular/material/toolbar&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="na"&gt;singleton&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;strictVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@angular/animations&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="na"&gt;singleton&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;strictVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@angular/cdk&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="na"&gt;singleton&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;strictVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;sharedMappings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getDescriptors&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="nx"&gt;sharedMappings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getPlugin&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;h4&gt;
  
  
  Ahora conozcamos uno de los micro sitios anclados a esta micro app...
&lt;/h4&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;ModuleFederationPlugin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;webpack/lib/container/ModuleFederationPlugin&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;mf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@angular-architects/module-federation/webpack&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;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;path&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;sharedMappings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;mf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SharedMappings&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;sharedMappings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../../tsconfig.json&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;session-lib&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="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="na"&gt;optimization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;runtimeChunk&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;ModuleFederationPlugin&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;

        &lt;span class="c1"&gt;// For remotes (please adjust)&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;admin&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;remoteEntry.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;exposes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./Dashboard&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./projects/remote/src/app/dashboard/dashboard.module.ts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./Contact&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./projects/remote/src/app/contact/contact.module.ts&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="na"&gt;shared&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@angular/core&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="na"&gt;singleton&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;strictVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@angular/common&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="na"&gt;singleton&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;strictVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@angular/router&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="na"&gt;singleton&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;strictVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@angular/material/button&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="na"&gt;singleton&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;strictVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@angular/material/icon&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="na"&gt;singleton&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;strictVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@angular/material/toolbar&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="na"&gt;singleton&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;strictVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@angular/animations&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="na"&gt;singleton&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;strictVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@angular/cdk&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="na"&gt;singleton&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;strictVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;sharedMappings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getDescriptors&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="nx"&gt;sharedMappings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getPlugin&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;Como hemos podido ver, los archivos de configuración son bastante sencillos de configurar. Algo importante para resaltar es que son altamente escalables, el límite va a depender mucho frente a que aplicación estemos. Otro detalle a tener en cuenta es que si bien Webpack 5 ya fue lanzado, Angular 11 aún no tiene todo el soporte acerca del mismo, personalmente aún no lo usaría para producción, pero cada uno tiene su punto de vista y opinión 😎&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>discuss</category>
      <category>webpack</category>
      <category>angular</category>
    </item>
    <item>
      <title>Ya entendí HTML, CSS y JS, ahora qué sigue?</title>
      <dc:creator>GabrielOmar</dc:creator>
      <pubDate>Fri, 02 Apr 2021 20:56:10 +0000</pubDate>
      <link>https://dev.to/gabrielomarq/ya-entendi-html-css-y-js-ahora-que-sigue-147m</link>
      <guid>https://dev.to/gabrielomarq/ya-entendi-html-css-y-js-ahora-que-sigue-147m</guid>
      <description>&lt;p&gt;Muchas veces cuando una persona empieza en el camino del desarrollo web se le recomienda aprender las bases como son &lt;em&gt;HTML, CSS y JS&lt;/em&gt;, pero ¿Qué sigue después de aprender estos tres?&lt;/p&gt;

&lt;p&gt;Lo que actualmente se solicita en diversas ofertas laborales para &lt;strong&gt;frontend developer&lt;/strong&gt; es el conocimiento en algún framework &lt;em&gt;Javascript&lt;/em&gt;, a continuación hablaremos de algunos de los más buscados:&lt;/p&gt;

&lt;h2&gt;
  
  
  Angular
&lt;/h2&gt;

&lt;p&gt;Framework creado por Google, permite desarrollar aplicaciones robustas bajo patrones estrictos como MVC (model-view-controller) y MVP(model-view-presenter), entre otros. Utilizan TypeScript para aprovechar el tipado y las características del mismo. Separa los componentes en 4 archivos principales donde guardamos la lógica, la UI, las pruebas unitarias y los estilos respectivamente. Algo importante es que cada componente esta basado en clases y tiene métodos propios para manejar el ciclo de vida. &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%2Fres.cloudinary.com%2Fpracticaldev%2Fimage%2Ffetch%2Fs--DYfpZirq--%2Fc_limit%252Cf_auto%252Cfl_progressive%252Cq_auto%252Cw_880%2Fhttps%3A%2F%2Fmiro.medium.com%2Fmax%2F990%2F1%252AOc2PsJ-QKOUG2I8J3HNmWQ.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%2Fres.cloudinary.com%2Fpracticaldev%2Fimage%2Ffetch%2Fs--DYfpZirq--%2Fc_limit%252Cf_auto%252Cfl_progressive%252Cq_auto%252Cw_880%2Fhttps%3A%2F%2Fmiro.medium.com%2Fmax%2F990%2F1%252AOc2PsJ-QKOUG2I8J3HNmWQ.png" alt="Angular"&gt;&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ComponentFactoryResolver&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Injector&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/core&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="nd"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;my-app&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;templateUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./app.component.html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;styleUrls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./app.component.css&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="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AppComponent&lt;/span&gt;  &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kr"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;ngOnInit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Utilizando Angular&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aprende más de Angular en: &lt;a href="https://angular.io/" rel="noopener noreferrer"&gt;https://angular.io/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  React
&lt;/h2&gt;

&lt;p&gt;Librería mantenida por Facebook y diversos grupos de desarrolladores. Nos permite crear componentes utilizando JSX, de esta forma podemos combinar &lt;strong&gt;Javascript&lt;/strong&gt; dentro de nuestro HTML. Cada componente puede tener su archivo con extension .js o .jsx de acuerdo a las reglas que manejemos en nuestro proyecto. &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%2Fencrypted-tbn0.gstatic.com%2Fimages%3Fq%3Dtbn%3AANd9GcQ7dOATxXeVNwYUdaDkhMU78uWL8Af16NjWDIfYwrTM-mPxivIhWRb5EOGwlKYZS5qSpMY%26usqp%3DCAU" 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%2Fencrypted-tbn0.gstatic.com%2Fimages%3Fq%3Dtbn%3AANd9GcQ7dOATxXeVNwYUdaDkhMU78uWL8Af16NjWDIfYwrTM-mPxivIhWRb5EOGwlKYZS5qSpMY%26usqp%3DCAU" alt="React"&gt;&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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Utilizando&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="err"&gt;😎&lt;/span&gt;&lt;span class="o"&gt;!&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;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;Aprende más de React en: &lt;a href="https://reactjs.org/" rel="noopener noreferrer"&gt;https://reactjs.org/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Vue
&lt;/h2&gt;

&lt;p&gt;Framework progresivo mantenido por la comunidad, trabaja principalmente con el patrón MVVM (model-view-view-model). Al ser progresivo permite ir desde lo más básico hasta escalar nuestro proyecto a funcionalidades más complejas. Además, maneja ciertas similitudes con Angular con el two way data binding, las directivas, entre otros.&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%2Fmiro.medium.com%2Fmax%2F900%2F1%2AOrjCKmou1jT4It5so5gvOA.jpeg" 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%2Fmiro.medium.com%2Fmax%2F900%2F1%2AOrjCKmou1jT4It5so5gvOA.jpeg" alt="Vue"&gt;&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;app&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;img&lt;/span&gt; &lt;span class="nx"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Vue logo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://vuejs.org/images/logo.png&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/template&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
 &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;App&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/script&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aprende más de Vue en: &lt;a href="https://vuejs.org/" rel="noopener noreferrer"&gt;https://vuejs.org/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>codenewbie</category>
      <category>beginners</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Class components vs Functional components</title>
      <dc:creator>GabrielOmar</dc:creator>
      <pubDate>Fri, 02 Apr 2021 19:59:51 +0000</pubDate>
      <link>https://dev.to/gabrielomarq/class-components-vs-functional-components-3h0f</link>
      <guid>https://dev.to/gabrielomarq/class-components-vs-functional-components-3h0f</guid>
      <description>&lt;p&gt;Cuando empezamos a desarrollar una aplicación en &lt;strong&gt;React&lt;/strong&gt; siempre esta presente la duda entre usar componentes orientado a clases o componentes funcionales. En este artículo trataremos de explicar las ventajas y desventajas de cada uno.&lt;/p&gt;

&lt;h3&gt;
  
  
  Class Components
&lt;/h3&gt;

&lt;p&gt;Fueron la primera forma de escribir componentes en React, tienen un ciclo de vida particular además de manejar un &lt;em&gt;scope&lt;/em&gt; cerrado. Se debe considerar que al ser una clase, podemos implementar y heredar, entre otras técnicas de la programación orientada a objetos (POO).&lt;/p&gt;

&lt;p&gt;Sobre su ciclo de vida, tienen métodos propios que nos permite ejecutar distintos eventos en casi cualquier momento. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--a0CLwvr3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i2.wp.com/programmingwithmosh.com/wp-content/uploads/2018/10/Screen-Shot-2018-10-31-at-1.44.28-PM.png%3Fssl%3D1" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--a0CLwvr3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i2.wp.com/programmingwithmosh.com/wp-content/uploads/2018/10/Screen-Shot-2018-10-31-at-1.44.28-PM.png%3Fssl%3D1" alt="Class Components lifecycle"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A continuación veremos un pequeño ejemplo de la sintaxis de un class component en React.&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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;MyHomePage&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Component&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

 &lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Soy&lt;/span&gt; &lt;span class="nx"&gt;un&lt;/span&gt; &lt;span class="nx"&gt;Class&lt;/span&gt; &lt;span class="nx"&gt;Component&lt;/span&gt; &lt;span class="nx"&gt;en&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;MyHomePage&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Functional Components
&lt;/h3&gt;

&lt;p&gt;A diferencia de los class components, no tienen acceso a los &lt;em&gt;lifecycle methods&lt;/em&gt; como tal, sino más bien trae los increíbles Hooks, los cuales nos facilitarán el desarrollo y control de elementos en nuestro componente. Los principales son &lt;em&gt;useState, useEffect, useRef, useContext, useReducer, useMemo&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;Otro punto importante en este tipo de componentes es el &lt;strong&gt;scope&lt;/strong&gt; que manejamos, tenemos cierta flexibilidad para usar elementos que estén por fuera de nuestro componente.&lt;/p&gt;

&lt;p&gt;Conozcamos un poco más de los hooks:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--S1NFg-EJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/800/1%2AJ1OWWbEDit18yTrM0sthgA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--S1NFg-EJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/800/1%2AJ1OWWbEDit18yTrM0sthgA.png" alt="Functional Components Hooks"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Recordar que los &lt;em&gt;hooks&lt;/em&gt; pueden convivir perfectamente con los class components y de esta manera lograr una migración progresiva del proyecto 😎&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
      <category>react</category>
    </item>
    <item>
      <title>Web APIs bastante útiles</title>
      <dc:creator>GabrielOmar</dc:creator>
      <pubDate>Wed, 06 Jan 2021 22:43:30 +0000</pubDate>
      <link>https://dev.to/gabrielomarq/web-apis-bastante-utiles-2ll9</link>
      <guid>https://dev.to/gabrielomarq/web-apis-bastante-utiles-2ll9</guid>
      <description>&lt;p&gt;Existe una gran cantidad de Web APIs que nos permiten implementar funcionalidades increíbles en nuestras aplicaciones.&lt;/p&gt;

&lt;p&gt;En este artículo comentaremos algunas que en algún momento podrías necesitar.&lt;/p&gt;

&lt;h3&gt;
  
  
  Web XR Device API
&lt;/h3&gt;

&lt;p&gt;Se consideran un grupo de estándares que dan compatibilidad para acceder a dispositivos de realidad virtual (VR) y realidad aumentada (AR) incluyendo los sensores. Todo esto desde un sitio o aplicación web. Algunas de las funcionalidades que nos ofrece son:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Encontrar dispositivos de salida para realidad virtual o aumentada que sean compatibles.&lt;/li&gt;
&lt;li&gt;Renderizar una o varias escenas 3d en el dispositivo a una velocidad adecuada que no afecte la experiencia del visitante.&lt;/li&gt;
&lt;li&gt;Reflejar la salida de una pantalla 2D.&lt;/li&gt;
&lt;li&gt;Crear vectores que representan los movimientos de los controles de entrada.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Vibration API
&lt;/h3&gt;

&lt;p&gt;Esta increíble API permite que un sitio web pueda acceder al hardware de vibración y que el dispositivo se mueva o vibre. Es bastante útil para enviar notificaciones o algún tipo de interacción física con el usuario. A un nivel avanzado, podemos incluso controlar el patrón de vibración del dispositivo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Notifications API
&lt;/h3&gt;

&lt;p&gt;Bastante usado en las PWA (Progressive Web Application), permite que nuestro sitio web controle las notificaciones del dispositivo. Algo importante es que estas son independientes, quiere decir que se pueden mostrar incluso estando en otra pestaña o aplicación.&lt;/p&gt;

&lt;p&gt;No hay duda que estas Web APIs nos permiten llevar nuestras aplicaciones al siguiente nivel. Todo depende de las funcionalidades que necesitemos y el nivel de interacción que deseamos tener con el usuario :)&lt;/p&gt;

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