Deno の時代はやってくるのか?


2020年9月28日

皆さんこんにちは末ちゃんです。

最近会社のMacのストレージ容量が限界に達して、Xcodeのインストールすらできなくなりました。
ちなみに本気で容量限界が来ると、Photoshopすら動きません(キャッシュの問題)

仕方がないので、アーカイブに放り込んで良さそうなプロジェクトを精査して外に放り出すなり、ローカルリポジトリを削除しました。

そのときそういったプロジェクトのnode_modulesを一気に削除したのですが、これだけで数十GBもあってびっくりしました。
たまには整理してあげないといけないですね。

Denoとは

Denoとはnode.js開発者のライアン氏による、新しいJavaScriptあるいはTypeScriptランタイムです。

node.jsの10の設計ミス(YouTube)

node.js開発者のライアン氏はこれらの問題や、そもそもnode.jsの設計が古い(2009年)こともあり、Denoをリリースしました。

Deno 公式サイト

まだまだnode.jsがメインとなっていて、Denoに切り替わることは当面はないでしょう。
Ver1.0のリリースが2020年5月と非常に新しいこともあり、プロダクション環境に放り込まれるには時間がかかるはずです。
しかし、2〜3年もすれば、node.jsとDenoのシェアが50:50になっていたりするかもしれませんね。

今回は試しにウェブサーバーを立ち上げるだけのプロジェクトで、node.js と Deno を試してみたいと思います。

Node.js でウェブサーバーを立ち上げてみる

まずはプロジェクトを立ち上げましょう。

$ yarn init -y

サーバーを立ち上げるためのファイルを記述します。

// server.js
const http = require('http');

const server = http.createServer(function(req, res) {
   res.writeHead(200, { 'ContentType': 'text/plain' });
   res.end('Hello Node.js');
});

server.listen(3000);

ではサーバーが正常に稼働するか確かめてみましょう。

$ node server.js

実際にブラウザでチェックすると正常に動作していました!

Screen Shot 2020-09-28 at 11.33.38

Denoでウェブサーバーを立ち上げてみるう

では次にDenoを試してみましょう。

まずはプロジェクトを立ち上げ…る必要はありません。
DenoはNode.jsみたいにinitしてpackage.jsonを作る必要がありません。

Denoがインストールされていれば、そのまま実行できます。

ということでサーバーを立ち上げるファイルを書きます。このコードは公式からコピーしてきています。

// server.js
import { serve } from "https://deno.land/std@0.71.0/http/server.ts";
const s = serve({ port: 8000 });
console.log("http://localhost:8000/");
for await (const req of s) {
  req.respond({ body: "Hello World\n" });
}

早速実行してみます。

$ deno run server.js

おっとエラーが返ってきました。

Download https://deno.land/std@0.71.0/http/server.ts
Download https://deno.land/std@0.71.0/encoding/utf8.ts
Download https://deno.land/std@0.71.0/io/bufio.ts
Download https://deno.land/std@0.71.0/_util/assert.ts
Download https://deno.land/std@0.71.0/async/mod.ts
Download https://deno.land/std@0.71.0/http/_io.ts
Download https://deno.land/std@0.71.0/textproto/mod.ts
Download https://deno.land/std@0.71.0/http/http_status.ts
Download https://deno.land/std@0.71.0/async/deferred.ts
Download https://deno.land/std@0.71.0/async/delay.ts
Download https://deno.land/std@0.71.0/async/mux_async_iterator.ts
Download https://deno.land/std@0.71.0/async/pool.ts
Download https://deno.land/std@0.71.0/bytes/mod.ts
Check file:///PATH/TO/test/deno/server.js
error: Uncaught PermissionDenied: network access to "0.0.0.0:8000", run again with the --allow-net flag
    at Object.jsonOpSync (core.js:247:13)
    at opListen (deno:cli/rt/30_net.js:32:17)
    at Object.listen (deno:cli/rt/30_net.js:207:17)
    at serve (server.ts:287:25)
    at file:///Users/whiteboard/public_html/test/deno/server.js:2:11

Denoはデフォルトではファイル、ネットワーク、環境変数等にアクセスすることができません。非常に好感を持てますね。
これを許可するために--allow-netフラグを付与して実行します。

$ deno run --allow-net server.js

ブラウザにアクセスすると、正常に実行されていました!

Screen Shot 2020-09-28 at 11.52.20

まとめ

TypeScriptがデフォルトでサポートされていることや、CommonJSではなくES Moduleが使用できるだけでも非常に嬉しいですね。

その他にも多数のより便利な機能が実装されているので興味がある方は是非試してみてください。

ちなみにそれぞれのプロジェクトディレクトリの容量は、node.jsが20KB、Denoが4KBでした。

開発者体験がよくなるのは歓迎ですね!これからの動向に期待です。

Share Button