<?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: Austin Akers</title>
    <description>The latest articles on DEV Community by Austin Akers (@bboyakers).</description>
    <link>https://dev.to/bboyakers</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%2F182661%2F119501b4-cb3c-4f09-9daa-ba82a21213a6.jpg</url>
      <title>DEV Community: Austin Akers</title>
      <link>https://dev.to/bboyakers</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bboyakers"/>
    <language>en</language>
    <item>
      <title>Getting Started With The Beacon API</title>
      <dc:creator>Austin Akers</dc:creator>
      <pubDate>Thu, 25 Jun 2020 14:58:50 +0000</pubDate>
      <link>https://dev.to/bboyakers/getting-started-with-the-beacon-api-61</link>
      <guid>https://dev.to/bboyakers/getting-started-with-the-beacon-api-61</guid>
      <description>&lt;h1&gt;
  
  
  Getting Started With The Beacon API
&lt;/h1&gt;

&lt;p&gt;The &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Beacon_API" rel="noopener noreferrer"&gt;Beacon API&lt;/a&gt; is a web API avalible for developers to implement into their application. View full list of web APIs &lt;a href="https://developer.mozilla.org/en-US/docs/Web/AP" rel="noopener noreferrer"&gt;here&lt;/a&gt;. The &lt;code&gt;Beacon API&lt;/code&gt; is a Web API useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Analytics&lt;/li&gt;
&lt;li&gt;Diagnostics &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why  not &lt;code&gt;fetch&lt;/code&gt; or &lt;code&gt;XMLHttpRequest&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;As stated in the MDN Docs, the unfortunate truth is &lt;a href="https://developer.chrome.com/multidevice/user-agent" rel="noopener noreferrer"&gt;User Agents&lt;/a&gt; will typically ignore &lt;code&gt;XMLHttpRequest&lt;/code&gt; made with an unload handler. Which is the handler we want to use before an individual leaves/navigates away from the page.&lt;/p&gt;

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

&lt;p&gt;In this article we will building a very basic analytics tracking library. The objective is to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a backend to capture the data and serve our index.html page&lt;/li&gt;
&lt;li&gt;Track what element the end user clicked on and record it with a time stamp.&lt;/li&gt;
&lt;li&gt;Store the data that is being generated on each click to a global object to store.&lt;/li&gt;
&lt;li&gt;Before refreshing, or leaving the page send the data stored in the global object to the backend using the &lt;code&gt;sendBeacon()&lt;/code&gt; method provided by the Beacon API.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Setup
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;First, make sure you have &lt;a href="https://nodejs.org/en/" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt; installed into your system. &lt;/li&gt;
&lt;li&gt;Once Node is installed on your computer clone the project files:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/BboyAkers/WebAPIs.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or&lt;br&gt;
&lt;a href="https://github.com/BboyAkers/WebAPIs" rel="noopener noreferrer"&gt;Download Repo&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Navigate to the start folder. &lt;strong&gt;WebAPIs&lt;/strong&gt;-&amp;gt;&lt;strong&gt;beaconAPI&lt;/strong&gt;-&amp;gt;&lt;strong&gt;start&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Open the terminal and install the dependencies &lt;code&gt;npm install&lt;/code&gt;
We've installed two dependencies. &lt;code&gt;body-parser&lt;/code&gt; and &lt;code&gt;express&lt;/code&gt;. 

&lt;ul&gt;
&lt;li&gt;We will be using &lt;code&gt;body-parse&lt;/code&gt; to parse the incoming POST request from our frontend. &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;express&lt;/code&gt; is the backend web framework we will be using to setup our server.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  Setting Up Our Server
&lt;/h2&gt;

&lt;p&gt;Objective:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Setup a basic express server&lt;/li&gt;
&lt;li&gt;Serve our &lt;code&gt;index.html&lt;/code&gt; inside of our &lt;code&gt;public/&lt;/code&gt; folder to the frontend&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Navigate to the &lt;strong&gt;server.js&lt;/strong&gt; file in the base directory of the &lt;code&gt;start/&lt;/code&gt; folder.&lt;/p&gt;

&lt;p&gt;First we want to setup our basic express server&lt;/p&gt;

