JavaScript ランタイムの比較: Node.js、Deno、および Bun

ここに画像の説明を挿入します

JavaScript ランタイムは、ユーザーのブラウザーの実行に依存しない、高度なサーバー駆動型 JavaScript プロジェクトを構築するのに役立ちます。

選択できるランタイムはいくつかあり、Node.js の確立された優位性に対して Deno と Bun が挑戦しています。Deno は、Node.js を最初に作成した開発者である Ryan Dahl によって 2009 年に作成された最新プロジェクトです。Deno は、きめ細かいアクセス制御によってセキュリティを向上させ、ネイティブ TypeScript サポートや Web 互換性の向上など、より最新の機能を提供することを目指しています。

一方、Bun は最新の新興企業であり、非常に速い速度を提供し、競合他社を大幅に上回っています。ただし、まだベータ版であり、完全な運用に入る前に埋める必要があるギャップがいくつかあります (バージョン 1.0 は現在、2023 年 9 月 7 日にリリースされています)。

適切な JavaScript ランタイムの選択が重要な理由

JavaScript ランタイムを使用すると、ブラウザの外部でアプリケーション コードを実行できます。これは、サイトをホスト型アプリケーションとして配信できることを意味します。あるいは、一般的なスクリプトに JavaScript ランタイムの使用を選択することもできます。

選択したランタイムは、リクエストの処理速度とデータベース アクセス速度が大きく異なるため、アプリケーションのパフォーマンスに大きな影響を与えます。開発の容易さとスケーラビリティにも影響します。

利用可能なさまざまな機能とそれがパフォーマンスに与える影響に加えて、開発者のエクスペリエンスも重要です。ランタイムの経験や実験意欲など、チームの好みによって、どのランタイムが適しているかが決まります。安定性とスピードどちらを好みますか? ネイティブの TypeScript サポートにより、より豊富なランタイムやよりカスタマイズ可能な環境を実現したいですか? これらは、ランタイムを決定する際に自問する可能性のある質問のほんの一例です。各ランタイムが提供するものを理解することは、最も情報に基づいた意思決定を行うのに役立ちます。

JavaScript ランタイムの紹介

パフォーマンス、安定性、セキュリティに基づいてこれらのランタイムを比較する前に、それぞれの基本的な概要を説明します。

Node.js

Node.js は JavaScript ランタイムの現チャンピオンであり、 Stack Overflow 開発者によって2023 年に最も人気のある Web テクノロジーに選ばれました。ライアン・ダールによって作成され、2009 年に発売されました。公平に言うと、JavaScript が市場に参入したとき、これはできることを革命的に変えました。これを使用すると、開発者は JavaScript を使用して高度なバックエンド駆動型アプリケーションを作成できます。

現在、Node.js を中心とした広大なエコシステムが存在し、豊富なリソースとライブラリが存在します。しかし、他のランタイムやテクノロジーと同様に、常に改善の余地があります。ここで、Deno と Bun は JavaScript ランタイム環境にオプションを追加します。

ない

Deno は、Rust に基づいた JavaScript ランタイムです。Node.js と同様に、Node.js で利用できる機能を改善したいという願望のもと、Ryan Dahl によって作成され、立ち上げられました。JSConf EUでのライアンの録音された講演で、Deno の背後にあるライアンの動機について詳しく見たり聞いたりすることができます

その主な焦点の 1 つは、Node.js のセキュリティの向上です。Deno では、ファイル、ネットワーク、および環境へのアクセスを明示的に有効にして、これらの領域によって通常引き起こされるセキュリティ問題が発生する可能性を低くする必要があります。また、JSX と TypeScript のサポートを強化し、Web 標準をより重視することも目指しています。導入を簡素化するために、アプリケーションは単一の実行可能ファイルとして提供されます。

Deno は、それを中心としたツールのエコシステムも提供しており、開発者がプロ​​ジェクトをすぐに開始できるようにします。Freshは Deno 用に構築された Web フレームワークであり、Lumeは静的サイト ジェネレーターです。

