<?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: Olivier</title>
    <description>The latest articles on DEV Community by Olivier (@olivierloverde).</description>
    <link>https://dev.to/olivierloverde</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%2F356990%2F6c7354c6-f976-4a02-ae29-a9f675cca893.jpeg</url>
      <title>DEV Community: Olivier</title>
      <link>https://dev.to/olivierloverde</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/olivierloverde"/>
    <language>en</language>
    <item>
      <title>🎉 Deno: 1.0 officially scheduled on May, 13! Review of the features </title>
      <dc:creator>Olivier</dc:creator>
      <pubDate>Fri, 08 May 2020 23:24:20 +0000</pubDate>
      <link>https://dev.to/olivierloverde/deno-1-0-officially-scheduled-on-may-13-review-of-the-features-1kb0</link>
      <guid>https://dev.to/olivierloverde/deno-1-0-officially-scheduled-on-may-13-review-of-the-features-1kb0</guid>
      <description>&lt;h1&gt;
  
  
  🤠 Introduction
&lt;/h1&gt;

&lt;p&gt;It all started 2 years ago, Ryan Dahl, the creator of Node.js gave a talk at the JSConf 2018 "10 Things I Regret About Node.js":&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/M3BM9TB-8yA"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;It was actually 7 things 🙃he regrets about Node.js: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Not sticking with Promises:&lt;/strong&gt; he added them in June 2009 but removed them in February 2010, with Promises in Node.js, It could have sped up the delivery of a standard on async/await&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Security:&lt;/strong&gt; Node process has wide access including system calls, network, disk I/O&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The build system:&lt;/strong&gt; You need GYP for compiling native C library and link it to Node.js modules, Chrome used to use GYB but now Node is the sole user&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;package.json:&lt;/strong&gt; it includes unnecessary information such as LICENCES and repository - also it uses a centralized repository for modules&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;node_modules:&lt;/strong&gt; maybe the worse for him, resolution is complex, folder size is frequently huge...&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;require without extension:&lt;/strong&gt; the module load has to guess the extension and this is not how browser works&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;index.js:&lt;/strong&gt; it complicates the module loading system&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  🌈 Deno was born
&lt;/h1&gt;

&lt;p&gt;With all the things learned by building Node.js, Ryan came up with a new idea named &lt;a href="https://deno.land/"&gt;Deno&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A secure runtime for JavaScript and TypeScript.&lt;br&gt;
Deno aims to provide a productive and secure scripting environment for the modern programmer. It is built on top of V8, Rust, and TypeScript.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Instead of using C++ as in Node.js, It's built on top of &lt;a href="https://www.rust-lang.org/"&gt;Rust&lt;/a&gt; and It uses &lt;a href="https://tokio.rs"&gt;Tokio&lt;/a&gt; under the hood. It brings many of the best open-source technologies together.&lt;/p&gt;

&lt;h1&gt;
  
  
  🎉 Deno 1.0 - Release scheduled on May 13
&lt;/h1&gt;

&lt;p&gt;So after almost 2 years, the API has been officially frozen and the launch of the 1.0 is scheduled on May 13. It addresses the design flaws that Ryan talked about in his lecturez.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started 🙌
&lt;/h2&gt;

&lt;p&gt;To install Deno, here are the instructions: &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Using Shell:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://deno.land/x/install/install.sh | sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Or using PowerShell:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;iwr https://deno.land/x/install/install.ps1 &lt;span class="nt"&gt;-useb&lt;/span&gt; | iex
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Using Homebrew (macOS or Linux):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

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



&lt;p&gt;&lt;strong&gt;Using Chocolatey (Windows):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;choco &lt;span class="nb"&gt;install &lt;/span&gt;deno
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;See &lt;a href="https://github.com/denoland/deno_install"&gt;deno_install&lt;/a&gt; for more installation options.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's in the 1.0 release ? 👀
&lt;/h2&gt;

&lt;p&gt;Deno 1.0 comes fully loaded with many useful features for modern development. In the following section we are going to cover all the greatest features coming in the new release.&lt;/p&gt;

&lt;h3&gt;
  
  
  Supports TypeScript out of the box
&lt;/h3&gt;

&lt;p&gt;Well, everything is in the title. You can also bring your own &lt;code&gt;tsconfig.json&lt;/code&gt; by using the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;deno run -c tsconfig.json [program.ts]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  Security by design
&lt;/h3&gt;

&lt;p&gt;Programs run with no permissions &lt;strong&gt;by default&lt;/strong&gt; and if the code needs permissions will be alerted. &lt;/p&gt;

&lt;p&gt;You need to use command-line options to tell Deno what permissions the program needs. By running &lt;code&gt;deno run -h&lt;/code&gt; you will see the full list of permissions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-A, --allow-all                    Allow all permissions
    --allow-env                    Allow environment access
    --allow-hrtime                 Allow high resolution time measurement
    --allow-net=&amp;lt;allow-net&amp;gt;        Allow network access
    --allow-plugin                 Allow loading plugins
    --allow-read=&amp;lt;allow-read&amp;gt;      Allow file system read access
    --allow-run                    Allow running subprocesses
    --allow-write=&amp;lt;allow-write&amp;gt;    Allow file system write access
    --cached-only                  Require that remote dependencies are already cached
    --cert &amp;lt;FILE&amp;gt;                  Load certificate authority from PEM encoded file