&lt;p&gt;&lt;em&gt;server.js&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt;  &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&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;express&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;app&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8081&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="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="s2"&gt;Listening on 8081&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;In your terminal run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node server.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We've now successfully setup our basic express server!&lt;/p&gt;

&lt;p&gt;When we navigate to &lt;code&gt;localhost:8081&lt;/code&gt; we should see the message: &lt;code&gt;Cannot GET /&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;What do we have to do to eliminate this error?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We need to find something for our express app to do on &lt;code&gt;/&lt;/code&gt; our base directory.

&lt;ul&gt;
&lt;li&gt;For example, serving our index.html to the frontend.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;How do we serve our index.html from the servers side?&lt;/p&gt;

&lt;p&gt;We are going to use &lt;a href="https://expressjs.com/en/starter/static-files.html" rel="noopener noreferrer"&gt;express static&lt;/a&gt; to serve the index.html, which is a static file. Our index.html file is located in the &lt;code&gt;public/&lt;/code&gt; folder.  When using &lt;code&gt;express static&lt;/code&gt; we need to establish what folder we want to use to serve our static content. Since all of our static content including our index.html is inside our public folder, we are going to specify the "public" folder.&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;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;static&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;public&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;Our &lt;em&gt;server.js&lt;/em&gt; file should look quite similar to 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;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&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;express&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;//serving the static content inside our public folder&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;static&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;public&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8081&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="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="s2"&gt;Listening on 8081&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;Navigate to &lt;code&gt;localhost:8081/index.html&lt;/code&gt; in your browser.&lt;/p&gt;

&lt;p&gt;You should now see our app.&lt;/p&gt;

&lt;p&gt;Congratulations! You've successfully setup the server!&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up Our Analytics.js File
&lt;/h2&gt;

&lt;p&gt;Objective:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tie the &lt;code&gt;analytics&lt;/code&gt; function on winow.onload window.unload.&lt;/li&gt;
&lt;li&gt;Create an event that: 

&lt;ul&gt;
&lt;li&gt;detects what element a user clicks on when visiting the page&lt;/li&gt;
&lt;li&gt;Create a timestamp to record what time the user clicked that element&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Store the object that holds the clicked element and the timestamp into a global object.&lt;/li&gt;

&lt;li&gt;Before leaving the page send all the stored data to the backend using the &lt;code&gt;Beacon API&lt;/code&gt;
&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Navigate to  our &lt;strong&gt;analytics.js&lt;/strong&gt; file in &lt;code&gt;public/&lt;/code&gt;-&amp;gt;&lt;code&gt;analytics.js&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Inside our &lt;strong&gt;analytics.js&lt;/strong&gt; file, the first thing we need to do is create an event handler that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;captures the element we clicked on inside our document&lt;/li&gt;
&lt;li&gt;the time we clicked on it&lt;/li&gt;
&lt;li&gt;then push it to a global array that holds the history throughout the entire end users visit to the web page.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's do that!&lt;/p&gt;

&lt;p&gt;First were capturing the element we clicked on and the time we clicked on it inside our document.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;click&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;event&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="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;clickedElement&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;outerHTML&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&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;Next we need to create a &lt;code&gt;dataHistory&lt;/code&gt; variable to store all data we capture from each click. Then push the captured data every time the user clicks inside the document.&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;let&lt;/span&gt; &lt;span class="nx"&gt;dataHistory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;click&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;event&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;dataHistory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;clickedElement&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;outerHTML&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&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;Now we need create our &lt;code&gt;analytics&lt;/code&gt; function. This function will;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;execute on window.load and window.unload&lt;/li&gt;
&lt;li&gt;Check to see if our browser has the &lt;code&gt;navigator.sendBeacon()&lt;/code&gt; method&lt;/li&gt;
&lt;li&gt;If it doesn't it will simply return&lt;/li&gt;
&lt;li&gt;If it does we will define the url we are sending our analytics data to the backend&lt;/li&gt;
&lt;li&gt;Create a variable that will create a new &lt;code&gt;Blob&lt;/code&gt; object that will hold our stringified JSON.&lt;/li&gt;
&lt;li&gt; Send the data to the &lt;code&gt;/analytics&lt;/code&gt; endpoint using &lt;code&gt;navigator.sendBeacon()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What our &lt;code&gt;analytics&lt;/code&gt; methods should look 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="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onunload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;analytics&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&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="o"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sendBeacon&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="c1"&gt;// Url we are sending the data to&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://localhost:8081/analytics&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;//Create the data to send&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dataHistoryBlob&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;Blob&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dataHistory&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendBeacon&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;dataHistoryBlob&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;We've now completed our analytics.js file!&lt;br&gt;
This is what our file should look 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;let&lt;/span&gt; &lt;span class="nx"&gt;dataHistory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;click&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;event&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;dataHistory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;clickedElement&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;outerHTML&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&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="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onunload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;analytics&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&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="o"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sendBeacon&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="c1"&gt;// Url we are sending the data to&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://localhost:8081/analytics&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;//Create the data to send&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dataHistoryBlob&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;Blob&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dataHistory&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendBeacon&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;dataHistoryBlob&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;There's one last thing we haven't done. In our url variable we send the data to a backend endpoint we haven't defined yet, &lt;code&gt;/analytics&lt;/code&gt;. Let's go to our server.js file to create that endpoint and make sure it can parse the data it's receiving.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating The "/analytics" Endpoint
&lt;/h2&gt;

