<?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: Tilak Madichetti</title>
    <description>The latest articles on DEV Community by Tilak Madichetti (@tilakmaddy_68).</description>
    <link>https://dev.to/tilakmaddy_68</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%2F317335%2F09e9a40d-03c8-40bb-953f-b628555e9c6e.jpeg</url>
      <title>DEV Community: Tilak Madichetti</title>
      <link>https://dev.to/tilakmaddy_68</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tilakmaddy_68"/>
    <language>en</language>
    <item>
      <title>HTTPS , TLS, SSL, CA, Encryption &amp; MITM attack !</title>
      <dc:creator>Tilak Madichetti</dc:creator>
      <pubDate>Sat, 23 Jan 2021 15:22:45 +0000</pubDate>
      <link>https://dev.to/tilakmaddy_68/noob-s-guide-to-ca-tls-ssl-https-sym-asym-encryption-mitm-attack-5d30</link>
      <guid>https://dev.to/tilakmaddy_68/noob-s-guide-to-ca-tls-ssl-https-sym-asym-encryption-mitm-attack-5d30</guid>
      <description>&lt;p&gt;None of the above words have to make sense to you just yet.  Go and grab a 🍺, give a &lt;strong&gt;HUGE&lt;/strong&gt; ❤️ and smash the 🔥 &lt;strong&gt;Follow&lt;/strong&gt; 🔥 button as we dive right in to it!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Encryption&lt;/strong&gt; is a way to convert data into special text (that is un-processable in itself) so that only the &lt;em&gt;encryptor&lt;/em&gt; and the person intended to receive the data can convert it back &lt;em&gt;a.k.a decrypt&lt;/em&gt; it to the original form.&lt;/p&gt;

&lt;p&gt;This conversion happens with the help of a 🔑! which again is just a random string text. !&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;UUID&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;// this is shared between the encryptor and the decryptor &lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;encryptedMessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;functionThatEncrypts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;plainMessage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;key&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;plainMessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;functionThatDecrypts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;encryptedMessage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice in the above example we used the same &lt;code&gt;key&lt;/code&gt; to encrypt as well as decrypt the message. This type of encryption is called &lt;strong&gt;Symmetric encryption&lt;/strong&gt; and when we have two separate keys it's &lt;strong&gt;Asymmetric encryption&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A commonly followed process to do the same - Advanced Encryption Standard &lt;a href="https://en.wikipedia.org/wiki/Advanced_Encryption_Standard" rel="noopener noreferrer"&gt;&lt;strong&gt;AES&lt;/strong&gt;&lt;/a&gt; &lt;/p&gt;




&lt;p&gt;Now think of a case where two computers that &lt;strong&gt;knew each other beforehand&lt;/strong&gt; have to share some secret data over the internet . How can they do it ?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Decide on a common &lt;code&gt;key&lt;/code&gt; while being &lt;strong&gt;offline&lt;/strong&gt; to use, and not share it with any other computer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Then use that key to encrypt and decrypt data while talking &lt;strong&gt;online&lt;/strong&gt; &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As a result no-one &lt;strong&gt;online or offline&lt;/strong&gt; can possibly make out what they are talking ! This is a secure connection 🙌 powered by &lt;strong&gt;Symmetric encryption&lt;/strong&gt; &lt;/p&gt;




&lt;p&gt;But more often in real life two computers have to talk for the first time &lt;strong&gt;online&lt;/strong&gt; . So if they decide on a common key they would have to first share the common key with each other in plain text &lt;strong&gt;online&lt;/strong&gt; !&lt;/p&gt;

&lt;p&gt;That's crazy because the internet is like an open connection and any person sniffing on the network can make out what your &lt;em&gt;apparently secret&lt;/em&gt; key is ! 🔐 &lt;/p&gt;

&lt;p&gt;And then use it to imitate &lt;code&gt;Computer A&lt;/code&gt; to &lt;code&gt;Computer B&lt;/code&gt; and &lt;code&gt;Computer B&lt;/code&gt; to &lt;code&gt;Computer A&lt;/code&gt; whilst getting to see the entire chat 💭 that's going on. And worse, the attacker can &lt;strong&gt;manipulate packets&lt;/strong&gt; coming from &lt;code&gt;Computer A&lt;/code&gt; and send  to &lt;code&gt;Computer B&lt;/code&gt; for his benefit ! like asking for credit card details via supplying wrong HTML to legitimately requested webpages. 💥 ٩(๏_๏)۶ 💥&lt;/p&gt;