バン

Bun は、あなたの注目を集めている最新のランタイムです。Zig を利用しており、速度、バンドル、テスト、Node.js パッケージとの互換性に重点を置いたオールインワンのランタイムとツールキットを目指しています。その最大の魅力の 1 つは、そのパフォーマンスが Node.js や Deno の両方よりも大幅に高速であることです。これらすべてを実現できれば、非常に魅力的な提案となるでしょう。

パフォーマンスに関しては、Bun メンテナーは、React を使用してサーバー側ページをレンダリングする HTTP ハンドラーを実行するサンプル ベンチマークを提供しています。この結果、Bun は1 秒あたり約 68,000 のリクエストを処理するのに対し、Deno と Node.js はそれぞれ約 29,000 と 14,000 のリクエストを処理します。それは大きな違いです。Jarred Sumner はTwitter でBun 開発に関する最新情報や最近のベンチマークを定期的に提供しているので、必ず彼をフォローして最新情報を入手してください。

Bun には、JavaScript および TypeScript ベースのプロジェクトのバンドル機能とタスク実行機能も含まれています。Deno と同様に、Web API サポートが組み込まれた単一のバイナリを提供します。また、npm 互換性のあるいくつかの Node.js ライブラリもサポートしています。

JavaScript ランタイムの比較

ここで、パフォーマンス、サポートとコミュニティ、安定性、セキュリティ、追加機能に焦点を当てて、違いを詳しく見てみましょう。

パフォーマンス

早速本題に入りますが、宝子が勝ちました。以前にそのパフォーマンス能力、つまり 1 秒あたりに処理できるリクエストの数を調べましたが、これは非常に印象的です。データベース操作に関しても、状況は同様です。Bung のベンチマーク例を使用してSQLite の Northwind データベースをロードすると、1 秒あたりの平均クエリは次のようになります。

ここに画像の説明を挿入します

Node.js、Deno、Bun の別の比較では、Bun が同時接続の処理で最も高速でした。また、1 秒あたりのリクエスト数もかなり多くなります。たとえば、10 の同時接続では、Bun は 1 秒あたり 110,000 リクエストを達成しますが、Node.js は Deno で 60,000 リクエストと 67,000 リクエストを達成します。この傾向は、同時接続数が増加し、各ランタイムのパフォーマンスが増加するにつれて継続します。

パフォーマンス テストに使用されるシナリオの妥当性については議論がありますが、依然として Bun が勝者です。Node.js はすべての比較で最下位にランクされ、特にデータベース速度が低調でした。通常、Deno と Node.js はそれほど離れていませんが、Bun は両方をはるかに上回っています。Node.js はこの分野では遅れを取っていますが、Yagiz Nizipli は Node.js のいくつかの分野でパフォーマンスの向上を主導しています。たとえば、URL 解析が最大 80 ~ 90%高速化されます。

ここに画像の説明を挿入します

Bun の速度は開発者にとって大きな焦点であり、Safari で JavaScriptCore を使用しています。また、Deno と Node.js は Chrome と同じ V8 JavaScript エンジンを使用します。コンパイルされたバイナリ内のデッドコードを削除することで、Bun をさらに改善する計画があります (これまでのところ、部分的に実装されています)。

Buns は、高速に実行されるだけでなく、複数のインスタンスを起動するときにパフォーマンスを維持することを目的として、迅速に起動できるように設計されています。これは、アプリケーションを動的にスケーリングする場合に適しています。突然のトラフィックの急増が発生し、インスタンスを迅速に作成する必要がある場合に、Bun はサービスをできるだけ早く利用できるようにすることを念頭に置いて設計されています。

コミュニティ

ここに画像の説明を挿入します