&lt;p&gt;In our server.js file let's create the &lt;code&gt;/analytics&lt;/code&gt; endpoint.&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;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&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;express&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/analytics&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;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="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="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;204&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8081&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="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="s2"&gt;Listening on 8081&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;If we log the data won't be able to see anything due to express. All of our data is being passed through the body of our request. Unfortunately express itself can't parse data from the body so we have to use the &lt;code&gt;body-parser&lt;/code&gt; package from npm. Fortunately when we did an npm install setting up the project we already added the package as a dependency. Feel free to check your &lt;strong&gt;package.json&lt;/strong&gt; for reference.&lt;/p&gt;

&lt;p&gt;Now we need to add body parser to our server and use it to parse the json data being sent to the &lt;code&gt;/analytics&lt;/code&gt; endpoint. Our file should look 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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&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;express&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;bodyParser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&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;body-parser&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// parse application/x-www-form-urlencoded&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bodyParser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;urlencoded&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;extended&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="c1"&gt;// parse application/json&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bodyParser&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="c1"&gt;//serving the static content inside our public folder&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;static&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;public&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/analytics&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;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="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="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;204&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8081&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="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="s2"&gt;Listening on 8081&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;If we save and restart our server we can click on several elements, refresh the page, exit the page, or navigate to a different website, we should see the data being sent and logged to our server. We have now successfully build a very simple use case for the beacon API!&lt;/p&gt;

&lt;p&gt;Side note: To check to see what data is being sent to the backend on the browsers side. You can preserve the logs in the network tab.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fljxj0xfw3dtk4dicp9cz.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fljxj0xfw3dtk4dicp9cz.PNG" alt="Picture of preserve log in the Network Tab of Chrome Developer Tools" width="800" height="167"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Challenges:&lt;br&gt;
Expand upon the project by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Separating the business logic(our click event) into our &lt;strong&gt;index.js&lt;/strong&gt; file and have it import and use our &lt;strong&gt;analytics.js&lt;/strong&gt; file.&lt;/li&gt;
&lt;li&gt;Expand upon the current tracking capabilities by adding unique sessions.&lt;/li&gt;
&lt;li&gt;Clean up the element retrieval data. We currently use &lt;code&gt;.outerHTML&lt;/code&gt; see if there are better ways to find the elements we clicked on. :)&lt;/li&gt;
&lt;li&gt;Create a pop up to give users the option to accept or decline tracking.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy coding!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webapi</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>What is Tree Shaking?</title>
      <dc:creator>Austin Akers</dc:creator>
      <pubDate>Fri, 29 May 2020 13:37:52 +0000</pubDate>
      <link>https://dev.to/bboyakers/what-is-tree-shaking-1ojb</link>
      <guid>https://dev.to/bboyakers/what-is-tree-shaking-1ojb</guid>
      <description>&lt;h1&gt;
  
  
  What is Tree Shaking?
&lt;/h1&gt;

