Node.js は、今日最も注目されているテクノロジーの 1 つであるはずです。この記事ではNode.jsの特徴や活用シーンを中心に紹介します。
Node.js は、Chrome JavaScript ランタイム上に構築されたプラットフォームで、高速でスケーラブルな Web アプリケーションを簡単に構築できます。 Node.js はイベント駆動型のノンブロッキング I/O モデルを使用して軽量かつ効率的になるため、分散デバイス上で実行されるデータ集約型のリアルタイム アプリケーションに非常に適しています。
1. 特徴
1.1 非同期 I/O
いわゆる非同期 I/O は、同期 I/O に対して相対的なものです。プログラムの実行中は、ファイルの読み取りと書き込み、入出力、リクエストの応答など、多くの I/O 操作を実行する必要があります。一般に、I/O 操作は非常に時間がかかります。たとえば、従来のプログラミング モデルでは、数ギガバイトのファイルを読み取りたい場合、スレッド全体が一時停止し、ファイルが読み取られるのを待ってから続行します。つまり、I/O 操作によりコードの実行がブロックされ、プログラムの効率が大幅に低下します。
非同期 I/O については、Ajax リクエストの開始が最も一般的な「非同期」呼び出しであるため、フロントエンド エンジニアにとっては実は馴染みのないものではありません。 Node では、ファイルの読み取り (ファイルの読み取りは時間のかかる I/O 操作です) を例として挙げますが、これは Ajax リクエストを開始する方法と非常に似ています。
上記のコードが fs.readFile を呼び出した後、すぐに後続のコードが実行されますが、「ファイルの読み取りが完了する」瞬間は予測できません。スレッドが I/O 操作に遭遇すると、ブロック的な方法で I/O 操作が終了するのを待つことはなく、I/O リクエストをオペレーティング システムに送信し、後続のステートメントの実行を続行します。オペレーティング システムは I/O 操作を完了すると、I/O 操作を実行しているスレッドにイベントの形式で通知し、スレッドは特定の時間にイベントを処理します。
1.2 イベントループとコールバック関数
いわゆるイベント ループとは、ノードがすべての非同期操作を解決するためにイベント メカニズムを使用することを意味し、イベント キューを継続的にチェックするスレッドが存在します。イベント ループは、プログラムが終了するまで、イベント キューに未処理のイベントがないかチェックします。イベント プログラミング手法には、軽量、疎結合、トランザクション ポイントのみに焦点を当てるという利点がありますが、複数の非同期タスクのシナリオでは、イベントは互いに独立しており、どのように連携するかが問題になります。 Javascript ではコールバック関数があらゆる場所にあり、コールバック関数は非同期呼び出しから返されたデータを受け取る最良の方法です。
1.3 シングルスレッド
ノードはブラウザ内の JS のシングルスレッド特性を維持します。シングルスレッドの最大の利点は、マルチスレッド プログラミングのような状態同期の問題を心配する必要がないことです。デッドロックやスレッド コンテキストの切り替えのオーバーヘッドがありません。シングルスレッドには、主に 3 つの側面で弱点もあります。1 つは、マルチコア CPU を利用できないこと、エラーが発生するとアプリケーション全体が終了すること、およびアプリケーションの堅牢性が大量の CPU を占有することです。非同期 I/O の呼び出しを継続できなくなります。
上記の問題を解決するために、Node は HTML5 Web Workers と同じ考え方を採用し、child_process を使用してシングルスレッドでの計算量が多いという問題を解決します。計算をさまざまなサブプロセスに分散し、プロセス間でイベント メッセージを通じて結果を伝達することで、多数の計算を分割できます。
1.4 クロスプラットフォーム
ノードはクロスプラットフォームです。つまり、同じ JS コードのセットを Windows、Linux、OSX、およびその他のプラットフォームにデプロイして実行できます。これは主に、Node がオペレーティング システムと Node の上位モジュール システムの間にプラットフォーム層アーキテクチャ libuv を構築しているためです。
2. アプリケーションシナリオ
1)、リアルタイム アプリケーション: オンライン チャット、リアルタイム通知プッシュなど (socket.io など)
2) 分散アプリケーション: 効率的な並列 I/O を通じて既存のデータを使用します
3) ツール アプリケーション: フロントエンドの圧縮展開 (grunt など) から大規模なデスクトップ グラフィカル インターフェイス アプリケーション
まで、多数のツール
4) ゲーム アプリケーション: ゲーム分野にはリアルタイム性と同時実行性に対する高い要件があります (NetEase の pomelo フレームワークなど)
5). 安定したインターフェイスを使用して Web レンダリング機能を向上させます
6) 統合されたフロントエンドとバックエンドのプログラミング言語環境: フロントエンド開発者は、サーバーサイド開発 (有名な純粋な Javascript フルスタック MEAN アーキテクチャなど)