TypeScriptの実行環境 Deno を動かしてみる
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の動作確認ができました。
まだまだ足りない機能やバグもありますが、
今後注目のプロダクトです。