&lt;p&gt;Tree shaking is a term used as a means to eliminate code that isn't in use, or dead-code, as we call it. You can also think of it like choosing 3-4 relevant quotes from a book to write an excellent paper. If you only need 3-4 relevant quotes, why use the entire book?&lt;/p&gt;

&lt;p&gt;Whenever a &lt;a href="https://dev.to/tanhauhau/what-is-module-bundler-and-how-does-it-work-3gp2"&gt;code bundler&lt;/a&gt;, like webpack, builds our web application for production. It does tree shaking. Code bundlers like webpack do their best to remove &lt;strong&gt;dead code&lt;/strong&gt;, or unused code, to reduce the bundle size of your application when you prepare your code to be able to be used for production. Unfortunately, it can't catch everything, and that because we sometimes write code that isn't tree shaking friendly.&lt;/p&gt;

&lt;p&gt;A way for us to help code bundlers with tree shaking, or eliminating &lt;strong&gt;dead code&lt;/strong&gt;, in our web development projects is to only import necessary methods and components into our application. We do this by using JavaScript &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment" rel="noopener noreferrer"&gt;&lt;strong&gt;destructuring&lt;/strong&gt;&lt;/a&gt; syntax in our &lt;code&gt;import&lt;/code&gt; statements and properly &lt;code&gt;export&lt;/code&gt; code as well. In Vuetify, this is done by default when you import and use it throughout your project. &lt;/p&gt;




&lt;p&gt;Let's dive into an example to find out more about tree shaking!&lt;/p&gt;

&lt;p&gt;Starting off, in JavaScript we sometimes unintentionally import an entire framework and/or library into our application. Example below:&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;Vuex&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;vuex&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The problem with this import statement is that we import the entire library, &lt;code&gt;vuex&lt;/code&gt;, when we don't need everything from it when programming.Because of that, we end up bringing a significant amount of unnecessary code, into our web application. &lt;/p&gt;

&lt;p&gt;What are the problems with this?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It increases bundle size when we build and deploy our app.&lt;/li&gt;
&lt;li&gt;In return, it will take longer to load. Longer load times make for a bad end user experience.&lt;/li&gt;
&lt;li&gt;It helps us follow DRY ("don't repeat yourself" - write code only once if at all possible) coding principles when using the library of choice and the functions/methods within it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The question you should always ask when you import a module is "&lt;em&gt;What exactly do I need from here?&lt;/em&gt;" This allows you to better approach what to import. Example:&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;mapState&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;vuex&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example we are solely importing the &lt;a href="https://vuex.vuejs.org/guide/state.html#the-mapstate-helper" rel="noopener noreferrer"&gt;mapState&lt;/a&gt; helper from the &lt;a href="https://vuex.vuejs.org/" rel="noopener noreferrer"&gt;vuex&lt;/a&gt; library, which is used to help manage the data and how it flows for a vue.js application. To many people not comfortable with &lt;a href="https://github.com/lukehoban/es6features" rel="noopener noreferrer"&gt;es6&lt;/a&gt; this is a different &lt;a href="https://developer.mozilla.org/en-US/docs/Glossary/Syntax" rel="noopener noreferrer"&gt;syntax&lt;/a&gt; from what you usually see starting out. We are using ES6 &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#Object_destructuring" rel="noopener noreferrer"&gt;object destructuring&lt;/a&gt; to grab the &lt;code&gt;mapState&lt;/code&gt; helper from vuex. Instead of importing all of vuex and only using one small part of the library, we use this syntax to grab only what we need from the vuex library. This "take what you only need" mindset helps keep dead code out of your application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making Your Code Tree Shaking Friendly
&lt;/h2&gt;

&lt;p&gt;BOOM we magically now have a small calculator app. This is what it currently looks like:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;calculator.js&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="c1"&gt;//creating an object that holds functions to caclulate the numbers we input&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt;  &lt;span class="nx"&gt;myCalculator&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&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;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;

    &lt;span class="nf"&gt;subtract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&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;a&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;

    &lt;span class="nf"&gt;divide&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&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;a&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;

    &lt;span class="nf"&gt;multiply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&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;a&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;b&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="c1"&gt;//Making it possible for other files to import and use the calculator object&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;myCalculator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;index.js&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="k"&gt;import&lt;/span&gt;  &lt;span class="nx"&gt;myCalculatorfrom&lt;/span&gt;  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./calculator.js&lt;/span&gt;&lt;span class="dl"&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="nx"&gt;myCalculator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// Expected output: 3&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="nx"&gt;myCalculator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subtract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// Expeted output: 6&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This looks great, right? Well unfortunately there are a couple problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First, even if we use just one method on the &lt;code&gt;myCalculator&lt;/code&gt; object we will still import everything else inside &lt;code&gt;myCalculator&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Second, due to that when we use a code bundler, like webpack, to bundle it for production, our bundle size will remain the same.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How do we refactor this to make it tree shaking friendly for our code bundlers? &lt;/p&gt;

