{"componentChunkName":"component---src-templates-post-js","path":"/blog/es6-modules","result":{"data":{"markdownRemark":{"html":"<p class=\"intro\">A Module is simply a javascript file with a bunch of variables or functions which can be imported and used in other javascript files. With ES6, working with modules has become fun. Let me tell you how.</p>\n<p>Before ES6 Modules, we used to have <code class=\"language-text\">script</code> tags in our <code class=\"language-text\">html</code> file to import and use a library. Let's see the example below:</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\"><span class=\"token comment\">&lt;!-- index.html --></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>html</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>title</span><span class=\"token punctuation\">></span></span>Before ES6 Modules<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>title</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>body</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token script\"></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>./app.js<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token script\"></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>body</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>html</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// app.js</span>\n\n<span class=\"token keyword\">const</span> numbers <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> uniqNumbers <span class=\"token operator\">=</span> _<span class=\"token punctuation\">.</span><span class=\"token function\">uniq</span><span class=\"token punctuation\">(</span>numbers<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// _.uniq is coming from lodash</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>uniqNumbers<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// [1, 2, 3, 4]</span></code></pre></div>\n<p>Above, we are including <code class=\"language-text\">lodash</code> in the <code class=\"language-text\">index.html</code> file. And we are using <code class=\"language-text\">uniq</code> function provided by <code class=\"language-text\">lodash</code> to find the unique numbers. Here, the <code class=\"language-text\">_</code> was not defined explicitly and someone looking at only the <code class=\"language-text\">app.js</code> file would have no idea from where the <code class=\"language-text\">_</code> is coming from. So, is there a better way to do it? Well, yeah!</p>\n<h3>NPM - Node Package Manager</h3>\n<p>NPM is where all the javascript libraries are hosted. If you ever want to use one, you would have to install it from here. You must have <a href=\"https://nodejs.org/en/\" target=\"_blank\">NodeJS</a> installed in your system to use it. NPM comes with NodeJS.</p>\n<p>Let's create a directory called <code class=\"language-text\">es6Modules</code> and <code class=\"language-text\">cd</code> into it. Create an <code class=\"language-text\">index.html</code> and an <code class=\"language-text\">app.js</code> file inside the directory.\nNow, run the command <code class=\"language-text\">npm init</code> in your terminal inside this directory. It will ask a few questions about your project. After answering all the project related questions. It will generate a <code class=\"language-text\">package.json</code> file which contains the details about your project and also the libraries that you have installed from npm.</p>\n<p>The directory structure would look something like below:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">├── app.js\n├── index.html\n└── package.json</code></pre></div>\n<p>To install a package from NPM, you just have to type the command <code class=\"language-text\">npm install &lt;package-name&gt;</code> in your terminal.\nFor installing <code class=\"language-text\">lodash</code>, it would be <code class=\"language-text\">npm install lodash</code>. After running this command, you will see a folder called <code class=\"language-text\">node_modules</code> appear in your directory. It will contain all the libraries or packages that you have installed. Also, in your <code class=\"language-text\">package.json</code> file, <code class=\"language-text\">lodash</code> will be added to the dependencies section.</p>\n<p>Now, that <code class=\"language-text\">lodash</code> is installed. Let's use it.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// app.js</span>\n<span class=\"token keyword\">import</span> _ <span class=\"token keyword\">from</span> <span class=\"token string\">'lodash'</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// this is how you import an es6 module</span>\n\n<span class=\"token keyword\">const</span> numbers <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> uniqNumbers <span class=\"token operator\">=</span> _<span class=\"token punctuation\">.</span><span class=\"token function\">uniq</span><span class=\"token punctuation\">(</span>numbers<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>uniqNumbers<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Now, let's reference <code class=\"language-text\">app.js</code> file in the <code class=\"language-text\">index.html</code> to run it.</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\"><span class=\"token comment\">&lt;!-- index.html --></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>html</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>title</span><span class=\"token punctuation\">></span></span>ES6 Modules<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>title</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>body</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>./app.js<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token script\"></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>body</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>html</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p>Now, open the <code class=\"language-text\">index.html</code> file in the browser and check your console. Instead of seeing the unique Numbers, you are seeing an error something like below:</p>\n<figure>\n  <span class=\"gatsby-resp-image-wrapper\" style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; \">\n      <span class=\"gatsby-resp-image-background-image\" style=\"padding-bottom: 15.950920245398773%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAYAAACTWi8uAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAArUlEQVQI1yWKa27CMBgEcwYQQgjn8yNuSkB9KYntlLgBqfe/0lR2f6x2drRN3jZKvteVe870lwHjHJ/jWP0UAiFGxmkipFR/2/PJ9ngQl4U5RnJKhBCqa377nuwcq7UsIiQRFq356TruxpCU4u1wYNjvGXY7Pk4nZhFGpSq/H498tYrZWpJzNDfnuRrN1Rhu1jLofy4pXNxFa15E6EXwbUt3PuOVqlz6tfy9r/sP4HRZdE67aVMAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;\"></span>\n  <img class=\"gatsby-resp-image-image\" alt=\"es6 modules error\" title=\"es6 modules error\" src=\"/static/09c80b5400519a3f35ebed5eaee6260b/a6d36/es6-modules-error.png\" srcset=\"/static/09c80b5400519a3f35ebed5eaee6260b/222b7/es6-modules-error.png 163w,\n/static/09c80b5400519a3f35ebed5eaee6260b/ff46a/es6-modules-error.png 325w,\n/static/09c80b5400519a3f35ebed5eaee6260b/a6d36/es6-modules-error.png 650w,\n/static/09c80b5400519a3f35ebed5eaee6260b/cecac/es6-modules-error.png 728w\" sizes=\"(max-width: 650px) 100vw, 650px\" style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\" loading=\"lazy\">\n    </span>\n  <figcaption>ES6 Modules are not supported in browsers</figcaption>\n</figure>\n<p>Well, it turns out that browsers don't support ES6 Modules just yet. But that doesn't mean we can't use it. We can use package bundlers like webpack or parcel to compile our ES6 Modules syntax to something that our browsers understand.</p>\n<p>For this tutorial, I am going to use webpack. To install webpack execute the command given below:</p>\n<p><code class=\"language-text\">npm install webpack webpack-cli --save-dev</code></p>\n<p>Now, create a <code class=\"language-text\">webpack.config.js</code> file in your root directory to configure webpack.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// webpack.config.js</span>\n\n<span class=\"token keyword\">const</span> path <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'path'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nmodule<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  entry<span class=\"token operator\">:</span> <span class=\"token string\">'./app.js'</span><span class=\"token punctuation\">,</span> <span class=\"token comment\">// entry point of our project</span>\n  output<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    filename<span class=\"token operator\">:</span> <span class=\"token string\">'bundle.js'</span><span class=\"token punctuation\">,</span> <span class=\"token comment\">// The name of the output file</span>\n    path<span class=\"token operator\">:</span> path<span class=\"token punctuation\">.</span><span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span>__dirname<span class=\"token punctuation\">,</span> <span class=\"token string\">'dist'</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// The folder where output file will be generated</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Now, we need to add a script to our <code class=\"language-text\">package.json</code> file to run webpack and bundle our code. Open up <code class=\"language-text\">package.json</code> file and a script as given below:</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token comment\">// package.json</span>\n\n<span class=\"token property\">\"scripts\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">\"build\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"webpack --config webpack.config.js\"</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Here, <code class=\"language-text\">--config</code> is used to specify our configuration file <code class=\"language-text\">webpack.config.js</code>.</p>\n<p>Now, run the build script by running <code class=\"language-text\">npm run build</code> in your terminal. After running this script, you will see that webpack has generated a file called <code class=\"language-text\">bundle.js</code> inside <code class=\"language-text\">dist</code> folder.\nThis file contains the code that we have written in  <code class=\"language-text\">app.js</code> but in way that our browsers will understand. So, we now have to reference this file in <code class=\"language-text\">index.html</code></p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\"><span class=\"token comment\">&lt;!-- index.html --></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>html</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>title</span><span class=\"token punctuation\">></span></span>ES6 Modules<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>title</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>body</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>./dist/bundle.js<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token script\"></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>body</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>html</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p>If you open the <code class=\"language-text\">index.html</code> file in your browser, you will see the unique Numbers as below:</p>\n<figure>\n  <span class=\"gatsby-resp-image-wrapper\" style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; \">\n      <span class=\"gatsby-resp-image-background-image\" style=\"padding-bottom: 15.950920245398773%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAYAAACTWi8uAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAi0lEQVQI102NUQ6EIAxEOYoRCkZYBNEoAe5/rNm0CYkfL9N22o7qvYN53xe1VhARlmVBzhmtNZzniVIKUkqiz/NgjCE3933jui6ZMzxXvMhLORX8woEYD3jvRUMI2LZNQqy1MMaIxzcxRuz7Lj0/ncFKGwtLBCIrGEPQWmNdV1F+8mV602c41Dkn9R80J1skMHmjEwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;\"></span>\n  <img class=\"gatsby-resp-image-image\" alt=\"es6 uniq numbers\" title=\"es6 uniq numbers\" src=\"/static/c816ebc85ba3df4e6d4bc0146d5ea77f/a6d36/es6-uniq-numbers.png\" srcset=\"/static/c816ebc85ba3df4e6d4bc0146d5ea77f/222b7/es6-uniq-numbers.png 163w,\n/static/c816ebc85ba3df4e6d4bc0146d5ea77f/ff46a/es6-uniq-numbers.png 325w,\n/static/c816ebc85ba3df4e6d4bc0146d5ea77f/a6d36/es6-uniq-numbers.png 650w,\n/static/c816ebc85ba3df4e6d4bc0146d5ea77f/c54b3/es6-uniq-numbers.png 727w\" sizes=\"(max-width: 650px) 100vw, 650px\" style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\" loading=\"lazy\">\n    </span>\n  <figcaption>Bundled code by webpack works fine in the browser</figcaption>\n</figure>\n<p>This is all for this post. In the next post, I will talk about writing and using our own ES6 Modules. Until then read the documentation of <a href=\"https://webpack.js.org/guides/\" target=\"_blank\">webpack</a> to learn more about all the awesome things it does.</p>","timeToRead":4,"frontmatter":{"title":"Getting Started With ES6 Modules","date":"2018-10-18T00:00:00.000Z","tags":["Javascript"]}}},"pageContext":{"slug":"es6-modules"}},"staticQueryHashes":["3649515864","63159454"]}