デノとは?「より良い」Node.js

Node.jsは好きだが、そのパッケージマネージャーnpmは好きではない場合、またはNode.jsよりも安全なJavaScriptランタイム環境が必要な場合は、新しいオープンソースプロジェクトのDenoに関心があるかもしれません(Denoという単語はNodeのアナグラムです)。一方、本番環境でNode.jsを使用している場合は、ここに表示されるものは何もありません。先に進んでください。Denoはまだ「非常に開発中」です。

Denoは、ブラウザの外部でJavaScriptおよびTypeScriptコードを実行するためのプログラムです。これは、2009年にNode.jsプロジェクトを設立したRyan Dahlが主導した最新の取り組みであり、TypeScriptコンパイラーを含む2009年以降のJavaScriptの進歩に照らしてNode.jsを再考する試みです。Node.jsと同様に、Denoは本質的にGoogle V8 JavaScriptエンジンのシェルですが、Node.jsとは異なり、実行可能イメージにTypeScriptコンパイラが含まれています。

Denoと高度なJavaScript

Dahlによれば、2009年、JavaScriptにはNode.jsに役立つ機能がいくつか欠けていました。これらのいくつかは、ECMAScript(ES)標準の一部として長年にわたってJavaScriptに追加されており、TypeScriptはさらにいくつかに対応しています。

JavaScriptには本質的に永久にイベントとコールバックがありますが、特に非同期アクションを連鎖させたい場合は、かなり複雑なコードにつながる可能性があります。約束は構文をもう少し読みやすくします。 Apromiseは、非同期操作の最終的な完了または失敗を表す戻りオブジェクトであり、コールバックを関数に渡すのではなく、コールバックをアタッチできます。関数asyncを宣言すると構文がさらに単純化さawaitれ、関数内で使用して、promiseが解決するまで非ブロッキング方式で一時停止できるようになります。

Node.jsが作成されたとき、JavaScriptモジュールの事実上の標準はCommonJSでした。これは、npmがサポートするものです。それ以来、ECMAScript委員会は、jspmがサポートする別の標準であるESモジュールを公式に祝福しました。DenoはESモジュールをサポートしています。

型付き配列は、バイナリデータを処理するためのES6 APIであり、Node.jsが使用できたものです。バイナリデータのサポートがないため、Node.jsの設計に問題が発生しました。Denoは、生のバイナリデータを操作する必要がある場合に型付き配列を使用します。Node.jsは、ユーザーコードの型付き配列をサポートするようになりました。

TypeScriptは、プレーンJavaScript(ES3以降。構成可能)にコンパイルされるJavaScriptの型付きスーパーセットです。TypeScriptは、オプションのタイプ、クラス、およびモジュールをJavaScriptに追加し、大規模なJavaScriptアプリケーション用のツールをサポートします。(Anders Hejlsbergはこれを「スケーリングするJavaScript」と呼んでいます。)前述のように、Denoにはランタイムの一部としてTypeScriptコンパイラのイメージが含まれています。DenoにTypeScriptファイルを渡すと、最初にJavaScriptにコンパイルされ、次にV8エンジンに渡されます。

Node.jsの設計上の欠点

結局、Node.jsとDenoの両方を設計したDahlによると、Node.jsには3つの主要な設計上の問題があります。

  • 一元化された配布を備えた、不十分に設計されたモジュールシステム。
  • サポートする必要のある多くのレガシーAPI。
  • そしてセキュリティの欠如。

Denoは3つの問題すべてを修正します。 

Denoの安全な実行

DenoがNode.jsのセキュリティを向上させる方法は簡単です。デフォルトでは、Denoはプログラムにディスク、ネットワーク、サブプロセス、または環境変数へのアクセスを許可しません。これらのいずれかを許可する必要がある場合は、コマンドラインフラグを使用してオプトインできます。コマンドラインフラグは、たとえば、--allow-read=/tmpまたはなど、好きなだけ細かく設定できます--allow-net=google.com。Denoのもう1つのセキュリティ上の改善点は、Node.jsとは異なり、キャッチされていないエラーで常に停止することです。Node.jsは、キャッチされていないエラーの後に実行を続行できるため、結果が予測できない場合があります。

Denoモジュール

Node.jsでは、requireキーワードを使用してCommonJSモジュールをロードします。これらはすべて、標準およびサードパーティを問わず、暗黙的にnpmjs.comから取得されます。Denoでは、importキーワードを使用してESモジュールをロードし、URLを明示的に記述します。例えば:

import * as log from "//deno.land/std/log/mod.ts";

Denoモジュールはどこでもホストできます–サードパーティモジュール用の集中リポジトリはありません。さらに、モジュールは常にローカルにキャッシュおよびコンパイルされ、明示的に更新を要求しない限り更新されません。したがって、接続のない飛行機に乗っている場合でも、すべてのインポートが一度解決されている限り、すでにラップトップにあるDenoプログラムを実行できるはずです。

Denoには、外部依存関係がなく、Denoコアチームによってレビューされる標準モジュールの集中コレクションがあります。それはdeno.landサーバー上にあります。deno_stdモジュールコレクションは、Goの標準ライブラリのルーズポートです。

ライブラリのモデルの選択の背後には、少し歴史があります。Dahlは主にGo言語でDenoのプロトタイプを作成しましたが、GoとV8のガベージコレクター間の潜在的な競合を発見しました。その後、彼と彼の共同研究者は、V8、Rust、およびRust非同期I / OパッケージTokioを使用してDenoを適切に書き直しました。彼らはTypeScriptでDeno標準ライブラリを実装しました。

この時点で、Denoは、TypeScriptで小さなプライベートスクリプトプロジェクトを構築するために使用するのに合理的で楽しい環境です。Dahlによると、DenoがNode.jsの成功に実際に影響を与えることは決してありません。それでも、Denoがバージョン1.0に達すると、より大きなプロジェクトを構築するための実行可能な選択肢になる可能性があります。