&lt;p&gt;We're going to split each of our methods inside &lt;code&gt;myCalculator&lt;/code&gt; into their own modules!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;calculator.js&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="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;b&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;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;b&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;function&lt;/span&gt; &lt;span class="nf"&gt;subtract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&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;a&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;b&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;function&lt;/span&gt; &lt;span class="nf"&gt;divide&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&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;a&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;b&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;function&lt;/span&gt; &lt;span class="nf"&gt;multiply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&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;a&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;b&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;What we did here was:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Break down all the methods inside the exported &lt;code&gt;myCalculator&lt;/code&gt; object into their own separate and exportable files&lt;/li&gt;
&lt;li&gt;Made it possible to specify what method we would like to use in our index.js&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Below we will declare the function we want without worrying about dead code:&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;add&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;./calculator&lt;/span&gt;&lt;span class="dl"&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="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// Expected output: 3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;How would we import other methods that were exported as modules from the same file? &lt;/p&gt;

&lt;p&gt;For example, after you add two numbers you'd like to use the &lt;code&gt;subtract&lt;/code&gt; method for two other numbers. &lt;/p&gt;

&lt;p&gt;We can do that within our destructuring object next to &lt;code&gt;add&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;index.js&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;subtract&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;./calculator&lt;/span&gt;&lt;span class="dl"&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="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// Expected output: 3&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="nf"&gt;subtract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// Expeted output: 6&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There you have it! We've now learned how to make our code tree shake ready. Not only are we happy but your code bundler is as well!&lt;/p&gt;

&lt;p&gt;More Info on Tree Shaking, Destructuring, ES6 Modules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://developers.google.com/web/fundamentals/performance/optimizing-javascript/tree-shaking" rel="noopener noreferrer"&gt;Reduce JavaScript Payloads with Tree Shaking&lt;/a&gt; (Article)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment" rel="noopener noreferrer"&gt;Destructuring assignment&lt;/a&gt; (MDN Documentation)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=-vR3a11Wzt0" rel="noopener noreferrer"&gt;Destructuring in ES6 - Beau teaches JavaScript&lt;/a&gt; (Video)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.sitepoint.com/understanding-es6-modules/" rel="noopener noreferrer"&gt;Understanding ES6 Modules&lt;/a&gt; (Article)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;P.S. Huge thanks for &lt;a href="https://dev.to/johannarlee"&gt;Johanna&lt;/a&gt; being the editor of this article!&lt;/p&gt;