&lt;p&gt;The above is called &lt;strong&gt;MITM - Man in the Middle attack&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Solution for the above problem -
&lt;/h3&gt;

&lt;p&gt;Send the secret key via a  rocket to the other computer's location each time you wanna make a request !&lt;/p&gt;

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

&lt;p&gt;But it's a little expensive !&lt;/p&gt;

&lt;p&gt;So we use &lt;strong&gt;Asymmetric encryption&lt;/strong&gt; to address the issue.&lt;/p&gt;

&lt;p&gt;This involves 2 kinds of keys - One for encryption which is publicly available and the other for decryption which is private.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Important part&lt;/strong&gt; is that any data which is encrypted using public key can only be decrypted using the private key 🔑&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;publicKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;privateKey&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;AES&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generateKeyPair&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;encryptedText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;functionThatEncrypts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;plainText&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;publicKey&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;plainText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;functionThatDecrypts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;encryptedText&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;privateKey&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we'll learn how we can use that functionality to send a common key that both the computers agree to, &lt;strong&gt;online&lt;/strong&gt;, except that this time it will be encrypted ! This does not leave room for deciphering intercepted data.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Computer A&lt;/code&gt; initiates a connection to &lt;code&gt;Computer B&lt;/code&gt; by sending a plain text hello ! 👋 This of course contains information like srcIP, srcPort, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Computer B&lt;/code&gt; then sends its &lt;strong&gt;public key&lt;/strong&gt; to &lt;code&gt;Computer A&lt;/code&gt; as a response packet&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Computer A&lt;/code&gt; now uses the public key to encrypt another key 🔑 of its own which will later work as the common key. This encrypted data is known an &lt;code&gt;Premaster Secret&lt;/code&gt; and will be sent to &lt;code&gt;Computer B&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
&lt;span class="c1"&gt;// On side of Computer A&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;finalKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;UUID&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;128&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// generated by Computer A&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;publicKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;receiveFromComputerB&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;// Step 2&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;premasterSecret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;functionThatEncrypts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;finalKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;publicKey&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;sendToComputerB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;premasterSecret&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

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

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Remember: Our goal is to share a common key without the fear of being deciphered on interception - so in this way we can get back to talking with &lt;strong&gt;Symmetric encryption&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;Computer B&lt;/code&gt; can decrypt it using its &lt;strong&gt;private key&lt;/strong&gt;. And no other computer (even &lt;code&gt;Computer A&lt;/code&gt;) at this point can decrypt the premaster secret.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
&lt;span class="c1"&gt;// On side of Computer B&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;premasterSecret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;receiveFromComputerA&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;privateKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;....&lt;/span&gt; &lt;span class="c1"&gt;// generated as a pair along with public key&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;finalKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;functionThatDecrypts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;premasterSecret&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;privateKey&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;*Now both computers share a common key * &lt;code&gt;finalKey&lt;/code&gt; !&lt;/p&gt;

&lt;p&gt;The above 3 step process is called the &lt;strong&gt;Transport Layer Security Handshake&lt;/strong&gt;. (TLS)&lt;/p&gt;




&lt;p&gt;Buuuu......t we are not done yet because clearly in &lt;code&gt;Step 2&lt;/code&gt; the public key transfer to &lt;code&gt;Computer A&lt;/code&gt; can be intercepted by a man in the middle who can totally represent himself falsely to &lt;code&gt;Computer A&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hence &lt;code&gt;Computer A&lt;/code&gt; needs to be able to verify that the public key it receives is from &lt;code&gt;Computer B&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Solution -  SSL (Secure socket layer)
&lt;/h3&gt;

&lt;p&gt;Yes ! &lt;code&gt;Computer B&lt;/code&gt; needs to send the &lt;strong&gt;pubilcKey&lt;/strong&gt; through  a privately signed SSL certificate and not directly. The reason is &lt;code&gt;Computer A&lt;/code&gt; on the receiving end can get the certificate verified through a &lt;strong&gt;Certificate Authority&lt;/strong&gt; (CA) which is a 3rd party service that helps verify server profiles on the internet ! Details of which I will not dive into in this blog coz it's a noob's blog.&lt;/p&gt;

