| Node.js | |
|---|---|
| 原作者 | ライアン・ダール |
| 開発者 | OpenJS財団 |
| リリース | 2009年5月 27日 (2009-05-27)[ 1 ] |
| 安定放出 | |
| 執筆 | JavaScript、C++、Python、C |
| オペレーティング·システム | z/OS、Linux、macOS、Microsoft Windows、SmartOS、FreeBSD、OpenBSD、IBM AIX [ 3 ] |
| タイプ | 実行環境 |
| ライセンス | MITライセンス[ 4 ] [ 5 ] |
| Webサイト | nodejs.org |
| リポジトリ |
|
Node.js は、 Windows、Linux、Unix、macOSなどで実行できるクロスプラットフォームのオープンソース JavaScriptランタイム環境です。Node.js はV8 JavaScript エンジン上で動作し、Web ブラウザの外で JavaScript コードを実行します。Stack Overflow 開発者調査によると、Node.js は最も一般的に使用されている Web テクノロジーの 1 つです。[ 6 ]
Node.js を使用すると、開発者は JavaScript を使用してコマンドライン ツールやサーバーサイド スクリプトを作成できます。サーバー上で JavaScript を実行することは、ページがユーザーの Web ブラウザーに送信される前に動的な Web ページコンテンツを生成するためによく使用されます。したがって、Node.js は「JavaScript はどこにでもある」パラダイムを表しており[ 7 ]、サーバー側とクライアント側のプログラミングに異なる言語を使用するのではなく、単一のプログラミング言語を中心にWeb アプリケーション開発を統一します。
Node.js は非同期 I/Oが可能なイベント駆動型アーキテクチャを採用しています。これらの設計上の選択は、多数の入出力操作を伴う Web アプリケーションやリアルタイム Web アプリケーション (リアルタイム通信プログラムやブラウザ ゲームなど) におけるスループットとスケーラビリティを最適化することを目的としています。[ 8 ]
Node.js分散開発プロジェクトは、以前は Node.js Foundation によって管理されていましたが、[ 9 ]現在はJS Foundationと合併してOpenJS Foundationとなっています。OpenJS Foundation は、 Linux Foundationの Collaborative Projects プログラムによって運営されています。 [ 10 ]