-c, --config &amp;lt;FILE&amp;gt;                Load tsconfig.json configuration file
-h, --help                         Prints help information
    --importmap &amp;lt;FILE&amp;gt;             UNSTABLE: Load import map file
    --inspect=&amp;lt;HOST:PORT&amp;gt;          activate inspector on host:port (default: 127.0.0.1:9229)
    --inspect-brk=&amp;lt;HOST:PORT&amp;gt;      activate inspector on host:port and break at start of user script
    --lock &amp;lt;FILE&amp;gt;                  Check the specified lock file
    --lock-write                   Write lock file. Use with --lock.
-L, --log-level &amp;lt;log-level&amp;gt;        Set log level [possible values: debug, info]
    --no-remote                    Do not resolve remote modules
-q, --quiet                        Suppress diagnostic output
-r, --reload=&amp;lt;CACHE_BLACKLIST&amp;gt;     Reload source code cache (recompile TypeScript)
    --seed &amp;lt;NUMBER&amp;gt;                Seed Math.random()
    --unstable                     Enable unstable APIs
    --v8-flags=&amp;lt;v8-flags&amp;gt;          Set V8 command line options. For help: --v8-flags=--help
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  ECMAScript modules built-in
&lt;/h3&gt;

&lt;p&gt;Deno does not support &lt;code&gt;require()&lt;/code&gt;, It uses ES Modules:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import * as log from "https://deno.land/std/log/mod.ts";
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;The package management is super simple, just provide the URL of what you want to use. As the URL may change, for security purposes, by using a lock file (using the --lock command line flag) you can ensure you're running the code you expect to be.&lt;/p&gt;

&lt;h3&gt;
  
  
  Super simple package management
&lt;/h3&gt;

&lt;p&gt;Deno does not use npm. It uses modules referenced as URLs or file paths:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { serve } from "https://deno.land/std@v0.42.0/http/server.ts";

const s = serve({ port: 8000 });