&lt;p&gt;So now when &lt;strong&gt;SSL&lt;/strong&gt; is used, the HTTP requests become secure by a million times and its called &lt;strong&gt;HTTPS&lt;/strong&gt;. &lt;/p&gt;




&lt;p&gt;That ends my blog. 🔥 &lt;strong&gt;Follow&lt;/strong&gt; 🔥 me for more sweet content don't miss out cuz I am about to blow your brains out !&lt;/p&gt;

&lt;p&gt;Thanks for reading !&lt;/p&gt;

&lt;p&gt;Feel free to comment down below any of your questions and I will try my best to answer them. &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>tutorial</category>
      <category>encryption</category>
      <category>noob</category>
    </item>
    <item>
      <title>Expose localhost server to internet in 1 step</title>
      <dc:creator>Tilak Madichetti</dc:creator>
      <pubDate>Sat, 25 Jul 2020 14:28:41 +0000</pubDate>
      <link>https://dev.to/tilakmaddy_68/how-to-expose-your-local-web-server-to-the-internet-for-free-pmd</link>
      <guid>https://dev.to/tilakmaddy_68/how-to-expose-your-local-web-server-to-the-internet-for-free-pmd</guid>
      <description>&lt;h2&gt;
  
  
  #Whotisupeverybodyhowisitgoing
&lt;/h2&gt;

&lt;p&gt;After reading this article you will be able to deploy your app in &lt;strong&gt;1 command&lt;/strong&gt; &lt;em&gt;*literally*&lt;/em&gt; (the setup is 5 steps though). So &lt;strong&gt;smash ALL&lt;/strong&gt; of  ❤️   🔖    🛳  on your left and let's dive right in !&lt;/p&gt;

&lt;h3&gt;
  
  
  STEP 1 - Install PHP and Composer
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;MAC Users:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Just go&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;composer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Of course you need to have brew installed &lt;a href="https://brew.sh/"&gt;https://brew.sh/&lt;/a&gt; - Its the best package manager of Mac OS&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you are on Windows,&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;use these links: &lt;/p&gt;

&lt;p&gt;PHP build for Windows download - &lt;a href="https://php.net"&gt;https://php.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Composer Installation Instructions here - &lt;a href="https://getcomposer.org/doc/00-intro.md"&gt;https://getcomposer.org/doc/00-intro.md&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  STEP 2 - Make Composer Install beyondCode/EXPOSE
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer global require beyondcode/expose
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now add this to your &lt;code&gt;.zshrc or .bashrc&lt;/code&gt; file based on whatever terminal you are using.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.composer/vendor/bin"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then restart your terminal and type &lt;code&gt;expose&lt;/code&gt; to see if the command is recognized or not.&lt;/p&gt;

&lt;h5&gt;
  
  
  STEP 3 - Go and get yourself one of these 🍺 , cuz I believe you completed the hardest part of the journey
&lt;/h5&gt;

&lt;h3&gt;
  
  
  STEP 4 - Now create an account on &lt;a href="https://beyondco.de/"&gt;https://beyondco.de/&lt;/a&gt; and you will be given a token so register that with your terminal
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;expose token [YOUR-AUTH-TOKEN]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  STEP 5 - This is the 1 line you've been waiting for ٩(^‿^)۶!
&lt;/h3&gt;

&lt;p&gt;Here you go (☞ﾟヮﾟ)☞&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;expose share https://127.0.0.1:400 --subdomain="subd" --auth="admin:123"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will link your local dev server running at &lt;strong&gt;127.0.0.1:400&lt;/strong&gt; to a url &lt;strong&gt;subd.sharedwithexpose.com&lt;/strong&gt; which anybody on the internet can access with the credentials.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;username: admin
password: 123
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can customize the subdomain and auth credentials to whatever pleases you for free unlike &lt;a href="https://ngrok.com"&gt;https://ngrok.com&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Resources referred
&lt;/h3&gt;

&lt;p&gt;Official docs &lt;a href="https://beyondco.de/docs/"&gt;https://beyondco.de/docs/&lt;/a&gt;&lt;br&gt;
Google &lt;/p&gt;

&lt;h4&gt;
  
  
  Hit the &lt;strong&gt;FOLLOW&lt;/strong&gt; button for more awesome content
&lt;/h4&gt;