&lt;p&gt;This blog post is a part of &lt;a href="https://vuetifyjs.com/en/introduction/guide/" rel="noopener noreferrer"&gt;Vuetify Beginner's Guide Series&lt;/a&gt;. 🐣 Each blog has been collaboratively worked on by the Vuetify Core Team. Interested in contributing a topic? ➡ Reach out to &lt;a href="https://dev.to/johannarlee"&gt;Johanna&lt;/a&gt; on Dev.to or in the &lt;a href="https://discord.com/invite/s93b7Fv" rel="noopener noreferrer"&gt;Vuetify Community Discord&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>vue</category>
      <category>vuetify</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>What is a CLI?</title>
      <dc:creator>Austin Akers</dc:creator>
      <pubDate>Mon, 11 May 2020 19:28:23 +0000</pubDate>
      <link>https://dev.to/bboyakers/what-is-a-cli-53a6</link>
      <guid>https://dev.to/bboyakers/what-is-a-cli-53a6</guid>
      <description>&lt;h1&gt;
  
  
  What is a CLI?
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Frk2z3duexrmf05utoydr.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Frk2z3duexrmf05utoydr.PNG" alt="Image of blank Terminal" width="800" height="800"&gt;&lt;/a&gt;&lt;br&gt;
A CLI or &lt;strong&gt;Command Line Interface&lt;/strong&gt; is an in interface that accepts text input to execute operating system functions. As a software developer we use CLI's all the time. What exactly does a CLI look like? Open your terminal on Mac or command prompt (powershell works too) if you are on Windows. As a developer we use the terminal and/or command prompt to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;install packages&lt;/li&gt;
&lt;li&gt;run scripts&lt;/li&gt;
&lt;li&gt;manage project files &lt;/li&gt;
&lt;li&gt;and more. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Something you might be familiar with in the web development world is this:&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="nv"&gt;$ &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &amp;lt;package name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ex. &lt;code&gt;npm install vue&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fpro0g6xdis22hcjtonn7.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fpro0g6xdis22hcjtonn7.gif" alt="Gif of npm install vue" width="550" height="65"&gt;&lt;/a&gt;&lt;br&gt;
You can even navigate to and around the files on your system, or better yet what we call the &lt;strong&gt;file system&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In that example in the CLI, we are using the node package manager, &lt;code&gt;npm&lt;/code&gt;, to install a package of our choice!&lt;/p&gt;
&lt;h2&gt;
  
  
  Basic Commands
&lt;/h2&gt;

&lt;p&gt;There are some basic commands you can use that come in handy when using the &lt;strong&gt;file system&lt;/strong&gt;:&lt;/p&gt;
&lt;h3&gt;
  
  
  Basic Windows Commands
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;dir&lt;/code&gt; - Lists what is in the current directory (folder).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cd &amp;lt;pathName&amp;gt;&lt;/code&gt; - Changes the directory (folder) in the file system&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cd ..&lt;/code&gt; - Moves you up one level&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mkdir or md &amp;lt;folderName&amp;gt;&lt;/code&gt; - Makes a new directory (folder).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Basic Linux Commands
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ls&lt;/code&gt; - Lists what is in the current directory (folder).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cd &amp;lt;pathName&amp;gt;&lt;/code&gt; - Changes the directory (folder) in the file system&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cd ..&lt;/code&gt; - Moves you up one level&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mkdir or md &amp;lt;folderName&amp;gt;&lt;/code&gt; - Makes a new directory (folder).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Suggestion to get comfortable with the CLI&lt;/em&gt;: &lt;br&gt;
Play with the commands and see what you can do!&lt;/p&gt;
&lt;h3&gt;
  
  
  Basic Challenges
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt; Open your terminal/command prompt and navigate to  your Documents directory and then Downloads directory&lt;/li&gt;
&lt;li&gt; Inside your Documents directory  create a folder&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Bonus&lt;/strong&gt;: Navigate inside the folder you created and figure out how to create a file!&lt;/p&gt;
&lt;h2&gt;
  
  
  Vue CLI
&lt;/h2&gt;

&lt;p&gt;Before we get go further into getting the project started we need to take a look into the Vue CLI. Vue CLI is the standard command line tooling for developing vue.js projects. To learn how to install Vue CLI &lt;a href="https://cli.vuejs.org/" rel="noopener noreferrer"&gt;visit here&lt;/a&gt;. If you're wanting to know more information about how to use the Vue CLI you can visit the &lt;a href="https://cli.vuejs.org/guide/" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Creating the Project
&lt;/h2&gt;

&lt;p&gt;The first thing we need to do is create is a Vue project. Hopefully you've familiarized yourself with the basic commands. Navigate to the directory you'd like to create the project in and type:&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="nv"&gt;$ &lt;/span&gt;vue create my-app
// navigate to new project directory
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;my-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fl8qoqv927550in0j1l60.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fl8qoqv927550in0j1l60.gif" alt="Gif of vue create and cd" width="561" height="334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding Vuetify
&lt;/h2&gt;

&lt;p&gt;Now that we've created our project and navigated into the directory, next we have to add the Vuetify UI.&lt;/p&gt;

&lt;p&gt;Next we have to add the Vuetify CLI package by typing in our CLI:&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="nv"&gt;$ &lt;/span&gt;vue add vuetify
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2fw1znjv09qyznpdpqm5.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2fw1znjv09qyznpdpqm5.gif" alt="Gif of add vuetif" width="561" height="334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Using Vue UI
&lt;/h2&gt;

