AWS Open Source Blog

What is Deno?

Deno 1.0, a runtime for JavaScript and TypeScript, rolled out in May with appealing features for JavaScript developers, including:

  • Secure defaults: Explicit permission must be granted for your Deno applications in order to access disk, network, and runtime environments.
  • Native TypeScript support: No tsconfig needed—Deno acts like a native TypeScript runtime. Under the hood Deno still transpiles and bundles TypeScript files.
  • Ability to import ES Modules directly from URLs: No more NPM—dependencies can be imported directly via URL or file path:
import toUpperCase from 'https://flavio-es-modules-example.glitch.me/uppercase.js';

Deno’s approach to ES Modules is generating a lot of debate around package management, especially concerning security. For example, will this prevent another left-pad incident? Regardless of your gut reaction, I highly recommend reading the docs.

I think the explicitness of import-from-URL will make developers think carefully about dependency management; however, I suspect many teams will handle this problem similarly to how they handle npm: with lock files, proxies, and white-listed internal registries.

Deno also includes less-cited features that I’m excited about:

Enough talk, let’s take Deno for a spin by building a simple web app:

import { serve } from "https://deno.land/std@0.50.0/http/server.ts";

const s = serve({ port: 8000 });
console.log("http://localhost:8000/");
for await (const req of s) {
  if (req.url.startsWith("/ping")) {
    req.respond({ status: 200, body: "pong" });
  } else if (req.url.startsWith("/hi")) {
    req.respond({ status: 200, body: "hello there." });
  } else {
    req.respond({ status: 404, body: "Not Found." });
  }
}

This demo uses the HTTP standard library and handles two routes: /ping and /hi. Note the use of for await … of without an enclosing async IIFE. Install Deno, then run:

# run locally
deno run demo.ts 

# run from remote URL
deno run https://gist.githubusercontent.com/robzhu/ef4e76d27ca50a920a9e5b4aebb40ab9/raw/6bef3fa5eb6bca5f439c3fde75ce2e39cf4cd451/demo.ts

Either way, you should see an error:

error: Uncaught PermissionDenied: network access to "0.0.0.0: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:152:22)
    at serve (https://deno.land/std@0.50.0/http/server.ts:261:20)
    at https://gist.githubusercontent.com/robzhu/ef4e76d27ca50a920a9e5b4aebb40ab9/raw/6bef3fa5eb6bca5f439c3fde75ce2e39cf4cd451/demo.ts:3:11

Since this is an HTTP server, we need to grant explicit permissions for network access:

# run locally
deno run --allow-net demo.ts 

# run from remote URL
deno run --allow-net https://gist.githubusercontent.com/robzhu/ef4e76d27ca50a920a9e5b4aebb40ab9/raw/6bef3fa5eb6bca5f439c3fde75ce2e39cf4cd451/demo.ts

Now you should be able to test your server by navigating to http://localhost:8000/hi. So far so good, but that URL is quite long: Is there an easy way to install it as a script?

deno install --allow-net -n denohttp https://gist.githubusercontent.com/robzhu/ef4e76d27ca50a920a9e5b4aebb40ab9/raw/6bef3fa5eb6bca5f439c3fde75ce2e39cf4cd451/demo.ts

# run the script:
denohttp

I hope this post has given you an overview of Deno.

Deno is released under the MIT License. Learn more in the Deno GitHub repository or visit the Deno website.

Robert Zhu

Robert Zhu

Robert Zhu is a Principal Developer Advocate at Amazon Web Services. He focuses on APIs, Web, Mobile, and Gaming. Prior to joining AWS, he worked on GraphQL at Facebook. While at Microsoft, he worked on the .net Framework, Windows Server, and Microsoft Game Studios. In his spare time, he loves learning about history, economics, and psychology. You can reach him @rbzhu on twitter or directly via telepathy.