</description>
      <category>webdev</category>
      <category>tutorial</category>
      <category>beginners</category>
      <category>devops</category>
    </item>
    <item>
      <title>YOU DON'T HARNESS THE FULL POWER OF JS CONSOLE 👎 :-(</title>
      <dc:creator>Tilak Madichetti</dc:creator>
      <pubDate>Mon, 20 Jul 2020 19:49:03 +0000</pubDate>
      <link>https://dev.to/tilakmaddy_68/why-you-don-t-know-basic-console-log-must-read-now-46n1</link>
      <guid>https://dev.to/tilakmaddy_68/why-you-don-t-know-basic-console-log-must-read-now-46n1</guid>
      <description>&lt;p&gt;What a discouraging way to start off isn't it ? But stick around and I promise you that you will leave this blog with zeal for Javascript .&lt;/p&gt;

&lt;p&gt;So go grab a 🍺, give this post a &lt;strong&gt;HUGE&lt;/strong&gt; ❤️ and let's dive right into it.&lt;/p&gt;

&lt;h1&gt;
  
  
  Here are 5 ways you can ninjafy your console logging skills
&lt;/h1&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;1. console.log( 'COLORED_TEXT' )&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;You will have to use &lt;code&gt;%c&lt;/code&gt; with each occurrence accompanied by an argument that expresses the styling that you desire&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;%c Object A instantiated %c before B !!  &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;background: white; color: red&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;background: red; color:white&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Note that you could use any CSS property under the sun into as an argument. In case of the above string this is how it renders out&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qCVBgwR3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/ytw800vc5jjemxkmvjq1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qCVBgwR3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/ytw800vc5jjemxkmvjq1.png" alt="console color" width="800" height="195"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;2. console.table( ARRAY_OF_OBJECTS )&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Use this when you want to print an &lt;strong&gt;array of objects&lt;/strong&gt;&lt;br&gt;
For example if you want to print this :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;arrayOfBooks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Heart of Darkness&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;author&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Joseph Conrad&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;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;A Walk in the Woods&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;author&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Bill Bryson&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;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Rich Dad Poor Dad&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;author&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Robert Kiyosaki&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;then y'all know what &lt;code&gt;console.log(arrayOfBooks)&lt;/code&gt; does&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wI8beccz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/ji0931s47gdlqwt3c7nn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wI8beccz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/ji0931s47gdlqwt3c7nn.png" alt="console log" width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But if you instead use&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arrayOfBooks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;you'll get the following output:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--I_7KE4W4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/pjrv2rf8ngrvtvn0k95i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--I_7KE4W4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/pjrv2rf8ngrvtvn0k95i.png" alt="console table" width="800" height="298"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Isn't it at least 300 times nicer and easier to infer what the array is ?&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;3. console.image( 'URL_OF_IMG' )&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://camo.githubusercontent.com/835e3c41004fae89bb9061405d78cada32aa6783/687474703a2f2f692e696d6775722e636f6d2f68763670776b622e706e67" class="article-body-image-wrapper"&gt;&lt;img src="https://camo.githubusercontent.com/835e3c41004fae89bb9061405d78cada32aa6783/687474703a2f2f692e696d6775722e636f6d2f68763670776b622e706e67" alt="console image" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HOLD TIGHT FOLKS !&lt;/strong&gt; Before you leave to try this out yourself in the console let me tell you that this one is &lt;strong&gt;NOT&lt;/strong&gt; natively available to Javascript in the browser&lt;/p&gt;

&lt;p&gt;You will have to first load this JS resource from the CDN using the below script tag :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;'https://raw.githubusercontent.com/adriancooney/console.image/master/console.image.min.js'&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;For more details on ☝️ , refer this link &lt;a href="https://github.com/adriancooney/console.image"&gt;https://github.com/adriancooney/console.image&lt;/a&gt;. Obviously the project isn't maintained anymore (the last commit is like 6 years ago) becoz there isn't really anything more to &lt;code&gt;console.image&lt;/code&gt; :) &lt;/p&gt;