&lt;p&gt;We can also use Vue UI to install Vuetify CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;// ensure Vue CLI is &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; 3.0
&lt;span class="nv"&gt;$ &lt;/span&gt;vue &lt;span class="nt"&gt;--version&lt;/span&gt;

// Then start the UI
&lt;span class="nv"&gt;$ &lt;/span&gt;vue ui
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;Plugins&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Type in &lt;strong&gt;vuetify&lt;/strong&gt; in the search bar&lt;/li&gt;
&lt;li&gt;You should see &lt;strong&gt;vue-cli-plugin-vuetify&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click and install it&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;This blog post is a part of &lt;a href="https://vuetifyjs.com/en/introduction/guide/" rel="noopener noreferrer"&gt;Vuetify Beginner's Guide Series&lt;/a&gt;. 🐣 Each blog has been collaboratively worked on by the Vuetify Core Team. Interested in contributing a topic? ➡ Reach out to &lt;a href="https://dev.to/johannarlee"&gt;Johanna&lt;/a&gt; on Dev.to or in the &lt;a href="https://discord.com/invite/s93b7Fv" rel="noopener noreferrer"&gt;Vuetify Community Discord&lt;/a&gt;. &lt;/p&gt;

</description>
      <category>vue</category>
      <category>vuetify</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Let's Build a Github Profile Search Web App</title>
      <dc:creator>Austin Akers</dc:creator>
      <pubDate>Wed, 03 Jul 2019 20:45:16 +0000</pubDate>
      <link>https://dev.to/bboyakers/let-s-build-a-github-profile-search-web-app-5832</link>
      <guid>https://dev.to/bboyakers/let-s-build-a-github-profile-search-web-app-5832</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsdcbw3tg6fzf589bg6z1.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsdcbw3tg6fzf589bg6z1.PNG" width="800" height="731"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As my first blog post I thought i'd be great to be able to try and start posting a series of weekly projects for developers looking to build small fun web apps to add to their portfolio.&lt;/p&gt;

&lt;p&gt;Today I thought i'd be great to start it off with building something fairly interesting. Bulding a Github Profile Search Web App using the Github API.&lt;/p&gt;

&lt;p&gt;Let's Begin!!&lt;/p&gt;

&lt;p&gt;1.) First create a folder structure like this.&lt;br&gt;
css/styles.css&lt;br&gt;
js/scripts.js&lt;br&gt;
index.html&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv1eg0ikwc5kjvje868rv.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv1eg0ikwc5kjvje868rv.PNG" width="318" height="136"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you really want to learn something fun, try using the terminal!&lt;/p&gt;

&lt;p&gt;touch index.html&lt;br&gt;
mkdir css &amp;amp;&amp;amp; mkdir js&lt;br&gt;
touch css/styles.css&lt;br&gt;
touch js/scripts.js&lt;/p&gt;

&lt;p&gt;'touch' is the easiest way to create new, empty files&lt;br&gt;
'mkdir' is the easiest way to create new, empty folders&lt;/p&gt;

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

&lt;p&gt;3.)Next we need to setup our app skeleton&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcga19oyeuzgctipqaw9h.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcga19oyeuzgctipqaw9h.PNG" width="706" height="199"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We've create a two main div's. The first div is for our input field and search button. The second div is where we will be displaying the returned information from the call we make to the github api.&lt;/p&gt;

&lt;p&gt;We have the classes there as well because we will be using them to style the application and use the elements in JavaScript as you'll see later on.&lt;/p&gt;

&lt;p&gt;Building out the JavaScript&lt;br&gt;
In this section we will be building out the functionality of the application.&lt;/p&gt;

&lt;p&gt;4.) Scaffold&lt;/p&gt;

&lt;p&gt;Before you build out anything it's always great to get an idea of what you should be writing before you sink time into coding. Ask yourself, "what are we trying to accomplish?"&lt;/p&gt;

