TypeScriptの実行環境 Deno を動かしてみる

2020.04.06

What is Deno?

DenoはV8 JavaScriptエンジンで動作するセキュアなTypeScript/JavaScript実行環境です。
Node.jsの作者であるRyan Dahl氏によって、Node.jsの設計で失敗した部分を見直して作成されました。

いままでのバージョンは0.xでしたが、5月に1.0が出るらしいです。

Why Deno?

Denoは、2018年にRyan Dahl氏が行った講演「Node.jsに関する10の反省点」で初めて発表されました。

Ryan Dahl氏はこの講演で、Node.jsの初期設計段階での選択ミスについて言及しています。

  • promise APIを使用しないという選択をしたこと
  • GYPビルドシステムを採用したこと
  • モジュール設計についてのあれこれ
  • V8はsecureなサンドボックス環境を提供してるのにNode.jsときたら

など。
ここがとてもわかりやすいです

そして、この講演でDenoを発表しました。Denoは上記問題を解決することを目指しています。
なお、Denoは最初Goで実装していましたが、いろいろあってRustで再実装されたとのことです。
また、Denoは実行環境とパッケージ管理システムの両方の役割を持っているので、
別途パッケージ管理システムは必要ありません。(ex.Node.jsとnpm)

参考
* Deno wiki
* Node.js における設計ミス By Ryan Dahl

Deno differences from Node.js

ここにあるとおり、DenoがNode.jsと違う部分は下記のようになっています。

  • Denoはnpmを使用せず、URLまたはファイルパスとして参照されるモジュールを使用
  • Denoは、モジュール解決アルゴリズムでpackage.jsonを使用しない
  • Denoのすべてのasyncアクションはpromiseを返す。(DenoはNodeとは異なるAPIを提供)
  • Denoでは、ファイルアクセス、ネットワーク通信、およびシステム環境へのアクセスに明示的な権限が必要
  • Denoはuncaught errorsが発生したら落ちる
  • require()はサポートせず、かわりにES Modulesを使う。サードパーティのモジュールは、URLを介してインポートする
import * as log from "https://deno.land/std/log/mod.ts";

環境

今回使用した動作環境は以下のとおりです。

  • OS : MacOS X 10.15.1
  • deno : 0.39.0

setup Deno

MacならHomebrewで簡単にインストールできます。
公式サイトにはcurl使ったりiwr使ったりする方法も書いてあります

% brew install deno

denoコマンドでversion表示できればインストールOKです。

% deno --version
deno 0.39.0
v8 8.2.308
typescript 3.8.3

プログラムを実行してみましょう。
https://deno.land/std/examples/にはwelcome.tsファイルが下記内容でおいてあります。

//welcome.ts
console.log("Welcome to Deno ?");

denoコマンドでURLを指定してそのまま実行できます。

% deno https://deno.land/std/examples/welcome.ts
Compile https://deno.land/std/examples/welcome.ts
Welcome to Deno ?

denoコマンドを実行すればREPLが起動。

% deno
> const x = 10
undefined
> x
10

もちろん、ローカルにファイルを作成してそのまま実行することもできます。
echo_server.tsという名前で↓のようなファイルを作成してみましょう。

const listener = Deno.listen({ port: 8080 });
console.log("listening on 0.0.0.0:8080");
for await (const conn of listener) {
  Deno.copy(conn, conn);
}

denoコマンドでecho_server.tsを実行してみます。

% deno echo_server.ts
Compile file:///path/your/echo_server.ts
error: Uncaught PermissionDenied: network access to "127.0.0.1:8080", run again with the --allow-net flag
► $deno$/ops/dispatch_json.ts:43:11
    at PermissionDenied ($deno$/errors.ts:81:5)
    at unwrapResponse ($deno$/ops/dispatch_json.ts:43:11)
    at sendSync ($deno$/ops/dispatch_json.ts:72:10)
    at listen ($deno$/ops/net.ts:50:10)
    at listen ($deno$/net.ts:168:18)
    at file:///path/your/echo_server.ts:1:23

このプログラムはネットワークアクセスをおこなっているので、明示的に権限を与える必要があります。
--allow-netオプションを追加して実行してみます。

% deno --allow-net echo_server.ts
listening on 0.0.0.0:8080

無事動いてます。

% nc localhost 8080
hello
hello

これでDenoの動作確認ができました。
まだまだ足りない機能やバグもありますが、
今後注目のプロダクトです。

外部リンク