for await (const req of s) {
  req.respond({ body: "Hello World\n" });
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;You can specify version of the package in directly in the URL. For example &lt;code&gt;https://deno.land/std@v0.42.0/http/server.ts&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Also, Deno offers a built-in dependency inspector (&lt;code&gt;deno info&lt;/code&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  Use &lt;code&gt;deps.ts&lt;/code&gt; instead of &lt;code&gt;package.json&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;The Deno convention for dependency management is using a unique file called &lt;code&gt;deps.ts&lt;/code&gt; for storing all the dependency. For example, we can look at the &lt;code&gt;deps.ts&lt;/code&gt; of &lt;a href="https://github.com/oakserver/oak"&gt;oak&lt;/a&gt;, the popular middleware framework for Deno's http server inspired by Koa:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Copyright 2018-2020 the oak authors. All rights reserved. MIT license.&lt;/span&gt;

&lt;span class="c1"&gt;// This file contains the external dependencies that oak depends upon&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;HTTPOptions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;HTTPSOptions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;serve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;ServerRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;serveTLS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://deno.land/std@v1.0.0-rc1/http/server.ts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;Status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;STATUS_TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://deno.land/std@v1.0.0-rc1/http/http_status.ts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;Cookies&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Cookie&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;setCookie&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;getCookies&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;delCookie&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://deno.land/std@v1.0.0-rc1/http/cookie.ts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;basename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;extname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;join&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;isAbsolute&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;normalize&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;sep&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://deno.land/std@v1.0.0-rc1/path/mod.ts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;HmacSha256&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;https://deno.land/std@v1.0.0-rc1/util/sha256.ts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;assert&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;https://deno.land/std@v1.0.0-rc1/testing/asserts.ts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;contentType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;lookup&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://deno.land/x/media_types@v2.0.0/mod.ts&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;(Source: &lt;a href="https://github.com/oakserver/oak/blob/master/deps.ts"&gt;https://github.com/oakserver/oak/blob/master/deps.ts&lt;/a&gt;)&lt;/p&gt;

&lt;h3&gt;
  
  
  JSDoc built-in with &lt;code&gt;deno doc&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;We strive for complete documentation. Deno has JSDoc built-in so you can use write JSDoc comments in files.&lt;/p&gt;

&lt;h3&gt;
  
  
  Test runner with &lt;code&gt;Deno.test()&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;std/testing/asserts.ts&lt;/code&gt; module provides range of assertion helpers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;equal()&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;&lt;code&gt;assert()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;assertEquals()&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;&lt;code&gt;assertNotEquals()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;assertStrictEq()&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;&lt;code&gt;assertStrContains()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;assertMatch()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;assertArrayContains()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;assertThrows()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;assertThrowsAsync()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;unimplemented()&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;&lt;code&gt;unreachable()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="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;assertEquals&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;https://deno.land/std/testing/asserts.ts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;Deno&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;testing example&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;assertEquals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;world&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;world&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;assertEquals&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;world&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;hello&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;world&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;(Source: &lt;a href="https://github.com/denoland/deno/tree/master/std/testing"&gt;https://github.com/denoland/deno/tree/master/std/testing&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Run &lt;code&gt;deno test file.spec.ts&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;Compile file.spec.ts
Download https://deno.land/std/testing/asserts.ts
Download https://deno.land/std/fmt/colors.ts
Download https://deno.land/std/testing/diff.ts
running 1 tests
&lt;span class="nb"&gt;test &lt;/span&gt;testing example ... ok &lt;span class="o"&gt;(&lt;/span&gt;9ms&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;test &lt;/span&gt;result: ok. 1 passed&lt;span class="p"&gt;;&lt;/span&gt; 0 failed&lt;span class="p"&gt;;&lt;/span&gt; 0 ignored&lt;span class="p"&gt;;&lt;/span&gt; 0 measured&lt;span class="p"&gt;;&lt;/span&gt; 0 filtered out &lt;span class="o"&gt;(&lt;/span&gt;9ms&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  Formatting with &lt;code&gt;deno fmt &amp;lt;files&amp;gt;&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;It is provided by &lt;a href="https://github.com/dprint/dprint"&gt;dprint&lt;/a&gt;, an alternative to the famour Prettier.&lt;/p&gt;

&lt;h3&gt;
  
  
  Compiling and bundling with &lt;code&gt;deno bundle&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;It is currently marked as unstable. So use it at your own risk.&lt;/p&gt;

&lt;h3&gt;
  
  
  Debugger &lt;code&gt;deno run -A --inspect-brk fileToDebug.ts&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;With this you can open the Chrome debugger (&lt;code&gt;chrome://inspect&lt;/code&gt;) and start inspect the process!&lt;/p&gt;

&lt;h3&gt;
  
  
  Reviewed (audited) Standard library
&lt;/h3&gt;

&lt;p&gt;The standard library is garanteed to work with Deno, they do not have external dependencies and they are reviewed by the Deno core team. Modules are tagged in accordance with Deno releases, so version v0.4.0 of a standard library is garanteed to work with Deno v0.4.0.&lt;/p&gt;

&lt;p&gt;List of modules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/denoland/deno/blob/master/std/fmt/colors.ts"&gt;colors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/denoland/deno/blob/master/std/datetime/README.md"&gt;datetime&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/denoland/deno/blob/master/std/encoding/README.md"&gt;encoding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/denoland/deno/blob/master/std/examples/README.md"&gt;examples&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/denoland/deno/blob/master/std/flags/README.md"&gt;flags&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/denoland/deno/blob/master/std/fs/README.md"&gt;fs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/denoland/deno/blob/master/std/http/README.md"&gt;http&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/denoland/deno/blob/master/std/log/README.md"&gt;log&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/denoland/deno/blob/master/std/node/README.md"&gt;node&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/denoland/deno/blob/master/std/testing/README.md"&gt;testing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/denoland/deno/blob/master/std/uuid/README.md"&gt;uuid&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/denoland/deno/blob/master/std/ws/README.md"&gt;ws&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Usage of W3C web standards
&lt;/h3&gt;

&lt;p&gt;Deno provides the following W3C web standards APIs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Request&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Response&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;addEventListener&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;atob&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;btoa&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ReadableStream&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;clearInterval&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;clearTimeout&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dispatchEvent&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fetch&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;queueMicrotask&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;removeEventListener&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;setInterval&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;setTimeout&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AbortSignal&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Blob&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;File&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;FormData&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Headers&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;URL&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;URLSearchParams&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;console&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;isConsoleInstance&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;location&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;onload&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;onunload&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;self&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;window&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AbortController&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CustomEvent&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DOMException&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ErrorEvent&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Event&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;EventTarget&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;MessageEvent&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TextDecoder&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TextEncoder&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Worker&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ImportMeta&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Location&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Example: Build a simple HTTP Server using Deno 🚀
&lt;/h2&gt;



&lt;div class="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;Application&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;https://deno.land/x/oak/mod.ts&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="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Logger&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&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="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;next&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;rt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;X-Response-Time&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="nx"&gt;log&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="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;method&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="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;request&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="s2"&gt; - &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;rt&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="p"&gt;});&lt;/span&gt;


&lt;span class="c1"&gt;// Hello World!&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;ctx&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;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello World!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8000&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Let's run it using &lt;code&gt;deno server.ts&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Compile file:///.../server.ts
Download https://deno.land/x/oak/mod.ts
Download https://deno.land/x/oak/application.ts
Download https://deno.land/x/oak/context.ts
Download https://deno.land/x/oak/cookies.ts
Download https://deno.land/x/oak/httpError.ts
Download https://deno.land/x/oak/middleware.ts
Download https://deno.land/x/oak/request.ts
Download https://deno.land/x/oak/response.ts
Download https://deno.land/x/oak/router.ts
Download https://deno.land/x/oak/send.ts
Download https://deno.land/x/oak/types.ts
Download https://deno.land/x/oak/deps.ts
Download https://deno.land/x/oak/keyStack.ts
Download https://deno.land/x/oak/tssCompare.ts
Download https://deno.land/std@v1.0.0-rc1/http/server.ts
Download https://deno.land/std@v1.0.0-rc1/http/http_status.ts
Download https://deno.land/std@v1.0.0-rc1/http/cookie.ts
Download https://deno.land/std@v1.0.0-rc1/path/mod.ts
Download https://deno.land/std@v1.0.0-rc1/util/sha256.ts
Download https://deno.land/std@v1.0.0-rc1/testing/asserts.ts
Download https://deno.land/x/media_types@v2.0.0/mod.ts
Download https://deno.land/std@v1.0.0-rc1/encoding/utf8.ts
Download https://deno.land/std@v1.0.0-rc1/io/bufio.ts
Download https://deno.land/std@v1.0.0-rc1/util/async.ts
Download https://deno.land/std@v1.0.0-rc1/http/io.ts
Download https://deno.land/std@v1.0.0-rc1/io/util.ts
Download https://deno.land/std@v1.0.0-rc1/path/win32.ts
Download https://deno.land/std@v1.0.0-rc1/path/posix.ts
Download https://deno.land/std@v1.0.0-rc1/path/constants.ts
Download https://deno.land/std@v1.0.0-rc1/path/common.ts
Download https://deno.land/std@v1.0.0-rc1/path/constants.ts
Download https://deno.land/std@v1.0.0-rc1/path/interface.ts
Download https://deno.land/std@v1.0.0-rc1/path/glob.ts
Download https://deno.land/std@v1.0.0-rc1/path/globrex.ts
Download https://deno.land/std@v1.0.0-rc1/path/utils.ts
Download https://deno.land/std@v1.0.0-rc1/fmt/colors.ts
Download https://deno.land/std@v1.0.0-rc1/testing/diff.ts
Download https://deno.land/std@v1.0.0-rc1/textproto/mod.ts
Download https://deno.land/std@v1.0.0-rc1/bytes/mod.ts
Download https://deno.land/std@v1.0.0-rc1/datetime/mod.ts
Download https://deno.land/x/media_types@v2.0.0/db.ts
Download https://deno.land/x/media_types@v2.0.0/deps.ts
Download https://deno.land/std@v0.42.0/path/mod.ts
Download https://deno.land/std@v0.42.0/path/win32.ts
Download https://deno.land/std@v0.42.0/path/posix.ts
Download https://deno.land/std@v0.42.0/path/constants.ts
Download https://deno.land/std@v0.42.0/path/common.ts
Download https://deno.land/std@v0.42.0/path/constants.ts
Download https://deno.land/std@v0.42.0/path/interface.ts
Download https://deno.land/std@v0.42.0/path/glob.ts
Download https://deno.land/std@v0.42.0/path/globrex.ts
Download https://deno.land/std@v0.42.0/path/utils.ts
Download https://deno.land/std@v0.42.0/testing/asserts.ts
Download https://deno.land/std@v0.42.0/fmt/colors.ts
Download https://deno.land/std@v0.42.0/testing/diff.ts
Download https://deno.land/x/oak/encoding.ts
Download https://deno.land/x/oak/isMediaType.ts
Download https://deno.land/x/oak/mediaType.ts
Download https://deno.land/x/oak/mediaTyper.ts
Download https://deno.land/x/oak/util.ts
Download https://deno.land/x/oak/pathToRegExp.ts
error: Uncaught PermissionDenied: network access to "127.0.0.1:8000", run again with the --allow-net flag
    at unwrapResponse ($deno$/ops/dispatch_json.ts:43:11)
    at Object.sendSync ($deno$/ops/dispatch_json.ts:72:10)
    at Object.listen ($deno$/ops/net.ts:51:10)
    at listen ($deno$/net.ts:164:18)
    at Application.serve (server.ts:261:20)
    at Application.listen (application.ts:106:31)
    at server.ts:18:11
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Let's add the missing permission &lt;code&gt;deno --allow-net server.ts&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl http://127.0.0.1:8000
Hello World!
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;






&lt;p&gt;You are now ready for the upcoming release of Deno 1.0 - Stay tuned 😍 Please leave me comment if you've liked this article! You can also follow me on Twitter &lt;a href="https://twitter.com/loverdeolivier"&gt;@loverdeolivier&lt;/a&gt; 🙌&lt;/p&gt;

&lt;p&gt;This article was originally posted on my blog &lt;a href="https://olivier.codes"&gt;olivier.codes&lt;/a&gt; - &lt;a href="https://olivier.codes/2020/05/08/Deno-1-0-officially-scheduled-on-May-13-Review-of-the-features/"&gt;https://olivier.codes/2020/05/08/Deno-1-0-officially-scheduled-on-May-13-Review-of-the-features/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>node</category>
      <category>beginners</category>
    </item>
    <item>
      <title>ES2020: Summary of new features &amp; examples 🔥</title>
      <dc:creator>Olivier</dc:creator>
      <pubDate>Sun, 12 Apr 2020 15:57:20 +0000</pubDate>
      <link>https://dev.to/olivierloverde/es2020-summary-of-new-features-examples-2260</link>
      <guid>https://dev.to/olivierloverde/es2020-summary-of-new-features-examples-2260</guid>
      <description>&lt;p&gt;In this article, we’re going to review some of the latest and greatest features coming with ES2020. 🔥&lt;/p&gt;

&lt;h1&gt;
  
  
  🤠 Getting started
&lt;/h1&gt;

&lt;p&gt;We are going to test these features in a Node.js environment using Babel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method #1: creating a project from scratch
&lt;/h2&gt;

&lt;p&gt;Start by creating a new project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;es2020-tests
&lt;span class="nv"&gt;$ &lt;/span&gt;yarn init
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Now add &lt;code&gt;@babel/cli @babel/core @babel/node @babel/preset-env&lt;/code&gt; dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;yarn add &lt;span class="nt"&gt;--dev&lt;/span&gt; @babel/cli @babel/core @babel/node @babel/preset-env
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Create a &lt;code&gt;.babelrc&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"presets"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"@babel/preset-env"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Method #2: clone the source code repository
&lt;/h2&gt;

&lt;p&gt;You can also clone the following &lt;a href="https://github.com/olivierloverde/es2020-examples"&gt;GitHub&lt;/a&gt; repository that includes the setup and source code of the examples in this article.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git clone git@github.com:olivierloverde/es2020-examples.git
&lt;span class="nv"&gt;$ &lt;/span&gt;yarn &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  🤖 The ES2020 features
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Private variable in Class
&lt;/h2&gt;

&lt;p&gt;You can now declare a private variable in a class by using a hastag &lt;code&gt;#&lt;/code&gt;. If a private variable is called outside of its class It will throw a &lt;code&gt;SyntaxError&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;MyClass&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;privateVariable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello private world&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

    &lt;span class="nx"&gt;helloWorld&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="nx"&gt;info&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="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;privateVariable&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;myClass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;MyClass&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nx"&gt;myClass&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;helloWorld&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;// works&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;myClass&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;privateVariable&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// SyntaxError: Private field '#privateVariable' must be declared in an enclosing class&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/olivierloverde/es2020-examples/blob/master/examples/privateClassVariables.js"&gt;Source on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  BigInt
&lt;/h2&gt;

&lt;p&gt;There was a limitation on largest possible integer because of how Javascript represented number internally (it is using a 64-bit floating point, see &lt;a href="https://en.wikipedia.org/wiki/IEEE_754"&gt;IEE 754&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="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;maxInteger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;MAX_SAFE_INTEGER&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="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;maxInteger&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 9007199254740991&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;maxInteger&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 9007199254740992&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;maxInteger&lt;/span&gt; &lt;span class="o"&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;// 9007199254740992 ??&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;maxInteger&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 9007199254740994&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;maxInteger&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 9007199254741192 ??&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;maxInteger&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 1801439850948198100 ??&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/olivierloverde/es2020-examples/blob/master/examples/bigInt.js"&gt;Source on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now there is a native solution, BigInt is a built-in object that provides a way to represent whole numbers larger than 2⁵³ — 1, which is the largest number in JS  number).&lt;/p&gt;

&lt;p&gt;You can create a BigInt by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;creating a &lt;code&gt;BigInt&lt;/code&gt; object: &lt;code&gt;const value = BigInt(500)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;appending a &lt;code&gt;n&lt;/code&gt; to a number: &lt;code&gt;const value = 500n&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the moment, it cannot be used with methods in the built-in &lt;code&gt;Math&lt;/code&gt; object and cannot be operated with &lt;code&gt;Number&lt;/code&gt;. Bitwise operators are supported except &lt;code&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/code&gt; because all BigInts are signed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Using BigInt&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;maxIntegerBigInt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;BigInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;maxInteger&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="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;maxIntegerBigInt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 9007199254740991n&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;maxIntegerBigInt&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 9007199254740992n&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;maxIntegerBigInt&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 9007199254740993n &lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;maxIntegerBigInt&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 9007199254740994n &lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;maxIntegerBigInt&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 9007199254741191n&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;maxIntegerBigInt&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 1801439850948198200n&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/olivierloverde/es2020-examples/blob/master/examples/bigInt.js"&gt;Source on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Promise.allSettled()
&lt;/h2&gt;

&lt;p&gt;Promise.allSettled takes an array of &lt;code&gt;Promise&lt;/code&gt; object as argument and waits that all promises settle to return the corresponding result as an array of objects &lt;code&gt;{status, ?value, ?reason}&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="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;resolvingPromise1000ms&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reject&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;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&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;rejectingPromise2000ms&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reject&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;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2000&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;timeCheckpoint&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;now&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;allSettled&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="nx"&gt;resolvingPromise1000ms&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="nx"&gt;rejectingPromise2000ms&lt;/span&gt;
&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;elapsedTimeInMS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;timeCheckpoint&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="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Promise.allSettled resolved after &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;elapsedTimeInMS&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;ms`&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="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="cm"&gt;/*
Promise.allSettled resolved after 2006ms // ? not sure why we have 6ms
[
  { status: 'fulfilled', value: undefined },
  { status: 'rejected', reason: undefined }
]
*/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/olivierloverde/es2020-examples/blob/master/examples/promiseAllSettled.js"&gt;Source on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Nullish Coalescing Operator
&lt;/h2&gt;

&lt;p&gt;When you use &lt;code&gt;||&lt;/code&gt; operator, it returns the first argument to be &lt;code&gt;true&lt;/code&gt;. However, sometimes you a default value considered as &lt;code&gt;false&lt;/code&gt; such as &lt;code&gt;0&lt;/code&gt; or &lt;code&gt;""&lt;/code&gt;. To avoid it we can use the nullish coalescing operator &lt;code&gt;??&lt;/code&gt; like below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="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;object&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;car&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;speed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;
    &lt;span class="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="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;car&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;speed&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 90&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;car&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;speed&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 0&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// true&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;undefined&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;undefined&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// true&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 0&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// ""&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// []&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// []&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;({}&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// {}&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;({}&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// {}&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hey&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hey&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// true&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;info&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="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/olivierloverde/es2020-examples/blob/master/examples/nullishCoalescingOperator.js"&gt;Source on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Optional Chaining Operator
&lt;/h2&gt;

&lt;p&gt;Let's take the following object as an example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="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;person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Let's say we want to access a property on this object that we are not sure to have, we usually do:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if&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;city&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&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;city&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;locale&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="kc"&gt;undefined&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;cityLocale&lt;/span&gt; &lt;span class="o"&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;city&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;locale&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;This ensures the program does not throw any "error cannot read property name of undefined".&lt;/p&gt;

&lt;p&gt;Now with the optional chaining operator, we can be more concise:&lt;br&gt;
&lt;/p&gt;

&lt;div class="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="nx"&gt;info&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;city&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/olivierloverde/es2020-examples/blob/master/examples/optionalChainingOperator.js"&gt;Source on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Dynamic Import
&lt;/h2&gt;

&lt;p&gt;Dynamic &lt;code&gt;import()&lt;/code&gt; returns a promise for the module namespace object of the requested module. Thus, we can now use the &lt;code&gt;import()&lt;/code&gt; function with the &lt;code&gt;await&lt;/code&gt; keyword and assign the module namespace object to a variable dynamically.&lt;br&gt;
&lt;/p&gt;

&lt;div class="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;print&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&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="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;print&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/olivierloverde/es2020-examples/blob/master/examples/print.js"&gt;Source on GitHub&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="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;doPrint&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Print&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./print.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;Print&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;doPrint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Dynamic import works !&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;&lt;a href="https://github.com/olivierloverde/es2020-examples/blob/master/examples/dynamicImport.js"&gt;Source on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  String.prototype.matchAll
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;String.prototype.match&lt;/code&gt; gives an array of all matches between a string and a regexp.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="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;re&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;Mister &lt;/span&gt;&lt;span class="se"&gt;)\w&lt;/span&gt;&lt;span class="sr"&gt;+/g&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;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Mister Smith with Mister Galladon&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;matches&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;matchAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;re&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="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;matches&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Object [RegExp String Iterator] {}&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&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="nx"&gt;matches&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="cm"&gt;/*
[
  [
    'Mister Smith',
    'Mister ',
    index: 0,
    input: 'Mister Smith with Mister Galladon',
    groups: undefined
  ],
  [
    'Mister Galladon',
    'Mister ',
    index: 18,
    input: 'Mister Smith with Mister Galladon',
    groups: undefined
  ]
]
*/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/olivierloverde/es2020-examples/blob/master/examples/matchAll.js"&gt;Source on GitHub&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;You are now ready to use these new ES2020 features! Please leave me comment if you've liked it! 🙌&lt;/p&gt;




&lt;p&gt;This article was originally posted on my blog &lt;a href="https://olivier.codes"&gt;olivier.codes&lt;/a&gt; - &lt;a href="https://olivier.codes/2020/04/12/ES2020-Summary-of-new-features-with-examples/"&gt;https://olivier.codes/2020/04/12/ES2020-Summary-of-new-features-with-examples/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>es2020</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>node</category>
    </item>
    <item>
      <title>JAMstack: create a blog in 5min with automatic deployment using Hexo, GitHub Pages and GitHub Actions
</title>
      <dc:creator>Olivier</dc:creator>
      <pubDate>Sun, 29 Mar 2020 00:15:58 +0000</pubDate>
      <link>https://dev.to/olivierloverde/jamstack-create-a-blog-in-5min-with-automatic-deployment-using-hexo-github-pages-and-github-actions-5cag</link>
      <guid>https://dev.to/olivierloverde/jamstack-create-a-blog-in-5min-with-automatic-deployment-using-hexo-github-pages-and-github-actions-5cag</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;In this article, we are going to use the JAMSTACK and GitHub services in order to build and deploy a blog in 5 minutes and for free. We will also make the deployment automatic (for free too !).&lt;/p&gt;

&lt;h1&gt;
  
  
  Overview of the stack
&lt;/h1&gt;

&lt;h2&gt;
  
  
  The JAMSTACK
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Fast and secure sites and apps delivered by pre-rendering files and serving them directly from a CDN, removing the requirement to manage or run web servers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Source: &lt;a href="https://jamstack.org/"&gt;https://jamstack.org/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The general idea behing the JAMSTACK is to use a tool for pre-compiling all the pages of a website (a blog in our case) during build time and push it directly to a static server (such as Github Pages, a CDN, a S3 bucket, etc.). The tool will re-build the entire website everytime something change (new post blog for example).&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Hexo?
&lt;/h2&gt;

&lt;p&gt;We will use &lt;a href="https://hexo.io/"&gt;Hexo&lt;/a&gt; as our main generating tool:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A fast, simple &amp;amp; powerful blog framework&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Hexo provides a simple CLI for creating a blog. The CLI has the following features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creating a new page &lt;code&gt;hexo new page "about"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Creating a new blog post &lt;code&gt;hexo new post "Hello world"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Generating the static source &lt;code&gt;hexo generate&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Clean the static source &lt;code&gt;hexo clean&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  GitHub Pages
&lt;/h2&gt;

&lt;p&gt;We will use &lt;a href="https://pages.github.com/"&gt;GitHub Pages&lt;/a&gt; for hosting our website:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We can use a custom domain (cost 10$ on Gandi)&lt;/li&gt;
&lt;li&gt;Or we can use the domain offered by GitHub: https://.github.io&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  GitHub Actions
&lt;/h2&gt;

&lt;p&gt;We will use &lt;a href="https://github.com/features/actions"&gt;GitHub Actions&lt;/a&gt; so that any changes made to the Git Repository will trigger automatically a build of our blog and push it to GitHub Pages.&lt;/p&gt;

&lt;h1&gt;
  
  
  Getting started
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Setting up Hexo and repo
&lt;/h2&gt;

&lt;p&gt;First, clone Hexo and install it locally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ npm install -g hexo-cli
$ hexo init &amp;lt;folder&amp;gt;
$ cd &amp;lt;folder&amp;gt;
$ yarn install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Create a &lt;code&gt;.gitignore&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.DS_Store
Thumbs.db
db.json
*.log
node_modules/
public/
.deploy*/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;If you have a personal domain name, create a new empty GitHub repository named &lt;code&gt;&amp;lt;yourdomain&amp;gt;&lt;/code&gt; (e.g: olivier.codes)&lt;/p&gt;

&lt;p&gt;If you do not have a domain name, GitHub offers free .github.io subdomain. You will need to use your username: &lt;code&gt;&amp;lt;username&amp;gt;.github.io&lt;/code&gt; as name for your GitHub repository.&lt;/p&gt;

&lt;p&gt;The repository must be public in order to use GitHub Pages for free.&lt;/p&gt;

&lt;p&gt;Now link your local directory with the new GitHub repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ cd &amp;lt;folder&amp;gt;
$ git init
$ git remote add origin remote repository &amp;lt;URL&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Verify the new remote URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git remote -v
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;If you have used a personal domain name, you need to create a file named &lt;code&gt;CNAME&lt;/code&gt; in &lt;code&gt;source&lt;/code&gt;. It will be important for the deployment phase to GitHub Pages. The CNAME file should have the domain used in it :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;olivier.codes
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Push all codes to the repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git add -A
$ git commit -am 'First commit: Init Hexo'
$ git push
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;You can now see your blog locally at &lt;a href="http://localhost:4000"&gt;http://localhost:4000&lt;/a&gt; by running: &lt;code&gt;hexo server&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;You can build the static assets by running: &lt;code&gt;hexo generate&lt;/code&gt;, it will create a &lt;code&gt;public&lt;/code&gt; folder with all the pre-compiled files. We now need to generate the files automatically on each push and push the generated files to GitHub Pages so it's live online.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up automatic build
&lt;/h2&gt;

&lt;p&gt;Let's use GitHub Actions for automating the build step on every push to the git repository.&lt;/p&gt;

&lt;p&gt;GitHub Actions are defined by Workflow YAML file describing what to do and when to do it.&lt;/p&gt;

&lt;p&gt;Our YAML file should have the following steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Start a linux distribution (such as ubuntu)&lt;/li&gt;
&lt;li&gt;Install Nodejs LTS&lt;/li&gt;
&lt;li&gt;Load yarn cache if any (used for speeding up build time when yarn.lock do not changes)&lt;/li&gt;
&lt;li&gt;Install yarn dependencies (and use cache if any)&lt;/li&gt;
&lt;li&gt;Clean Hexo&lt;/li&gt;
&lt;li&gt;Generate Hexo files&lt;/li&gt;
&lt;li&gt;Push files to GitHub Pages&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Create a file for the workflow, it must bbe in &lt;code&gt;.github/workflows&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ touch .github/workflow/main.yml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Edit &lt;code&gt;main.yml&lt;/code&gt; and add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: Build and deploy
on: [push]
jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
        matrix:
            node-version: [12]
    steps:
        - uses: actions/checkout@v1
        - name: Use Node.js ${{ matrix.node-version }}
          uses: actions/setup-node@v1
          with:
              node-version: ${{ matrix.node-version }}
        - name: Get yarn cache directory path
          id: yarn-cache-dir-path
          run: echo "::set-output name=dir::$(yarn cache dir)"
        - uses: actions/cache@v1
          with:
              path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
              key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
              restore-keys: |
                  ${{ runner.os }}-yarn-
        - name: Install Dependencies
          run: yarn install --frozen-lockfile
        - name: Hexo Clean
          run: ./node_modules/.bin/hexo clean
        - name: Hexo Generate
          run: ./node_modules/.bin/hexo generate
        - name: Deploy to Github Pages
          uses: peaceiris/actions-gh-pages@v2.1.0
          env:
            ACTIONS_DEPLOY_KEY: ${{ secrets.DEPLOY_GH_KEY }}
            PUBLISH_BRANCH: gh-pages
            PUBLISH_DIR: ./public
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Every push on master will trigger this GitHub Action, it will generate the files and push it to &lt;code&gt;gh-pages&lt;/code&gt; branche on the repository.&lt;/p&gt;

&lt;p&gt;The newly created workflow needs a deploy key to be enable to push generated files to &lt;code&gt;gh-pages&lt;/code&gt; branche. The deploy key will be available to the workflow by using a GitHub Secret.&lt;/p&gt;

&lt;p&gt;We need to create a RSA key pairs for the deploy key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh-keygen -t rsa -b 4096 -C "&amp;lt;youremail&amp;gt;@gmail.com"
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--T7OMhrJG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://olivier.codes/images/deploykeys.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--T7OMhrJG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://olivier.codes/images/deploykeys.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to your repository on GitHub&lt;/li&gt;
&lt;li&gt;Go to Settings section&lt;/li&gt;
&lt;li&gt;Go to "Deploy keys" sub-section&lt;/li&gt;
&lt;li&gt;Add a new key by pasting the content of &lt;code&gt;id_rsa.pub&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vjxgFjz2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://olivier.codes/images/secrets.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vjxgFjz2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://olivier.codes/images/secrets.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, let's create the secret for our workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to your repository on GitHub&lt;/li&gt;
&lt;li&gt;Go to Settings section&lt;/li&gt;
&lt;li&gt;Go to "Secret" sub-section&lt;/li&gt;
&lt;li&gt;Create a new secret button&lt;/li&gt;
&lt;li&gt;Use the following name: &lt;code&gt;DEPLOY_GH_KEY&lt;/code&gt; as key&lt;/li&gt;
&lt;li&gt;Use the content of &lt;code&gt;id_rsa&lt;/code&gt; file (the secret key this time) as value&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We have :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Created a complete hexo setup&lt;/li&gt;
&lt;li&gt;Created a deploy key, saved it in GitHub using the public key&lt;/li&gt;
&lt;li&gt;Declared the corresponding private key in our secrets&lt;/li&gt;
&lt;li&gt;Created a workflow to automatically generate files on every git push and push them to &lt;code&gt;gh-pages&lt;/code&gt; branche&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let's test our new setup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git add -A
$ git commit -am 'Devops: Add build automation'
$ git push
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;You should now see the workflow running for the new commit:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_ik9HdUh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://olivier.codes/images/newcommit.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_ik9HdUh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://olivier.codes/images/newcommit.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Or in Actions section:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--86h54C4I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://olivier.codes/images/workflow.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--86h54C4I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://olivier.codes/images/workflow.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The workflow should pass, indicating a that files have been generated and push to the branche.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up GitHub Pages
&lt;/h2&gt;

&lt;p&gt;Our &lt;code&gt;gh-pages&lt;/code&gt; branche will be the home of our GitHub Pages.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WoysNRcU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://olivier.codes/images/pages.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WoysNRcU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://olivier.codes/images/pages.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's configure GitHub Pages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to your repository on GitHub&lt;/li&gt;
&lt;li&gt;Go to Settings section&lt;/li&gt;
&lt;li&gt;Go to Options sub-section&lt;/li&gt;
&lt;li&gt;Scroll down to &lt;code&gt;GitHub Pages&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Select &lt;code&gt;gh-pages&lt;/code&gt; in source&lt;/li&gt;
&lt;li&gt;Optionnaly, fill your custom domain if you have any and enforce HTTPS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is now LIVE ! Go to your custom domain or go to &lt;code&gt;&amp;lt;username&amp;gt;.github.io&lt;/code&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Summary
&lt;/h1&gt;

&lt;p&gt;You now have a fully working blog, deployed automatically everytime you push something on git!&lt;/p&gt;

&lt;p&gt;You can find more information about Hexo (adding theme, plugins, etc.) directly in their doc: &lt;a href="https://hexo.io/docs/"&gt;https://hexo.io/docs/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Full source code for this article is available here: &lt;a href="https://github.com/olivierloverde/olivier.codes"&gt;https://github.com/olivierloverde/olivier.codes&lt;/a&gt;&lt;/p&gt;

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




&lt;p&gt;It was my first dev.to post, I hope you liked it! :-)&lt;/p&gt;




&lt;p&gt;This article was originally posted on: &lt;a href="https://olivier.codes/2020/03/28/Jamstack-create-a-scalable-blog-in-5-minutes-for-free-and-with-automatic-deployment-using-Hexo-Github-Pages-and-Github-Actions/"&gt;https://olivier.codes/2020/03/28/Jamstack-create-a-scalable-blog-in-5-minutes-for-free-and-with-automatic-deployment-using-Hexo-Github-Pages-and-Github-Actions/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>jamstack</category>
      <category>devops</category>
      <category>github</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
