Denoでいーの?

Denoとは?

Deno(ディノ)とは、Node.jsの開発者であるRyan Dahl 自身によって作られた、新しいJavaScriptとTypeScriptのランタイム環境 です。

実行は、V8 (JavaScriptエンジン)を使って行われ、Rustを使って開発が進められています。

Node.jsには、いくつかRyan Dahlが感じていた課題がありました。

Node.jsのコアにPromiseがないことによる、非同期処理体験の悪化などは、コールバックループに苦しめられた方などは覚えがあるかと思います。

node_modulesは処理の都合上生成される実態ファイルがどうしても重くなってしまい、それはブラックホールよりも重いなど揶揄されています。

画像1

参考: https://tinyclouds.org/jsconf2018.pdf

そんないくつかの課題を解決すべく作られたのがDenoになります。

特徴としては、以下のようなことが挙げられます。

セキュリティ

Denoはデフォルトでセキュアです。ファイル、ネットワーク、環境変数へのアクセスを行うためには、実行時に明示的に権限を与える必要があります。
例えば、ネットワークへの接続を行う場合は下記のように実行します。

deno run --allow-net index.ts

もし権限を明示的に与えず実行した場合は、下記のようなエラーが返ります。

画像2

Promise

Denoの全ての非同期処理は、デフォルトでPromiseを返します。
top level awaitで記載でき、コールバックループの苦しみから解放されます。
シンプルなAPIへのfetchであれば下記のように書けます。

const response = await fetch('https://xxxxx');
const data = await response.json();
console.log('data ->', data);

TypeScriptビルトイン

DenoはデフォルトでTypeScriptをサポートしているため、別途セットアップなどはせず、そのまま利用できます。

モジュールシステムのシンプル化

require()を廃止し、ES Modulesに統一しました。importは相対パスか絶対パス、もしくはURLだけでしか指定できません。
golangみたいにURL直接指定で取るため、importしたいものだけをシンプルに拾ってくることができます。
これによりnpmパッケージは不要になります。逆にいうと、Node.js時のライブラリとの互換性は取れなくなっています。

import { test } from "https://unpkg.com/deno_testing@0.0.5/testing.ts"
import { log } from "./util.ts"

標準モジュールとサードパーティモジュール

DenoはDenoのメンテナによってレビューされ、動作保証されたモジュールを標準モジュールとしてdeno/std に一覧として提供されています。

また、deno.land/x にgithub上に公開されているDenoのサードパーティモジュールを一覧化しており、スター順などで並んでいるため、必要なライブラリはこちらから探すと良いでしょう

インストール

インストール方法はシンプルです。

公式サイトにまとまっていますが、brew(Mac)だと下記のようにインストールできます。

$brew install deno

使い方

これも公式のままですが、例としてサーバを8080で立てる場合を記載します。

// hoge.ts
import { serve } from "https://deno.land/std@0.73.0/http/server.ts";
const s = serve({ port: 8000 });
console.log("Listening on http://localhost:8000/");

for await (const req of s) {
req.respond({ body: "Hello World\n" });
}

実行します。

スクリーンショット 2020-10-08 0.03.59

ブラウザで無事表示できました。

スクリーンショット 2020-10-08 0.05.13

Denoはいいのか?

タイトルはただ言いたかっただけなのですが、良いかどうかで言うと、npmの恩恵を受けられないというネックなどもあり、プロダクションで扱われるようになるには、もう数年はかかりそうです。

とはいえ、Node.jsの作者自身がNode.jsの欠点を見直して作成しているものになるので、Deno周りのライブラリが整ってきたり、Node.jsの代替としてフロントエンドエコシステムとの親和性などが取れてきたりすれば選択として入ってくるだろうなぁという印象です。

開発者の皆様は是非使ってみてください。

この記事が気に入ったらサポートをしてみませんか?