毎年、「JavaScript の現状」と呼ばれる開発者調査が行われます。その中には、参加者がよく使うランタイムに関する質問があり、3万人​​近くが回答しました。最新の 2022 年の調査結果でも、Node.js が明確なリーダーとして描かれており、Deno が 5.3,000 票で、Bun が約 1.2,000 票で続いています。これは予想されることであり、今後の 2023 年の調査結果でこれらの数値がどのように変化するかを見るのは興味深いでしょう。おそらく、DenoとBunの新しいトレンドが見られるでしょう。

  • Node.js の公式ドキュメントには、さまざまなガイド、大規模な API リファレンス、入門情報が含まれています。その依存関係に関する情報も入手できます。
  • Deno の Web サイトには、ランタイムに慣れてプロジェクトで使い始めるのに役立つ非常に詳細なマニュアルが含まれています。そのホームページでは、インストールとドキュメントへのアクセスが最前線に置かれているため、初心者がヘルプを探し回る必要はありません。開発者がすぐに使用できる標準ライブラリに関する情報もいくつかあります。[サードパーティ モジュール] ページは、エコシステムで利用可能なものを理解するのに便利な方法です。6,000 を超えるモジュール (2023 年 8 月現在) といくつかのサンプルコードが含まれています。
  • Bun のホームページには、Discord、ドキュメント、GitHub ページへのリンクが目立つように表示されています。ドキュメントは、最初に提供されて以来大幅に改善されました。現在では、入門、バンドラーとテスト ランナーの使用、API リファレンスなど、さまざまなトピックをカバーする情報を備えた包括的な専用サイトが開設されています。現在でも、Bun を使用して一般的なタスクを実行する方法を示すガイドが含まれています。

安定性

確立されたプレーヤーである Node.js は実証済みのパフォーマンスを提供し、世界の Web サイトの 2.1% で利用されています。これは既知の量であり、多くのプロジェクトが依存する製品です。問題が発生した場合、誰かがその解決方法を知っている可能性があります。

Deno のバージョン 1.0 は 2020 年 5 月にリリースされ、最初の安定バージョンとみなされます。しかし、開発者の集団的な支持を獲得するための「ユーザーが認識する」差別化要因がないため、採用は遅れています。バージョン 1.0 のリリース以来、開発者がほとんど影響を与えずにアップグレードできるように、リリースごとに安定性を維持しながら開発者のエクスペリエンスを向上させる点で大きな進歩を遂げてきました。

この記事の執筆時点では、Bun は 2023 年 9 月にバージョン 1.0 をリリースしました。その結果、Node.js コア API の安定性とカバー範囲はベータ版リリース以来大幅に向上しており、コミュニティ内のますます多くの人々が Node.js コア API をプロジェクトに導入しようとしているため、今後もこの状態が続く可能性があります。

安全性

依存関係管理に npm を使用する場合、セキュリティが弱点になる可能性があり、それは Node.js 上に構築する場合の一般的なアプリケーション セキュリティの落とし穴にも及びます。より安全なランタイムの作成は、ネットワーク リクエスト、ファイル システム操作、その他のコア機能などの機密性の高い API へのきめ細かいアクセス制御を中心とした Deno の作成の原動力の 1 つでした。この点では、Node.js もそれほど遅れをとっていません。Node.js 20 では、Deno と同様のセキュリティ面を可能にするアクセス許可モデルが導入されています。

Node.js セキュリティのベスト プラクティスに関する記事や OWASP チート シートなど、セキュリティ プラクティスの学習に役立つリソースが多数あります。よくある間違いについて開発者を教育すると、安全な Node.js アプリケーションを構築するのに役立ちます。

Deno は、実行中のアプリケーション内の特定のアクションに対して明示的なアクセス許可を要求することで、Node.js に固​​有のセキュリティ上の懸念の一部を解消します。たとえば、アプリケーションがファイルシステムからの読み取りにアクセスできるようにするには、起動時に --allow-read フラグを使用してアプリケーションを起動する必要があります。これらの完全なリストは、権限に関するドキュメントで確認できます。実行時にこの権限システムと対話することもでき、これによりプログラムで権限を要求したり取り消したりすることができます。--allow-run フラグを使用する場合は、子プロセスに注意してください。結果として生じる子プロセスには Deno プロセスと同じセキュリティ制限がなく、Deno のセキュリティ サンドボックスが無効になり、権限昇格が発生する可能性があります。