&lt;p&gt;Tasks:&lt;br&gt;
-Grab search element&lt;br&gt;
-Grab div that will display the data&lt;br&gt;
-When we click search we want:&lt;br&gt;
    -Grab data from the text input field&lt;br&gt;
    -Use that data to grab user info from the Github API&lt;br&gt;
    -Display the response data from the Github API &lt;/p&gt;

&lt;p&gt;It should look a little something like this!&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6o3msiusu66oyux12em0.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6o3msiusu66oyux12em0.PNG" width="504" height="172"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5.) Grab our elements and create search call&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F74gzsgt9i1l08ce5e7cl.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F74gzsgt9i1l08ce5e7cl.PNG" width="564" height="230"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're wondering about querySelector(); &lt;br&gt;
Here's a link! &lt;br&gt;
&lt;a href="https://www.w3schools.com/jsref/met_document_queryselector.asp" rel="noopener noreferrer"&gt;https://www.w3schools.com/jsref/met_document_queryselector.asp&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=JlgLDfINXvY" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=JlgLDfINXvY&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're wanting to understand addEventListener();&lt;br&gt;
&lt;a href="https://www.w3schools.com/jsref/met_document_addeventlistener.asp" rel="noopener noreferrer"&gt;https://www.w3schools.com/jsref/met_document_addeventlistener.asp&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=F3odgpghXzY" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=F3odgpghXzY&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;6.) Grab our data from our input field and setup our call to the Github API&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmwc1xo0an4rxl1w2evq9.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmwc1xo0an4rxl1w2evq9.PNG" width="701" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Okay now whoa. There's a lot going on here you're probably wondering and to be honest. You are absolutely correct so let's break it down :).&lt;/p&gt;

&lt;p&gt;When we click we need to grab the most recent data from our input field. If we declare in the global scope of our file it will &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftmcrz309e7lwvorwscb4.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftmcrz309e7lwvorwscb4.PNG" width="701" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Secondly let's take a look at this GET request.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foqvvvm8z2ismtfdmje30.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foqvvvm8z2ismtfdmje30.PNG" width="701" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What is XMLHttpRequest?&lt;br&gt;
XMLHttpRequest is a built-in browser object that allows to make HTTP requests in JavaScript.&lt;br&gt;
More info here.&lt;br&gt;
&lt;a href="https://javascript.info/xmlhttprequest" rel="noopener noreferrer"&gt;https://javascript.info/xmlhttprequest&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=rjmtYkRK1nM" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=rjmtYkRK1nM&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I decided to use this instead of fetch simply due to browser compatibility. I thought it'd be great to support old browsers and not have to deal with polyfills. Take a look here.&lt;br&gt;
 &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch#Browser_compatibility" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch#Browser_compatibility&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you'd like to use fetch instead, feel free to!&lt;/p&gt;

&lt;p&gt;7.)Next we have to check and use our response data.&lt;/p&gt;

&lt;p&gt;You can check the contents of the response by doing a console.log(response) where we are suppose to display the data.&lt;/p&gt;

&lt;p&gt;Now we populate our data in our HTML&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe9gsv7pc1h65r1zgfrh9.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe9gsv7pc1h65r1zgfrh9.PNG" width="731" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;8.) Now we add styling!&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fonwkhi25fu0qcvp9l3q1.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fonwkhi25fu0qcvp9l3q1.PNG" width="616" height="674"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi478otjybcl4xww94f0k.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi478otjybcl4xww94f0k.PNG" width="347" height="642"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We're done!!!!&lt;/p&gt;

&lt;p&gt;Hopefully you made sure you're weren't getting any errors along the way and you've attached your scripts and style sheet as well! &lt;/p&gt;

&lt;p&gt;As nice as this app seems there is much more you can do to improve this application. &lt;/p&gt;

&lt;p&gt;Here's a list:&lt;br&gt;
-**Look into alternatives for using innerHTML and understand why using it isn't the best practice&lt;br&gt;
-Add CSS animations for the card&lt;br&gt;
-Add error handling to our call&lt;br&gt;
-Use CSS Grids or Flexbox for the layout&lt;br&gt;
-Convert the CSS into Sass&lt;/p&gt;

&lt;p&gt;That'll keep you busy for a bit. Have fun and enjoy your week!&lt;/p&gt;

</description>
      <category>html</category>
      <category>css</category>
      <category>javascript</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