Node.js は、最初のサーバーサイド JavaScript 環境であるNetscapeの LiveWire Pro Web の登場から約 13 年後の 2009 年にRyan Dahlによって最初に書かれました。 [ 11 ] [ 12 ]最初のリリースでは Linux と Mac OS X のみがサポートされていました。その開発とメンテナンスは Dahl が主導し、後にJoyentがスポンサーとなりました。[ 13 ]
ダールは、Apache HTTP Serverが多数の(10,000以上の)同時接続を処理する能力が限られていること、およびアプリケーションがプロセス全体をブロックしたり、同時接続のために複数の実行スタックを作成したりする可能性のある、シーケンシャルプログラミングという支配的なプログラミングパラダイムを批判した。
Dahl は 2009 年 11 月 8 日に開催された最初の European JSConf でこのプロジェクトを実演しました。[ 14 ] [ 15 ] [ 16 ] Node.js はGoogleのV8 JavaScript エンジン、イベント ループ、および低レベルのI/O API を組み合わせたものです。[ 17 ]
2010年1月、Node.js環境向けにnpmと呼ばれるパッケージマネージャーが導入されました。[ 18 ]このパッケージマネージャーにより、プログラマーはNode.jsパッケージとそのソースコードを公開および共有することができ、パッケージのインストール、更新、アンインストールを簡素化するように設計されています。[ 17 ]
2011年6月、マイクロソフトとジョイエントはNode.jsのネイティブWindows版を実装した。 [ 19 ] Windowsをサポートする最初のNode.jsビルドは2011年7月にリリースされた。
2012 年 1 月、Dahl はプロジェクトの管理を npm 作成者の Isaac Schlueter に譲りました。2014年1月、シュリューターはティモシー・J・フォンテーヌがプロジェクトを率いることを発表した[ 20 ] 。 [ 21 ]
2014年12月、Fedor Indutnyは、Joyentのガバナンスに不満を抱き、独立した技術委員会を持つオープンガバナンスの代替案として、Node.jsのフォークであるio.jsを作成しました。その目的は、当時のNode.jsのアプローチとは異なり、io.jsを最新のGoogle V8 JavaScriptエンジンリリースで更新するなど、コミュニティからの意見を受け入れやすい構造を実現することでした。[ 22 ]
Node.js と io.js を統一された旗印の下に統合するために設立された Node.js Foundation は、2015 年 2 月に発表されました。[ 23 ]統合は 2015 年 9 月に実現し、Node.js v0.12 と io.js v3.3 が統合されて Node v4.0 となりました。[ 24 ]この統合により、V8 ES6 の機能が Node.js に導入され、長期サポートのリリース サイクルが開始されました。[ 25 ] 2016 年までに、io.js の Web サイトは Node.js に戻ることを推奨し、io.js のリリースはこれ以上行わないと発表し、事実上フォークを終了させ、統合の成功を確固たるものにしました。[ 26 ]
2019年、JS FoundationとNode.js Foundationが合併し、OpenJS Foundationが設立されました。
Node.js のロゴは、ランタイムのクロスプラットフォーム性を表す重なり合う帯のある緑色の六角形が特徴です。[ 27 ]ロケットタートルは、デザインコンテストを経て、2024 年 2 月に Node.js の公式マスコットとして選ばれました。[ 28 ]
Node.js では、 JavaScriptとさまざまなコア機能を処理する「モジュール」のコレクションを使用して、 Web サーバーやネットワーク ツールを作成できます。 [ 14 ] [ 17 ] [ 29 ] [ 30 ] [ 31 ]モジュールは、ファイルシステムI/O、ネットワーク ( DNS、HTTP、TCP、TLS/SSLまたはUDP )、バイナリデータ (バッファ)、暗号化機能、データ ストリーム、その他のコア機能用に提供されています。 [ 17 ] [ 30 ] [ 32 ] Node.js のモジュールは、サーバー アプリケーションの作成の複雑さを軽減するように設計された API を使用します。[ 17 ] [ 30 ]
バージョン 22.6.0 以降、Node.js はJavaScriptとTypeScript の両方をネイティブにサポートしており、TypeScript ファイルを別途コンパイル手順なしで実行できます。[ 33 ] TypeScript のサポートは、Node.js TSC メンバーの Marco Ippolito によって提供されました。さらに、多くのJS コンパイル言語が利用可能で、[ 34 ] Node.js アプリケーションをCoffeeScript、[ 35 ] Dart、ClojureScriptなどで記述することもできます。
Node.js は主に Web サーバーなどのネットワーク プログラムの構築に使用されます。[ 29 ] Node.js とPHPの最も大きな違いは、PHP のほとんどの関数が完了するまでブロックする(コマンドは前のコマンドが完了した後にのみ実行される) のに対し、Node.js の関数はノンブロッキングである(コマンドは並行して実行され、コールバックを使用して完了または失敗を通知する) ことです。[ 29 ]
Node.js は、 Linux、macOS、Microsoft Windows 8.1 および Server 2012 (以降)で公式にサポートされており、 [ 3 ] SmartOSおよびIBM AIXは Tier 2 サポート、 FreeBSDは実験的にサポートされています。OpenBSDも動作し、IBM i (AS/400) 用の LTS バージョンが利用可能です。[ 36 ]ソース コードは、 NonStop OS [ 37 ]やUnixサーバーなど、公式にはサポートされていない同様のオペレーティングシステムでもビルドできます。
Node.js は、イベント駆動型プログラミングを使用して JavaScript で高速な Web サーバーを開発することを可能にします。[ 17 ]開発者は、コールバックを使用してタスクの完了を通知する簡略化されたモデルを使用することで、スレッドを使用せずにスケーラブルなサーバーを作成できます。 [ 17 ] Node.js は、スクリプト言語 (JavaScript) の使いやすさと Unix ネットワーク プログラミングのパワーを結び付けています。[ 17 ]
Node.js は、 BSD ライセンスの下でオープンソース化されて以来、Google の V8 JavaScript エンジンをベースに構築されており、 HTTP、DNS、TCPなどの基本的なプロトコルを包括的にサポートしています。[ 14 ] JavaScript の既存の人気により、Node.js はWeb 開発コミュニティにとって利用しやすくなりました。[ 14 ]
Node.jsには数千ものオープンソースライブラリがあり、そのほとんどはnpmウェブサイトで公開されています。Node.jsコミュニティを支援するため、NodeConf、Node Interactive、Node Summitといった大規模な開発者向けカンファレンスやイベントが多数開催されているほか、地域ごとのイベントも数多く行われています。
オープンソースコミュニティは、アプリケーション開発を加速するためのウェブフレームワークを開発してきました。そのようなフレームワークには、 Express.js、Socket.IO、Sails.js、Next.js、Meteorなどがあります。[ 17 ] [ 38 ]また、 Microsoft .NETなどの他の言語やランタイム環境と連携するためのさまざまなパッケージも作成されています。[ 39 ]
最新のデスクトップIDE は、Node.js アプリケーション専用の編集およびデバッグ機能を提供します。このような IDE には、 Atom、Brackets、JetBrains WebStorm、[ 40 ] [ 41 ] Microsoft Visual Studio (Visual Studio 用 Node.js ツール付き、[ 42 ]またはNode 定義付きTypeScript [ 43 ] [ 44 ] [ 45 ] [ 46 ] )、NetBeans、[ 47 ] Nodeclipse Enide Studio [ 48 ] ( Eclipseベース)、Visual Studio Code [ 49 ] [ 50 ]などがあります。Codeanywhere 、Eclipse Che、Cloud9 IDE 、 Node-REDのビジュアル フロー エディターなど、Node.js をサポートするオンライン IDEもあります。
Node.jsは、 Jelastic、Google Cloud Platform、AWS Elastic Beanstalk、Azure Web Apps、Joyentなど、多くのクラウドホスティングプラットフォームでサポートされています。
Node.js の新しいメジャー リリースは、 GitHubメイン ブランチから 6 か月ごとに切り出されます。偶数バージョンは 4 月に、奇数バージョンは 10 月に切り出されます。新しい奇数バージョンがリリースされると、以前の偶数バージョンは長期サポート(LTS) に移行し、LTS に指定された日から 12 か月のアクティブ サポートが提供されます。この 12 か月が終了すると、LTS リリースはさらに 18 か月のメンテナンス サポートを受けます。アクティブ バージョンには、現在のリリースにマージされてから数週間後に、互換性を損なわないバックポートが適用されます。メンテナンス リリースには、重要な修正とドキュメントの更新のみが適用されます。[ 51 ] LTS ワーキング グループが、Node.js Foundation のテクニカル ステアリング コミッティと協力して戦略とポリシーを管理します。
Node.jsは、イベントループと呼ばれるループで受信リクエストを処理するJavaScriptランタイム環境です。
Node.js は、非同期イベントを処理するために内部的にlibuvを使用しています。libuv は、Windows およびLinux、macOS、OSS on NonStop 、Unix などのPOSIXベースのシステムの両方で、ネットワークおよびファイルシステム機能のための抽象化レイヤーです。Node.js は HTTP サポートに nghttp2 を使用しています。バージョン 20 以降、Node.js は最新のWHATWG URL準拠を提供する ada ライブラリを使用しています。バージョン 19.5 以降、Node.js は高速な Unicode 検証とトランスコーディングに simdutf ライブラリを使用しています。バージョン 21.3 以降、Node.js は高速な JSON 解析に simdjson ライブラリを使用しています。
Node.js は、シングルスレッドのイベント ループで動作し、ノンブロッキング I/O呼び出しを使用することで、スレッドコンテキスト スイッチのコストを発生させることなく、数万の同時接続をサポートできます。[ 57 ]オブザーバー パターンを使用するすべてのリクエスト間で単一のスレッドを共有する設計は、I/O を実行するすべての関数がコールバックを使用する必要がある、高度に並行するアプリケーションを構築することを目的としています。シングルスレッドのイベント ループに対応するために、Node.js はlibuvライブラリを使用します。libuv ライブラリは、固定サイズのスレッド プールを使用して、一部のノンブロッキング非同期 I/O 操作を処理します。[ 8 ]
スレッドプールは、Node.jsにおける並列タスクの実行を管理します。メインスレッドの関数呼び出しによってタスクが共有タスクキューにポストされ、スレッドプール内のスレッドがそれを取得して実行します。ネットワーク処理などの本質的に非ブロッキングなシステム機能はカーネル側の非ブロッキングソケットに変換され、ファイル入出力などの本質的にブロッキングなシステム機能は、それぞれのスレッド上でブロッキング方式で実行されます。スレッドプール内のスレッドがタスクを完了すると、メインスレッドにその旨を通知し、メインスレッドは起動して登録済みのコールバックを実行します。
このシングルスレッド方式の欠点は、Node.js ではcluster [ 58 ] StrongLoop Process Manager [ 59 ] や pm2 [ 60 ]などの追加モジュールを使用せずに、実行中のマシンのCPU コア数を増やすことで垂直スケーリングができないことです。ただし、開発者は libuv スレッド プールのデフォルトのスレッド数を増やすことができます。サーバーのオペレーティングシステム (OS) は、これらのスレッドを複数のコアに分散する可能性が高いです。[ 61 ]もう 1 つの問題は、長時間かかる計算やその他の CPU バウンドなタスクが完了するまでイベント ループ全体をフリーズさせることです。
V8は、当初Google Chrome向けに開発されたJavaScript実行エンジンです。その後、2008年にGoogleによってオープンソース化されました。C ++で記述されたV8は、実行時にJavaScriptソースコードをネイティブマシンコードにコンパイルします。[ 8 ] 2016年現在、バイトコードインタープリタであるIgnitionも含まれています。
npmは、Node.jsサーバープラットフォームにプリインストールされているパッケージマネージャーです。npmレジストリからNode.jsプログラムをインストールし、サードパーティ製のNode.jsプログラムのインストールと管理を整理します。
Node.js はオペレーティングシステムに登録されるため、OS は新しい接続などの非同期 I/Oイベントを通知します。Node.js ランタイム内では、イベントによってコールバックがトリガーされ、各接続は小さなヒープ割り当てとして処理されます。従来は、比較的重い OS プロセスまたはスレッドが各接続を処理していました。Node.js は、プロセスやスレッドの代わりに、同時 I/O にイベント ループを使用します。[ 62 ]他のイベント駆動型サーバーとは異なり、Node.js のイベント ループは明示的に呼び出す必要はありません。代わりに、コールバックが定義され、サーバーはコールバック定義の最後に自動的にイベント ループに入ります。Node.js は、実行すべきコールバックがなくなるとイベント ループを終了します。
Node.jsはWebAssemblyをサポートしており、Node 14以降ではWebAssemblyシステムインターフェース(WASI)の実験的なサポートも提供しています。
Node.js は、C/C++ で記述されたソース コードからロード可能な (インポート可能な) モジュールを生成するために使用できる N-API と呼ばれるCベースの API を介して「アドオン」を作成する方法を提供します。 [ 63 ]モジュールは、単純な CommonJS モジュールとして、メモリに直接ロードされ、JS 環境内から実行できます。N-API の実装は、内部の C/C++ Node.js および V8 オブジェクトに依存しており、ユーザーはNode.js 固有のヘッダーをネイティブ ソース コードにインポート( #include )する必要があります。[ 63 ].node
Node.js API はバイナリレベルで互換性のない変更が行われる可能性があるため、モジュールを正しく動作させるには、特定の Node.js バージョンに合わせてビルドおよび配布する必要があります。この問題に対処するため、サードパーティは API の上にオープンソースの C/C++ ラッパーを導入し、問題を部分的に軽減しています。これらのラッパーはインターフェースを簡素化しますが、副作用として、メンテナーが対処しなければならない複雑さも生じる可能性があります。Node.js のコア機能は JavaScript の組み込みライブラリにありますが、C++ で記述されたモジュールを使用して、アプリケーションの機能を拡張したり、パフォーマンスを向上させたりすることができます。
このようなモジュールを作成するには、適切な C++ コンパイラと必要なヘッダー (後者は通常 Node.js 自体に同梱されています) が必要です。たとえば、gcc、clang 、またはMSVC++などです。
N-APIはJava Native Interfaceに似ています。OpenHarmonyとArkTSもN-APIを採用しており、内部実装は書き直されています。[ 64 ]
2015年、より広範なNode.jsコミュニティのさまざまな支部が、ベンダーニュートラルなNode.js Foundationの下で活動を開始しました。この組織の目的は、「Node.jsの成功に投資するエコシステムによる参加、技術的貢献、および長期的な管理のためのフレームワークを奨励するオープンガバナンスモデルを通じて、Node.jsおよびその他の関連モジュールの普及を促進し、開発を加速すること」です。[ 65 ]
Node.js Foundation の技術運営委員会 (TSC) は、Node.js Foundation の技術的な統括機関です。TSC は、コア Node.js リポジトリと、それに依存する関連プロジェクトを担当しています。通常、TSC はこれらのプロジェクトの管理をワーキンググループまたは委員会に委任します。[ 66 ]長期サポートリリースを管理する LTS グループはそのようなグループの 1 つです。その他の現在のグループには、Web サイト、ストリーム、ビルド、診断、国際化、エバンジェリズム、Docker、アドオン API、ベンチマーク、事後分析、国際、ドキュメント、テストなどがあります。[ 67 ]
2017年8月、TSCメンバーの3分の1が、プロジェクトの行動規範に関する紛争を理由に辞任した。彼らは、複数の苦情が申し立てられていたメンバーをリーダーシップグループから解任するための投票が否決された後に辞任した。[ 68 ]