ウェブサイト検索

Denoとは何か、そしてそれはNode.jsとどう異なるのか?


Node.jsは、サーバーやローカルマシンで使用するための事実上のJavaScriptランタイムです。その人気、汎用性、そして強力なコミュニティによって支持されています。Denoは、Node.jsのいくつかの欠点に対処することを目指す新しいランタイムです。ここでは、Denoがどのように改善を図ろうとしているかをご紹介します。

基本

歴史的に見ると、JavaScriptはウェブに限定されていました。しかし、Node.jsのようなランタイムは、JavaScript開発者がターゲットにできる環境を拡大し、この言語でバックエンドシステムを構築することが可能になりました。

Node.jsとDenoは、Chromeブラウザで使用されるV8 JavaScriptエンジンの上に構築されています。Node.jsは2009年に設立され、Denoは2018年に登場しました。両プロジェクトはライアン・ダールによって作成されました。Denoは、最初の10年間からの教訓を活かしてNode.jsを再構築しようとするダールの試みです。

Denoは、設計段階からセキュリティを重視した軽量ランタイムの提供に焦点を当てています。また、JavaScriptの型付きスーパーセットであるTypeScriptに対する組み込みサポートも備えており、エコシステム全体でますます人気が高まっています。これにより、TypeScriptが提供する型保護を重視する人々にとって、Denoはより良い選択肢となります。

セキュリティと許可

Denoの前提の大部分はセキュリティに基づいています。これは、書かれている言語にも及びます: Node.jsとDenoの両方がV8を使用していますが、DenoはNodeのC++を避けて、より現代的なRust言語を選んでいます。Rustは同様のパフォーマンスレベルを提供しますが、より高い安全性を備えています。

Deno は、プロセスに提供される機能を制限する厳格な権限システムを特徴としています。アクセスが明示的に付与されるまで、ネットワーク、ファイルシステム、または外部環境にアクセスできません。それに対して、Node.jsで実行されたものは、3つすべてを自動的に使用できます。

アクセスが必要なスクリプトのオプトインプロセスでは、コマンドラインフラグやランタイムパーミッションのプロンプトを選択できます。フラグは非常に細かく設定できることがあります。

--allow-read=/tmp

特定のディレクトリへのファイルシステムアクセスを許可します。これにより、ユーザーや管理者はプログラムが必要とする最小限のアクセスレベルに制限することができます。

分散型パッケージ管理

好きか嫌いかは別として、npm(Nodeパッケージマネージャー)は、ほとんどの現代のJavaScript開発において不可欠な部分となっています。npmはNode.jsとは別のプロジェクトで、理論的にはDenoと一緒に配布される可能性もあります。しかし、Denoには含まれておらず、パッケージを使用するためのサポートもありません。

node_modules

ディレクトリ。

Node.js は CommonJS モジュールを好みます。これは、そのモジュールサポートが JavaScript 標準へのネイティブの ES6 モジュールの追加よりも前から存在していたためです。Deno は ES スタイルのインポートの使用を要求し、任意のリモート URL でのモジュールの使用を許可しています。

import {anExport} from "https://example.com/example-package/a-module.ts";

Denoは、プログラムを初めて実行するときにモジュールを自動的にダウンロードしてコンパイルします。その後、結果をキャッシュします。npm installと同様に、一度のダウンロードが行われれば、Denoプログラムはオフラインでも動作します。

このアプローチは、npmパッケージの中央集権的配布の代わりに選ばれました。Node.jsプログラムは通常、中央のnpmレジストリにあるソフトウェアに密接に結び付けられています。もしnpmが利用できなくなれば、世界中の開発者は依存関係を取得できなくなります。Denoは、モジュールをどこにでもホストすることを提唱し、任意のHTTP URIが受け入れ可能な「レジストリ」となります。

標準ライブラリとNode.js相互運用性

Deno には、コア開発チームによってレビューされた大規模な標準ライブラリが含まれています。標準ライブラリの各モジュールは、外部の依存関係がない独立したものです。このライブラリは、Deno のリリースとは独立してバージョン管理され、配布されます。サードパーティのモジュールと同様に、コード内でコンポーネントをインポートするには URL を使用する必要があります。

標準ライブラリ内のモジュールの1つは、Node.jsの互換レイヤーです。これにより、Nodeに含まれる多くの主要モジュールの実装が追加されます。これにより、Node向けに書かれたソフトウェアをDenoランタイムに移行することが容易になります。

Deno 1.15は2021年10月にリリースされ、Nodeとの互換性がさらに強化されました。新しいCLIフラグ--compatは、DenoにNodeが提供するすべてのグローバル変数を使用するように環境を設定するよう指示します。processのような組み込み機能はDenoではサポートされていませんが、--compatを使用することで、オプトイン方式で利用可能になります。

どちらを使用すべきですか?

DenoがNode.jsをすぐに、あるいはいつか置き換えることはなさそうです。Nodeは完璧ではありませんが、Denoが適切に強調しているように、膨大なコミュニティと非常に強い採用の利点があります。Node.jsからDenoへの移行は簡単ではありません;コアのJavaScriptは変わっていませんが、グローバル変数、標準ライブラリコンポーネント、およびパッケージ管理の違いを考慮する必要があります。

近い将来において、Node.jsはおそらく一般的なJavaScriptプログラムに最適な選択肢であり続けます。豊富なフレームワーク、ライブラリ、チュートリアルが利用可能です。また、Nodeは過去数年間で静止していたわけではなく、現在ではES6モジュールやトップレベルのawaitなどの言語機能に対する安定したサポートがあります。

Denoは、JavaScriptエコシステムの最前線で新しい一からのプロジェクトのためのより良い選択肢です。TypeScriptを使用している場合、分散型のパッケージ管理システムが必要な場合、または強力なセキュリティ管理が必要な場合、Denoがより適した選択肢です。

Denoは発表から3年の間に多くの関心と話題を集めましたが、まだ広範な現実世界での使用には至っていません。しかし、それはあなたがそれを使用すべきではないという意味ではありません。Denoは現在安定しており、強力な標準ライブラリに支えられています。

新しいプロジェクトそれぞれをNode.jsとDenoの特性に基づいて評価し、どちらを使用するか判断するのが最善です。すべてのコードベースに同じランタイムを使おうとすると、他のプラットフォームの強みを見逃す可能性があります。

要約

Denoは、Node.jsの元開発者による若いJavaScriptランタイムです。これはNodeの多くの短所に対応しており、中央集権的なパッケージ管理を避け、完全に分散型のモデルを採用し、細かいランタイムレベルの権限モデルを追加し、TypeScriptを第一級の市民として統合しています。

DenoはまだNode.jsと同じリーチを持っていないものの、次のプロジェクトにふさわしい競争者です。特にTypeScriptに切り替えたい場合や、セキュリティが重要な作業負荷を開発している場合には特に当てはまります。

Denoが積極的にNode.jsとの互換性を向上させている今、関心や採用が増え始める可能性があります。Denoチームは、既存のプロジェクトへの適切な移行経路を提供する可能性のある完全なNodeエミュレーションに向けて作業しています。

Denoのモメンタムは、TypeScriptエコシステムの強力な成長など、外的要因から最終的に生まれるかもしれません。Denoの標準ライブラリはTypeScriptで書かれており、プロジェクトにとっての重要性を示しています。Node.jsとTypeScriptはすぐに統合できますが、Nodeが実行できるJavaScriptにTypeScriptソースを変換するために、中間ビルドステージが必要です。Denoはフィードバックループを短縮し、初めからTypeScriptが統合された開発者体験を改善します。

関連記事: