Tutorial Advent Calendar 2020 16日目。
開発担当の岩渕です。普段はNode.jsを使って開発を行っています。
皆さんは「Deno」をご存知でしょうか?
今回は将来Node.jsに取って代わる可能性を秘めたDenoを紹介させていただきます。
Denoを一言でいうと
Node.jsの開発者ライアン・ダールによって開発されたJavaScriptとTypeScriptのセキュアなランタイムです。
サクッとDenoを試してみる
サクッとDenoを試す方法を紹介します。想定している環境はMac+Homebrewです。
その他の方は、READMEを参考にしてください。
1. インストール
$ brew install deno
2. 実行
$ deno run https://deno.land/std/examples/welcome.ts
=> Welcome to Deno 🦕
Node.jsとの比較
Githubのスター数
2020/12/13 時点での比較です。
Node.js 75.3 k
Deno 70.3 k
かなりの勢いでDenoのスター数が増えています。この勢いが続けば来年にはNode.jsのスター数を超えそうです。このスター数からDenoがどれだけ人気なのかがわかります。
標準でTypescriptが使える
標準でTypescriptを利用できます。Node.jsとの違いの中で一番分かりやすい違いかもしれません。
$ deno run https://deno.land/std/examples/welcome.ts
=> Welcome to Deno 🦕
非同期処理はPromiseを返す
Denoでは非同期処理はPromiseを返すよう設計されています。またChromeのDevToolsのコンソールのようにトップレベルでAwaitが使えます。
ファイルへデータを書き込む非同期処理の関数writeFileについて比較してみます。Node.jsのwriteFileはPromiseを返さないので、処理後に何かしたい場合はコールバック関数を渡す必要があります。しかし、DenoのwriteFileはPromiseを返すのでコールバック関数は必要ありません。
Node.js
const data = new Uint8Array(Buffer.from('Hello Node.js'));
fs.writeFile('hello.txt', data, (err) => {
console.log('ファイルへの書き込み完了');
});
参考:https://nodejs.org/dist/latest-v14.x/docs/api/fs.html#fs_fs_writefile_file_data_options_callback
Deno
const encoder = new TextEncoder();
const data = encoder.encode("Hello Deno");
await Deno.writeFile("hello.txt", data);
console.log('ファイルへの書き込み完了');
参考:https://doc.deno.land/builtin/stable#Deno.writeFile
デフォルトでネットワーク、ファイルへのアクセスが禁止されている
Denoが"セキュア''なランタイムと言われている理由がこれです。ネットワークやファイルへのアクセスをする時は必ず実行時にフラグを立てる必要があります。
以下のようにフラグなしでネットワークへアクセスするファイルを実行するとPermissionDeniedエラーが発生します。
request.ts
const response = await fetch('https://example.com');
console.log(response.status)
フラグなしで実行する
$ deno run request.ts
=> error: Uncaught (in promise) PermissionDenied: network access to "https://example.com/", run again with the --allow-net flag
at processResponse (core.js:223:11)
at Object.jsonOpAsync (core.js:240:12)
at async fetch (deno:op_crates/fetch/26_fetch.js:1274:29)
at async file:///home/iwabuchi/Projects/deno/request.ts:1:18
--allow-net を使って実行する
$ deno run --allow-net request.ts
=> 200
パッケージ管理、テスト、フォーマッター、全部Denoに組み込まれている
Denoにはパッケージ管理、テスト、フォーマッター、リントなどの機能が組み込まれています。Deno自身のバージョン管理も可能なので、バージョン切り替えも簡単です。
実際にフォーマット機能を使ってみました。
request.ts (フォーマット前)
const response =
await fetch("https://example.com"
)
console.log(response. status
)
フォーマットを実行
$ deno fmt request.ts
request.ts (フォーマット後)
const response = await fetch("https://example.com");
console.log(response.status);
Denoの今後について
僕個人としては、DenoがNode.jsに取って代わる可能性は十分にあると思います。
しかし、まだフェーズ的にもプロダクトで使える技術ではないので直近ではDenoが使われる場面は少ないかと思いました。今後もDenoの動向には注視していきたいです。