Yesterday I decided to take a look at Deno and how to get startet with it. Deno v1 was released roughly a week ago so I though I give it a try and have a look in how far I can make use of it in the near future.
My expectation to start with a new program is to install it easily via Homebrew. With Deno I was not disappointed since you can install it in a couple of different ways - including Homebrew - which is great. Installing was super fast 💪.
"Hello World" in Deno
To get started I did a simple Hello World example which is too simple to be
honest. Just create a TypeScript file like
hello.ts and add a log statement
You can now run this file with Deno by calling it from the console like this
deno run ./hello.ts
A real world example
Next up: Porting an existing application to Deno. So, I took the Warhol API which is an application that uses Express.js and TypeORM as well as some other packages. I carved out some piece that was easy to use and ported it to work with Deno.
First start, was't working well… But this was easy to fix: You need to add file endings to your local imports. It's one of the design mistakes Ryan Dahl did with Node.js, he says. This is a bummer, since TypeScript in VS Code starts to complain. I guess there is an easy way around which I was not willing to google.
With this fixed I needed to figure out how to run Express. It seems like you cannot just use Express the default way like you would in Node.js. But luckily there is already a package which works with Deno and is kind of similar to Express.
Switching out the
import-statement for Express, and boom there we go.
import * as express from "express";
import * as express from "https://raw.githubusercontent.com/NMathar/deno-express/master/mod.ts";
A note here: You might be better off using Denos build-in server like
Node which seams kind of easy to use. And then there is
Oak which is an alternative build on top of
Back to the project: In order to make
deno-express work, you need to opt-in to
two options for Deno when running it:
Deno is build with security in mind you need to explicitly allow certain
operations that access the operating system.
This returned some now errors which I would have loved to avoid since they were mostly type related. Anyway, here is a solution for one of those issues:
Reading environment variables
If you read environment variables using
process.env, for example
you must switch to use
Deno.env.get("NODE_ENV") which is a far prettier
process.env. As above you need to pass an option to allow
reading the env variables:
And with this (and 50 more bugs related to the issues outlined above) I was basically done. I just ran
deno run --allow-env --allow-net --allow-read src/index.ts
and 💥 the Express app is being served with Deno.
So, I am happy about how quickly Deno was up and running and porting the application was somewhat trivial. The feedback provided for the errors that I got was fantastic.
Do I see it in production over the next couple of months for one of my projects? Probably not. But if hosting services will support Deno in the future and the community grows I think there is a fair chance that it will become a replacement especially for TypeScript users.
Next up I will look at how to get a database connected and run TypeORM with Deno.