&lt;p&gt;*&lt;em&gt;BONUS : *&lt;/em&gt; You get &lt;code&gt;console.meme&lt;/code&gt; included in the CDN to make something like this :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://camo.githubusercontent.com/0f25ac62249194f32edbd54c912ae2952aa02f1a/687474703a2f2f692e696d6775722e636f6d2f4f646f564d44532e706e67" class="article-body-image-wrapper"&gt;&lt;img src="https://camo.githubusercontent.com/0f25ac62249194f32edbd54c912ae2952aa02f1a/687474703a2f2f692e696d6775722e636f6d2f4f646f564d44532e706e67" alt="meme console" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And the format for that as per their Github Readme is:&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;meme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;upper&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;lower&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;meme&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;height&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;4. console.warn( YOUR_MESSAGE )&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;You can use this to sort of indicate log messages that show the devs it's not really something that breaks the project but good to fix it in the future commits&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Image Kirk_0932.jpg dimensions are slightly off and its causing a small part to be hidden from the user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;and here is a screenshot of how ⚠️ WARNING messages look like inside the console&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6Wsa99ZW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/a1km5vxno0i8rlemo873.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6Wsa99ZW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/a1km5vxno0i8rlemo873.png" alt="warning" width="800" height="192"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. console.**&lt;strong&gt;&lt;em&gt;(&lt;/em&gt;&lt;/strong&gt;*)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;If you guys want to know the &lt;em&gt;fifth&lt;/em&gt; cool thing then get me  to 20 FOLLOWERS and 20 LIKES 💕❤️ 💕❤️ 💕 on this post.&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  -------- EDIT 1 (goal reached) -----------
&lt;/h4&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;5. console.time() to Test Your API&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;You can keep track of how much time api calls take to fetch data right in the console. You can use this to find out average time and if you think it &lt;em&gt;suxx,&lt;/em&gt; you can bug your backend dev ;P&lt;/p&gt;

&lt;p&gt;So pass in the same label &lt;code&gt;'API_TEST'&lt;/code&gt; to &lt;code&gt;time&lt;/code&gt; and &lt;code&gt;timeEnd&lt;/code&gt; functions for it to work.&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;API_TEST&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;fiftyTests&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
     &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; 
     &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://jsonplaceholder.typicode.com/todos/1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="k"&gt;for&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;prom&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;fiftyTests&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;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;prom&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;json&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Fetched &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;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;timeEnd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;API_TEST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Now you can see the time it takes to make api calls 50 times one - after - the - other printed in your console.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DotbvzLf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/oyefq9cmajnmissrikur.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DotbvzLf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/oyefq9cmajnmissrikur.png" alt="console time" width="385" height="164"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can now divide it by 50 to get the average time the API takes to respond.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⚠️ Don't use &lt;em&gt;Promise.all()&lt;/em&gt; because it will simultaneously await all promises and tell you once everything has resolved which defeats our purpose&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Thanks for reading,&lt;br&gt;
Until next time,&lt;br&gt;
See ya ✌️ &lt;br&gt;
&lt;strong&gt;God bless&lt;/strong&gt; :)&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Recreating `new` keyword in Javascript from scratch</title>
      <dc:creator>Tilak Madichetti</dc:creator>
      <pubDate>Mon, 20 Jul 2020 12:21:13 +0000</pubDate>
      <link>https://dev.to/tilakmaddy_68/recreating-new-keyword-in-javascript-146k</link>
      <guid>https://dev.to/tilakmaddy_68/recreating-new-keyword-in-javascript-146k</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;The best way to understand anything is to re-write it from scratch on your own&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We are gonna do just that. So go grab yourself a 🍺, drop a huge ❤️ and chelax as we dive right into it.&lt;/p&gt;

&lt;p&gt;Here's what we already do&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Person&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="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;)&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="nx"&gt;name&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;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;describe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`I am &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; , &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;age&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; years of age ! `&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;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Vladimir&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;That outputs , &lt;code&gt;I am Vladimir, 32 years if age !&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Our goal is to change the line that has the new keyword to a more custom one like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;spawn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Vladimir&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;where &lt;code&gt;spawn&lt;/code&gt; is our own function that we create which should substitute &lt;strong&gt;new&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;spawn&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="nx"&gt;args&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;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
  &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setPrototypeOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&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="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kd"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;obj&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;
  
  
  How spawn works
&lt;/h2&gt;

&lt;p&gt;Since new returns an object, we first create a fresh object each time for a call of spawn and set its prototype.&lt;/p&gt;

&lt;p&gt;Now we call the constructor by setting its &lt;code&gt;this&lt;/code&gt; argument to the fresh object . After this call all the properties in the constructor function will be assigned (for eg: name, age)&lt;/p&gt;

