Node.js
deno

Deno について知っていることと、今後への期待 v1811

本稿は概要レベルなので、技術的な内容については以下をおすすめします


Node.js の開発者である Ryan によって Deno というプロダクトが開発されていることが知られて結構経ちます。
しかし、当初に比べ名前をあまり見かけなくなってきたように感じます。

Deno とはなんなのか、そして、今後何をしてくれる存在なのか、についてまとめたいと思います。

なぜ Ryan が Deno を開発したのかについては、会長のブログ Node.js における設計ミス By Ryan Dahlに詳しく書いてあります。

Deno とは TypeScript コードを V8 で実行するためのランタイムである

Deno のリポジトリには以下の通り書いてあります。

A secure TypeScript runtime built on V8

TypeScript を V8 で実行するための間のランタイム、という感じのようです。

セキュアであることを目的としており、 sandbox の中で V8 を呼ぶということをしています。
昨今の JS コミュニティでのセキュリティ問題に対した側面もあるかと思います。

言語仕様としては、 一部 Node.js との互換を切り捨て、以下のようになっています。

  • npm 無し、 package.json 無し
  • URL による外部ライブラリ参照
  • 単一実行ファイルへのビルド

上記のブログでも package.json は余計な混乱をもたらした、と書いてあります。
また、 node_modules 以下が暗黙にスコープに含まれていることも仕様から外れ、 Go のように URL で指定するようになっています。

加えて、特徴的な文法としては以下の2点を目指していると書かれています。

  • Uncaught Error は必ず落ちる
  • top level await

これは非同期プログラミングを前提とした言語モデルを目指しているように見えます。

Browser Compatible な Deno とは

上記の通り Deno は V8 をラップしたランタイムでありますが、同時にブラウザでの動作も目指しているようです。

これはどのようなことか考えると、以下のうちのどれかなのではないかと思います。

  • Deno 言語独自の仕様を TypeScript にコンパイルし、既存のエコシステム(webpack/ts-loader)を用いてブラウザ上で動作させる
  • 直接ブラウザで動く(効率化された) JS を吐き出す
  • ServiceWorker で動く Deno の開発
  • ブラウザへの標準実装

一番現実的、かつコミュニティが参加しやすいのは1つ目ですが、 ユーザは JS のエコシステムとは独立して実行可能というところで、2つ目のようになるのを期待します。

Deno への期待

TypeScript によるバックエンド/システムプログラミング

現状 V8 は十分な速さを持っており、システムプログラミングでも使える性能となってきていると思います。

現在ではサーバサイドでの採用は BFF としてが多いように感じますが、 Deno の進化によっては、現在の Go のような「ライトに」「かつ型安全に」というユースケースにおいて活躍できるのではないかと期待しています。

より厳密な型

現在の TypeScript は型定義が非常にゆるく、例えば数値は Number と大雑把に扱われています。

TypeScript のコンパイラとしては AssemblyScriptという処理系が存在しますが、そちらは WebAssembly に落とし込めるよう、 TypeScript より厳しい型を要求します。
具体的には any や null 以外との UNION の禁止、 undefined の禁止、Number の細分化などです。

Deno も独自のランタイムとして成熟していくのであれば、 TypeScript 標準の仕様を外れた、 Deno として提供される型定義や最適化等にも期待できるのではないでしょうか。

フロントエンドでの採用

現状フロントエンドで TypeScript を採用する場合は、 TypeScript からのコンパイルと 1ファイルへのバンドルをどちらも行わないといけません。

このような複雑なエコシステムへの理解を、 Deno による 1ファイル出力がフロントエンドでも行われることで解決してくれることに期待したいところです。

Google との結託

Chrome に Deno エンジンが組み込まれ、ブラウザで直接動くなどなると夢がありますね!!!!!!

個人的には愛用しているフレームワークである Angular が TypeScript 標準であることもあり、 Deno の恩恵を受けられるようになると嬉しいです。

最後に

Deno はまだまだ始まったばかりの処理系で、正直普段 Node.js を使っているレイヤーのエンジニアにとっては触れがたい分野に感じるところが多いと思います。

しかし、 Deno を使って TS のコードを動かしてみたり、パフォーマンスがどうなるか見る等は比較的やりやすいかと思います。(まずビルドのハードルが高いのですが……)

まだまだ Ryan の主導という流れは続くかと思いますが、コミュニティとしても Deno に注目し、少しでも貢献できれば、またそのような人が増えれば、と思います。

$ npm xmas

                     ★
                    /\
                   /  \
                  / ⁂  \
                 /      \
                /。 i   。⸛\
               /  ⸛ 。    @\
              /      &@   &\
             /       ⸛ ⁂@⸛@&\
            /   ⁂⸛ i    。。   \
           /   @ @ i   i& @  ⁂\
          /⸛&   @ 。⁂       ⸛   \
         /          。i ⁂  i  ⸛ @\
        /⁂   @ @ ⸮ 。⁂    。i    ⸛ \
       /⸮⸮      &    。  ⁂       ⁂&\
      /  i@⸮⸮&⸮@&   ⸮   @⁂    。 。。&\
     /     @   @@@  @⁂   。    ⁂i。  ⸮\
    /  ⸮ &     ⸮。⸛ @       i@@&   &  \
   /⸛i     。。  @        i@。& 。i i   ⸮⁂\
  /    ⸛  @  ⁂  @ ⁂  ⁂  @   i⸛ &⸛ &    \
 /。 @⸮      ⸮  ⁂      &  ⸛i@  ⸛   @  ⁂  \
 ^^^^^^^^^^^^^^^^^^^|  |^^^^^^^^^^^^^^^^^^^
                    |  |

npm loves you Happy Xmas, JavaScripters!