Deno を学び、Node.js を超える
公開: 2023-04-20Node.js は依然として最も使用されているサーバー側 JavaScript ランタイムですが、Deno や Bun などの代替ランタイムは、Node.js の概念を改善しようとして注目を集めています。
2 つの新しいランタイムのうち、より人気のある Deno は、Node.js に固有のいくつかのセキュリティ問題に対処し、TypeScript や WebAssembly などのテクノロジをより包括的にサポートします。
この記事では、Deno の基本を探り、それが Node.js や Bun とどのように比較されるかを学び、Deno を使用して単純な HTTP Web サーバーを構築する実践的なデモンストレーションに従います。
デンノとは?
開発者が JavaScript に慣れてくると、ローカル マシンでのプログラミングの可能性が見えてきました。 そこで、彼らはサーバーサイド ランタイムを作成しました。これは、ブラウザーを使用せずにマシン上で JavaScript コードを実行できる環境です。
Ryan Dahl はこの目的のために Node.js を開発し、その後、元の Node.js 設計で遭遇したいくつかの問題に対処するために Deno を作成しました。 いくつかの注目すべき欠陥には、npm のような集中型パッケージ マネージャーへの依存、標準ライブラリの欠如、およびデフォルトで緩いセキュリティ設定が含まれます。
Deno の主な利点には次のようなものがあります。
- デフォルトのセキュリティ—ユーザーは、コードがネットワーク、ファイル システム、または環境にアクセスする許可を明示的に与える必要があります。
- TypeScript および WebAssembly の組み込みサポート— Deno で TypeScript および WebAssembly プログラムを実行することは、JavaScript プログラムを実行するのと同じくらい簡単です。 ランタイムは、JavaScript の場合と同様に言語をコンパイルします。
- 一元化されたパッケージ マネージャー— npm や Bun のパッケージ マネージャーのようなパッケージ リポジトリに依存する代わりに、Deno は URL からコードを直接インポートできます。 この機能は、GitHub リポジトリ、サーバー、CDN など、ホストされている場所から依存関係を読み込むことができることを意味します。 Deno は、さらに簡単にアクセスできるように、スクリプト ホスティング サービスも提供しています。
- Web 標準への準拠— Deno はブラウザと同じ API に従うことを目指しています。つまり、ブラウザ用に記述されたコードはランタイムに簡単に変換できます。
大企業や、Slack、Netlify、Supabase などの主要な業界プレーヤーは Deno を採用していますが、Web 開発者の間での採用はあまり普及していません。 2022 年の Stack Overflow 調査によると、調査に回答したプロの開発者のうち、Deno を使用していたのはわずか 1.47% であり、46.31% が Node.js を使用していると報告されています。
デノは何をしますか?
他の JavaScript ランタイムと同様に、Deno を使用すると、開発者はサーバー側で JavaScript を実行できます。 その結果、Deno を使用してさまざまなプログラミング タスクを実行できます。
Deno は、Web ベースのユーザー要求に応答するサーバー アプリケーションの開発などのタスクに最も優れています。 たとえば、オンライン書店を作成している場合、Deno を使用して、PostgreSQL データベースから情報を取得し、ユーザーが表示したいページを作成し、レンダリングのためにブラウザーに送信するアプリを作成できます。
コマンドライン ツールを構築してターミナル経由で ToDo タスクを管理するなど、下位レベルのプログラミング タスクに Deno を使用することもできます。 つまり、Deno を使用して、Python や Ruby などの言語を使用して達成するのと同じ目標を達成できます。
Deno vs ノード
Deno は Node.js を改善することを目指しており、いくつかの重要な分野でその約束を果たしています。 Deno は、さまざまなコード モジュールに対してよりきめ細かいアクセス構成を有効にすることで、セキュリティを向上させます。 また、開発者がブラウザ側とサーバー側の両方で同じコードを使用できるようにする Web 標準 API への準拠にも焦点を当てています。
サーバーサイドの JavaScript プロジェクトに取り組んでいるチームにとって、Deno は Node.js の実行可能な代替手段になりました。 同様の機能により、一部の開発者は Deno が Node.js を置き換えることができると確信しましたが、いくつかの主な理由から、この可能性は低いです。
Node.js は最も人気のある JavaScript ランタイムであり、事前に作成されたパッケージの広大なエコシステムと、大規模で活発なユーザー コミュニティを蓄積しています。 これらの貴重なリソースにより、Node.js は非常に魅力的なランタイムであり続けることができます。
対照的に、Deno は新しいものです。バージョン 1.0 は 2020 年 5 月にリリースされたため、それを試す時間があった開発者は比較的少数です。 新しいツールを学習すると、開発のタイムラインが長くなります。 さらに、Deno が多くの単純なプロジェクトに大きな利益をもたらすかどうかは明らかではありません。
しかし、金融のようにセキュリティが不可欠な分野でアプリケーションを構築している場合、Deno のセキュリティ機能は乗り換える価値があるかもしれません。
でのvsぶん
元 Stripe エンジニアの Jarred Sumner は、ベータ テストのために 2022 年 7 月に初めて Bun をリリースしました。 Bun は Deno よりも実験的なランタイムであり、Deno とは異なり、Node.js との広範な後方互換性を持つように設計されています。
Bun はまた、Node.js や Deno を凌駕する非常に高速なパフォーマンスを誇っています。 主な機能により、次の機能が有効になります。
- より優れたエンジン— Google の V8 JavaScript および Web アセンブリ エンジンの代わりに、Bun は、基盤となる JavaScript エンジンとして、より高速で効率的な JavaScriptCore を使用します。
- より多くのコード制御— Bun は、コード実行に対して JavaScript よりも優れた制御を提供する低レベル言語である Zig で書かれています。
- 微調整された効率— Bun に取り組んでいるチームは、コードの効率を確保するために、開発中にプロファイリング、ベンチマーク、および最適化を優先しました。
Bun は非常に新しいので、トラブルシューティングに役立つコミュニティ サポートは比較的少ないです。 それでも、Bun は実験としては楽しいものです。 特にパフォーマンスの向上を必要とするチームは、Bun をプロジェクトに役立てることができますが、Web 開発ではパフォーマンス以外の要素を優先することがよくあります。
Deno を始めよう
Deno と、他の一般的な JavaScript ランタイムとの比較について少し学んだので、次は、Deno がどのように機能するかを見てみましょう。 このセクションでは、HTTP リクエストに「Hello from the server!」で応答するシンプルなサーバーを Deno で作成する方法を学びます。
Denoのインストール
公式ドキュメントのインストール手順を使用して、Deno をバイナリ実行可能ファイルとしてマシンにインストールできます。 たとえば、macOS では、コマンドbrew install deno
で Deno をインストールできます。
Deno を使い始めるもう 1 つの方法は、次のように npm パッケージとしてインストールすることです。
プロジェクト用のフォルダー (おそらくdeno_example ) を作成し、その中でコマンドnpm init
を実行します。 (基本的なpackage.jsonファイルを作成するため、 init
によって提案されたすべてのデフォルト オプションを受け入れることができます。)
アプリケーションを初期化したら、 npm install deno-bin
を実行して Deno バイナリ パッケージをインストールします。 package.jsonファイルを更新して、 npm start
でアプリケーションを起動できるようになりました。 以下の太字の行を、デフォルトの package.json ファイルの「scripts」オブジェクト プロパティに追加します。
"scripts": { "start": "deno run --allow-net app.ts", "test": "echo \"Error: no test specified\" && exit 1" },
このスクリプトの追加により、Deno は app.ts モジュールをネットワーク権限 ( --allow-net
) で実行できるようになります。 Deno を使用する場合は、ネットワークまたはファイル システムへのアクセスを明示的に許可する必要があることに注意してください。
これで、ポートでのリッスンとユーザー リクエストの処理を担当するapp.tsモジュールを作成する準備が整いました。
App.ts モジュールの作成
Deno で基本的なサーバーを作成するのは非常に簡単です。 まず、 app.tsファイルを作成し、次のコードを貼り付けます。
import { serve } from "https://deno.land/[email protected]/http/server.ts"; serve((_req) => new Response("Hello from the server!"), { port: 8000 });
コードは、公式の Deno.land Web サイトに格納されているserver.ts Deno library
のserve
関数を使用します。 このコードは、着信要求のserve
関数ハンドラーも提供します。 ハンドラー関数は、すべてのリクエストに「Hello from the server!」で応答します。
serve
関数は、サービスを提供するポート番号などのオプションのパラメーターも受け取ります。 このコード例では、これらのパラメータを使用してポート 8000 でサービスを提供しています。
次に、 npm start
を実行してサーバーを起動します。 これにより、 localhost:8000
でリッスンするサーバーが起動し、リクエストに挨拶で応答します。
サーバーを本格的な API に拡張したい場合は、おそらくデータベース接続を追加する必要があります。 これは、Deno コミュニティが MariaDB/MySQL、PostgreSQL、MongoDB などの一般的なデータベースをサポートするドライバーを作成しているため、簡単に実行できます。
まとめ
ランタイムは、一般的で信頼できるものから非常に実験的なものまでさまざまです。 プロジェクトに適したものを選択する方法は、プロジェクトと、ランタイムを目標の達成にどのように役立てたいかによって異なります。
Node.js は、ほとんどのプロジェクトでうまく機能します。 これには、さまざまなトラブルシューティング シナリオに役立つ大規模なエコシステムと大規模なコミュニティがあります。
Deno には、セキュリティが強化され、開発者エクスペリエンスが向上するという利点があります。 同時に、慣れていないランタイムを学習するための時間と人件費よりもメリットが大きいため、経験豊富なチームに最適です。
最後に、Bun はほとんどのプロのプロジェクトにとって実験的すぎますが、個人的なプロジェクトや拡張するために取り上げるにはユニークで楽しいランタイムです。
全体として、Deno は Node.js の利点と Bun の実験的な可能性のバランスを提供します。 Node.js はほとんどのプロジェクトにとって有用な選択肢ですが、Deno は Web 開発が将来どのように進化するかの最前線にいる可能性があります。
一方、Kinsta の Application Hosting Hobby Tier にサインアップして、Deno チョップを練習してください。今コーディングし、後でスケーリングします。