&lt;p&gt;Then we check to see if the constructor returns anything and we respect that , so we return whatever it returns (In most cases  constructor doesn't return anything and we return the object) &lt;/p&gt;

&lt;p&gt;Thanks for reading&lt;br&gt;
Don't forget to ❤️ it :)&lt;br&gt;
And follow me for more cool stuff&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>tutorial</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How to stay DRY in redux state mapping when using reselect ?</title>
      <dc:creator>Tilak Madichetti</dc:creator>
      <pubDate>Sun, 19 Jul 2020 14:34:16 +0000</pubDate>
      <link>https://dev.to/tilakmaddy_68/how-to-stay-dry-in-redux-state-mapping-when-using-reselect-3k54</link>
      <guid>https://dev.to/tilakmaddy_68/how-to-stay-dry-in-redux-state-mapping-when-using-reselect-3k54</guid>
      <description>&lt;p&gt;So we are probably used to mapping state to props this way where the values of props are basically selectors that are defined using &lt;code&gt;createSelector&lt;/code&gt; function in &lt;code&gt;reselect&lt;/code&gt; library&lt;br&gt;
(which is mainly used for memoizing)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mapStateToProps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;itemCount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;selectCartItemsCount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;bagColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;selectCartColor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;selectCartPrice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&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="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mapStateToProps&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="nx"&gt;MyApp&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;The problem with this approach is we are compelled to pass in &lt;code&gt;state&lt;/code&gt; as argument in every select method even though we know &lt;br&gt;
there is only 1 universal redux state&lt;/p&gt;

&lt;p&gt;So to solve this we can&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;createStructuredSelector&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;reselect&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This helps us reduce our code to follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mapStateToProps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createStructuredSelector&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;itemCount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;selectCartItemsCount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;bagColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;selectCartColor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;selectCartPrice&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="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mapStateToProps&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="nx"&gt;MyApp&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;And everything else stays intact and works just fine&lt;/p&gt;

&lt;p&gt;NOW, you might ask yourself when should we &lt;strong&gt;NOT&lt;/strong&gt; use &lt;code&gt;createStructuredSelector&lt;/code&gt; ?&lt;/p&gt;

&lt;p&gt;Well, there is one practical case that I encountered and that is when you want to dynamically generate a &lt;code&gt;selector&lt;/code&gt; based on unknown props.&lt;/p&gt;

&lt;p&gt;I'll explain - suppose &lt;code&gt;MyApp&lt;/code&gt; is rendered this way:&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;Route&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/mycart/:id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="nx"&gt;component&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;MyApp&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&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;In this case Route passes down the &lt;code&gt;match&lt;/code&gt; object to MyApp and if you wish to generate a selector based on the &lt;code&gt;match.params.id&lt;/code&gt; then in the &lt;code&gt;mapStateToProps&lt;/code&gt; function you would need the &lt;code&gt;match&lt;/code&gt; props as well apart from the redux based &lt;code&gt;state&lt;/code&gt;(which is universal to the whole app btw)&lt;/p&gt;

&lt;p&gt;So the solution would be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mapStateToProps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ownProps&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="na"&gt;itemCount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;selectBasedOnUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ownProps&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;match&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="nx"&gt;state&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="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mapStateToProps&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="nx"&gt;MyApp&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Notice however that here, the &lt;code&gt;itemCount&lt;/code&gt; is not memoized. If you want to learn how to memoize it, please check out my &lt;a href="https://dev.to/tilakmaddy/how-to-memoize-correctly-using-redux-reselect-20m7"&gt;other post&lt;/a&gt; where I explain exactly that - its super important &lt;/p&gt;

&lt;p&gt;Anyways I hope 🤞 you enjoyed what you read,&lt;br&gt;
Don't forget to ❤️ it - I need encouragement to post ! &lt;br&gt;
And also don't hesitate to drop a comment below if you have anything to say.&lt;/p&gt;

&lt;p&gt;Thanks for reading,&lt;br&gt;
✌️&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How to memoize correctly using Redux reselect for O(1) complexity?</title>
      <dc:creator>Tilak Madichetti</dc:creator>
      <pubDate>Sun, 19 Jul 2020 10:27:56 +0000</pubDate>
      <link>https://dev.to/tilakmaddy_68/how-to-memoize-correctly-using-redux-reselect-20m7</link>
      <guid>https://dev.to/tilakmaddy_68/how-to-memoize-correctly-using-redux-reselect-20m7</guid>
      <description>&lt;p&gt;So we are used to writing redux selectors like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// state is the universal redux state&lt;/span&gt;
&lt;span class="c1"&gt;// shop is one of the combined reducers&lt;/span&gt;
&lt;span class="c1"&gt;// O(1)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;selectShop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;shop&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// collections is an object - O(1)&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;selectCollections&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createSelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;selectShop&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="nx"&gt;shop&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;shop&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;collections&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;//return all collections as an array - O(N)&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;selectCollectionsForPreview&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createSelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;selectCollections&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="nx"&gt;collections&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;collections&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;collections&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&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;With this set up, for a component if you wish to retrieve the collections as an array you could do this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mapStateToProps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createStructuredSelector&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;collections&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;selectCollectionsForPreview&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="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mapStateToProps&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="nx"&gt;MyComponent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;When the component is rendered for the first time, the &lt;strong&gt;O(N)&lt;/strong&gt; operation will take place but from the second time (of course assuming the state hasn't mutated) it will just returned the collections array from the cache which makes it an &lt;strong&gt;O(1)&lt;/strong&gt; operation.&lt;/p&gt;

&lt;p&gt;Now think of a selector that should return collections as an array but filtered based upon a url parameter&lt;/p&gt;

&lt;p&gt;Then you would have to create a function that generates a &lt;code&gt;createSelector&lt;/code&gt; function that would look like this&lt;br&gt;
which is an &lt;strong&gt;O(N)&lt;/strong&gt; operation&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;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;selectFilteredCollections&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;urlParam&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
  &lt;span class="nf"&gt;createSelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;selectCollections&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;   &lt;span class="c1"&gt;// this returns the array as explained above and is memoized&lt;/span&gt;
    &lt;span class="nx"&gt;collections&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;collections&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;coll&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;coll&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;urlParam&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Now to use it you would do&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mapStateToProps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ownProps&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="na"&gt;collections&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;selectFilteredCollections&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ownProps&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;match&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="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="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mapStateToProps&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="nx"&gt;MyComponent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;The problem here is you are creating a new function that returns a &lt;code&gt;createSelector&lt;/code&gt; function based on the url parameter each time the component renders.&lt;/p&gt;

&lt;p&gt;So even if the url parameter remains the same for the second time of the call you are re creating a selector. So memoization didn't take place correctly.&lt;/p&gt;

&lt;p&gt;In this situation, you will have to install &lt;code&gt;loadash&lt;/code&gt; library&lt;/p&gt;

&lt;p&gt;If using yarn:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;yarn add lodash.memoize&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If using npm:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm install lodash.memoize&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And to use it, we import our newly installed memoize helper function like so&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;memoize&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;lodash.memoize&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And just wrap our selectFilteredCollections function with memoize like so:&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;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;selectFilteredCollections&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;memoize&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;urlParam&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
  &lt;span class="nf"&gt;createSelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;selectCollections&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;   &lt;span class="c1"&gt;// this returns the array as explained above and is memoized&lt;/span&gt;
    &lt;span class="nx"&gt;collections&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;collections&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;coll&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;coll&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;urlParam&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;Memoize does the same idea of memoization as reselect does for our selectors, except this time we're memoizing the return of our function which returns our selector:&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="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;urlParam&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
  &lt;span class="nf"&gt;createSelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;selectCollections&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="nx"&gt;collections&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;collections&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;coll&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;coll&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;urlParam&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;By wrapping this function is memoize, we're saying that whenever this function gets called and receives &lt;code&gt;urlParam&lt;/code&gt;, I want to memoize the return of this function (in this case we return a selector). If this function gets called again with the same &lt;code&gt;urlParam&lt;/code&gt; , don't rerun this function because we'll return the same value as last time, which we've memoized so just return the selector that's been stored.&lt;/p&gt;

&lt;p&gt;Hope you had fun reading this !&lt;br&gt;
Its my first post here :)&lt;/p&gt;

&lt;p&gt;And oh ! did I forget to mention - you can learn more &lt;br&gt;
at the official website &lt;a href="https://github.com/reduxjs/reselect"&gt;Redux Reselect&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also if you want to dive deep into loadash.memoize , checkout &lt;a href="https://dev.to/ccnokes/create-lodash-memoize-from-scratch-1p73"&gt;this&lt;/a&gt; article that @CameronNokes wrote here on dev.to&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>tutorial</category>
      <category>javascript</category>
      <category>react</category>
    </item>
  </channel>
</rss>