バンはまだ非常に新しく、その安全性に関する情報を入手するのは困難です。比較的未熟なため、慎重に使用し、セキュリティ パッチの更新や発表に細心の注意を払う必要があります。安定したらセキュリティ監査を導入する予定です。

追加機能

Node.js は最近、Deno および Bun の機能とより一致する機能を導入しました。現在、組み込みのテスト ランナーがあり、組み込みの TypeScript サポートについては活発な議論が行われています。

Deno には、依存関係チェッカーとコード フォーマッタが含まれています。単一の実行可能ファイルにデプロイできる機能も利点です。Deno でサーバーをセットアップする場合、ドキュメントに記載されている基本的なアプローチには、他の場所からコードをプルすることが含まれます。コードは Node.js よりもそれほど複雑ではありませんが、依存関係は URL 経由で読み込まれるため、少し異なるように感じられます。

コードの要約例を次に示します。

import {
    
     serve } from "https://deno.land/[email protected]/http/server.ts";

const handler = async (_request: Request): Promise<Response> => {
    
    
  const resp = await fetch("https://api.github.com/users/denoland", {
    
    
    // The init object here has an headers object containing a
    // header that indicates what type of response we accept.
    // We're not specifying the method field since by default
    // fetch makes a GET request.
    headers: {
    
    
      accept: "application/json",
    },
  });

  return new Response(resp.body, {
    
    
    status: resp.status,
    headers: {
    
    
      "content-type": "application/json",
    },
  });
};

serve(handler);

Bun のその他の機能には、トランスパイラーやパッケージ マネージャーなどがあります。名前が示すように、バンドルも含まれており、Snowpack や rollup.js などの他のツールが必要となる機能を提供します。また、JavaScript シンプリファイアーによるデッドコードの除去も備えています。

Bun をタスクランナーとして使用する場合、そのスピードは大きな利点となります。Node.js の起動には最大 5 ミリ秒かかるのに対し、Node.js では最大 25 ミリ秒かかると主張しています。これは大きな違いのように思えないかもしれませんが、これを時間をかけて実行する必要がある複数のタスクと組み合わせると、開発ワークフローのスピードアップに影響を与える可能性があります。

まとめ

どのプロジェクトを使用するかを決定する際には、初期の機能をすべて考慮する必要があります。優先順位は、ユースケースとプロジェクトのニーズに応じて異なります。

Bun はスピードの点では明らかに勝者ですが、まだ新しいため、使用にはリスクがあります。他の2頭の安定性を高めることになるだろうか?多分。いずれにせよ、あなたが競合他社を上回ることで波紋を広げようとしている破壊者であれば、Bun は (ほとんどの場合) その機会を提供してくれます。

Node.js の最大の利点は、その成熟度とエコシステムの規模です。多くの開発者がそれを理解していることがわかります。ただし、Deno と Bun には新しい魅力があり、常に開発者を興奮させます。

また、Deno には Node.js に比べて多くの利点があり、その機能セットにより開発がよりスムーズになり、高品質で複雑なプロジェクトを簡単に構築できます。安全ですが、Node.js よりは高速ですが、Bun と比べると少し遅いです。

一般的に言えば、Node.js が依然として最も安全な選択であり、成功の実績もあります。Deno には気に入った点がたくさんあり、その最新の機能により、新しいものを構築しようとしている開発者にとっては良い選択肢になります。Bun は、速度が主な関心事である場合、または単に新しいテクノロジーの最先端を維持したい場合に最適なツールです。

おすすめ

転載: blog.csdn.net/jslygwx/article/details/132788602