ホームページ > 記事 > ウェブフロントエンド > Node.jsの基礎知識を詳しく紹介
数年前、あなたはフロントエンドの学習から気が散ってしまうことを恐れて、NodeJS の学習をためらっていたかもしれません。しかし今はnodeJSを学ばないとフロントエンドの学習が進まないかもしれません。テクノロジーの進歩は本当に残酷です。新しいテクノロジーを様子見していると、そのテクノロジーはすでに普及しています。この記事では、nodeJS の基本的な知識を紹介します
Ryan Dahl は、Node を作成する前の主な仕事は高性能 Web サーバーを中心にしていました。いくつかの試みと失敗を経て、彼は高性能 Web サーバーを設計するためのいくつかの重要なポイントを発見しました。それは、イベント駆動型、ノンブロッキング I/O、そしてこれらが、nodejs の 2 つの主要な特性です
つまり、Ryan Dahl の最初の目標は、Web を書くことでしたイベント駆動型のノンブロッキング I/O に基づいたサーバーにより、より高いパフォーマンスを実現し、Apache などのサーバーの代替手段を提供します。 Ryan Dahl 氏は、Node を作成する際に、代替実装として C、Lua、Haskell、Ruby などの言語を評価し、C は開発の敷居が高く、多くの開発者が日常的に使用できないことが予想されると結論付けました。ビジネス開発は放棄する; Ryan Dahl は、Haskell では十分ではないと感じたため、Lua 自体にすでに多くのブロッキング I/O ライブラリが含まれており、そのためのノンブロッキング I/O ライブラリを構築しても人々の意見を変えることはできない。ブロッキング I/O ライブラリの使用を継続したため、これも放棄しました。パフォーマンスが悪いため、Ruby の仮想マシンは選択されませんでした
それに比べて、JavaScript は C よりも開発の敷居が低く、Lua よりも歴史的な問題が少ないです。 。サーバーサイド JavaScript は長年存在していましたが、バックエンド部分の市場は存在しませんでした。歴史的な問題はなく、ノンブロッキング I/O ライブラリをインポートすることにさらなる抵抗はありません。それ。さらに、JavaScript にはブラウザーでの幅広いイベント駆動型アプリケーションがあり、これはイベント駆動型のニーズに対する Ryan Dahl の好みと一致しています。当時、第二次ブラウザ戦争は徐々に終焉を迎え、Chrome ブラウザの JavaScript エンジン V8 が性能 No.1 の称号を獲得しました。パフォーマンスが高い、イベント駆動である、歴史的な影響がないという 3 つの主な理由を考慮して、JavaScript が Node の実装言語になりました
最初、Ryan Dahl は自分のプロジェクトを web.js と呼びました。しかし、このプロジェクトは、単に Web サーバーを開発するという彼の当初のアイデアを超えて進化し、サーバー、クライアント、コマンドなど、より多くのものをその上に構築できるように、ネットワーク アプリケーションを構築するための基本的なフレームワークになりました。ラインツールなど。 Node は、リソースの共有を強制しないシングルスレッド、シングルプロセスのシステムに開発されており、ネットワークに非常に適したライブラリが含まれており、大規模な分散アプリケーションを構築するためのインフラストラクチャを提供します。高速でスケーラブルなネットワーク アプリケーションを構築します。それ自体は非常にシンプルであり、通信プロトコルを通じて多くのノードを組織し、大規模なネットワーク アプリケーションを構築するという目的を達成するために拡張するのが非常に簡単です。各 Node プロセスは、このネットワーク アプリケーションのノードを構成します。これがその名前の本当の意味です
Node は、バックエンド JavaScript の実行プラットフォームとして、書き換えることなく、フロントエンド ブラウザー JavaScript の使い慣れたインターフェイスを保持します。言語自体の機能はすべて、スコープとプロトタイプ チェーンに基づいています。違いは、フロントエンドで広く使用されているアイデアをサーバー側に移行することです。他の言語と比較した Node の特徴は次のとおりです。 1. 非同期 I/O: Node では、ほとんどの操作が非同期で呼び出されます。 Ryan Dahl はすべての困難を克服し、ファイルの読み取りからネットワーク リクエストなどに至るまで、最下位レベルで多くの非同期 I/O API を構築しました。この重要な点は、Node では言語レベルから並列 I/O 操作を自然に実行できることです。各呼び出しの間に、前の I/O 呼び出しが完了するのを待つ必要はありません。プログラミング モデルの効率を大幅に向上させることができます
2 つのファイル読み取りタスクを同時に実行する場合を例にとると、非同期 I/O は最も遅いファイル読み取り時間に依存しますが、同期 I/O は 2 つの所要時間の合計がかかります。それぞれのタスク。ここで非同期によってもたらされる利点は明白です
2. イベント
Web 2.0時代の到来により、JavaScriptがフロントエンドでより多くの役割を担うようになり、イベントも広く使用されるようになりました。 NodeはRhinoほどJavaの影響を強く受けておらず、代わりにフロントエンドブラウザで広く使われている成熟したイベントをバックエンドに導入し、非同期I/Oと連携し、イベントポイントをビジネスロジックに公開します
イベントプログラミング。メソッドはMagnitudeが軽く、互換性があり、トランザクションポイントのみに焦点を当てているなどがあります。しかし、複数の非同期タスクのシナリオでは、イベントが互いに独立しているため、どのように連携するかが問題になります
3.コールバック関数
他のものと。 Web バックエンド エンドツーエンドのプログラミング言語と比較すると、非同期およびイベントに加えて、コールバック関数が Node の主要な機能です。全体的に見ると、コールバック関数は、非同期呼び出しによって返されたデータを受け入れる最良の方法でもあります。ただし、このプログラミング方法は、同期プログラミングに慣れている多くの人にとっては非常に馴染みのないものかもしれません。コードが書かれる順序は、コードが実行される順序とは無関係であるため、読みにくくなる可能性があります。プロセス制御に関しては、非同期メソッドやコールバック関数が点在するため、従来の同期メソッドに比べて明確さが失われます
4.シングルスレッド
JavaScript 言語の主な特徴は、シングルスレッドであることです。つまり、一度に 1 つのことしか実行できません。 JavaScript は、その目的に応じてシングルスレッドです。ブラウザーのスクリプト言語としての JavaScript の主な目的は、ユーザーと対話し、DOM を操作することです。これにより、シングルスレッドのみが可能であることが決まります。そうでない場合は、非常に複雑な同期の問題が発生します。たとえば、JavaScript に同時に 2 つのスレッドがあるとします。1 つのスレッドが特定の DOM ノードにコンテンツを追加し、もう 1 つのスレッドがそのノードを削除するとします。この場合、ブラウザーはどちらのスレッドを使用すればよいでしょうか。したがって、複雑さを避けるために、JavaScriptは誕生以来シングルスレッドであり、これがこの言語の中核機能となっています
Nodeはブラウザ内でJavaScriptのシングルスレッド特性を維持します。また、Node では、JavaScript は他のスレッドと状態を共有できません。シングル スレッドの最大の利点は、マルチスレッド プログラミングのような状態の同期の問題を心配する必要がないことです。同様に、シングル スレッドでもデッドロックが発生せず、パフォーマンスのオーバーヘッドも発生しません。には、特に次の 3 つの点で弱点があります。マルチコア CPU が使用できないこと、エラーが発生するとアプリケーション全体が終了すること、およびアプリケーションの堅牢性が CPU を占有することになります。非同期 I/O を呼び出し続けることは不可能です
スレッドを共有するブラウザーの JavaScript と UI と同様に、JavaScript を長時間実行すると、UI のレンダリングと応答が中断されます。 Nodeでは、長時間のCPU使用により、後続の非同期I/O呼び出しも発行できなくなり、完了した非同期I/Oのコールバック関数の実行が間に合わなくなります
HTML5はWebの標準をカスタマイズしましたワーカー: Web ワーカーは、大規模な JavaScript 計算が UI レンダリングをブロックする問題を解決するための計算を実行するワーカー スレッドを作成できます。メインスレッドをブロックしないように、作業スレッドはメッセージパッシングを通じて実行結果を提供します。これにより、作業スレッドがメインスレッドの UI にアクセスすることも防止され、大量の計算を解決するために Web ワーカーと同じ考え方が採用されます。問題は、child_process です。 サブプロセスの出現は、Node がシングルスレッドの堅牢性とマルチコア CPU を利用できない問題に冷静に対処できることを意味します。計算を個々のサブプロセスに分散することで、多数の計算を分割し、その結果をプロセス間のイベント メッセージを通じて伝達できるため、アプリケーション モデルをシンプルで依存性の低いものに保つことができます。マスターワーカー管理手法により、各作業プロセスを適切に管理して、より高い堅牢性を実現することもできます
アプリケーションシナリオ
テクノロジーを選択する前に、結局のところ、新しいテクノロジーがどのようなシーンに適しているかを理解する必要があります。適切なテクノロジーを適切なシーンで使用すると、予期しない効果が生じる可能性があります。 Nodeに関して最も議論されているのはI/O集約型とCPU集約型です
すべてのスクリプト言語が1か所で判断されるのであれば、シングルスレッドの観点からということになります。 , Node の I/O 処理能力は高く評価されるに値します。一般に、Node が I/O 集中型のアプリケーション シナリオに優れていると言うことに基本的に異論はありません。 Nodeはネットワーク指向で並列I/Oに優れており、より多くのハードウェアリソースを効果的に編成してより良いサービスを提供できます
I/O集約型の主な利点は、Nodeが開始する代わりにイベントループの処理能力を使用することです各 1 つのスレッドが各リクエストを処理し、占有リソースは非常に少ない
2. CPU 集中型
別の観点から見ると、Node は CPU 集中型のアプリケーション シナリオに対応できるでしょうか?実際、V8 の実行効率は非常に高いです。実行効率だけで判断すると、V8 の実行効率が優れていることは間違いありません
CPU を大量に使用するアプリケーションが Node にもたらす主な課題は次のとおりです: JavaScript のシングルスレッドの性質により、長時間実行される計算 (大規模な計算など) がある場合ループ) を実行すると、CPU タイム スライスを解放できなくなり、後続の I/O を開始できなくなります。ただし、大規模なコンピューティング タスクを適切に調整して複数の小さなタスクに分解すると、I/O 呼び出しの開始をブロックすることなく、コンピューティングをタイムリーに解放できるようになり、並列非同期 I/O の利点を享受できます。 CPUを最大限に活用しましょう
以上がNode.jsの基礎知識を詳しく紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。