基本概念
Node.js 、またはノードは、 JavaScriptサーバー側で実行できるプラットフォームです。 Node.js javascriptのモジュール開発を開拓したと言えます。初期のjavascript要件は非常に単純で、基本的に機能として書かれており、プロセス指向のライティングが続きました。その後、オブジェクト指向の開発のアイデアが徐々に導入され、その後ゆっくりとクラスに書き込まれました。最後に、node.jsの出現は、JSモジュール開発の概念を持ち始めました。これにより、紛争の命名やその他の開発問題などの肥大化したjsコードが排除されました。
Node最大の特徴は、非同期I/Oとイベント駆動型のアーキテクチャデザインの採用です。 Node.jsは、JSがブラウザの外で実行できるようにするプラットフォームです。その最初の目標は、イベント駆動型の非ブロッキングI/O Webサーバーを実装することです
Node.jsは、単なるJavaScript running環境(またはライブラリのセット)であり、標準のjsに非同期IOの関数、つまりネットワークとファイルの読み取りと書き込みを補完します。
ライブラリとして、それはチューンAPIにすぎません。わずかに反人間のイベントコールバックに加えて、それは他のバックエンド言語(PHP、Python)とそれほど違いはありません。
Node.js単一のスレッドモードを使用します。各スレッドは関数を完了します。プロセスには複数のスレッドがあります。すべてのI/OSは、非同期リクエスト方法で使用されます。各非同期I/O要求が完了すると、イベントキューにプッシュされ、プログラムプロセスが処理されるのを待ちます。
要するに、 nodeの中心的なアイデアは、ノンブロッキング、シングルスレッド、イベント駆動型です。 (同期はブロッキングに対応し、非同期は非ブロッキングに対応します)
Node.JSアーキテクチャ図
シングルスレッド
javascript言語の実行環境は「シングルスレッド」です。
いわゆる「シングルスレッド」は、1つのタスクを一度にしか完了できないことを意味します。複数のタスクがある場合は、キューを塗り、以前のタスクを完了し、次のタスクを実行するなどする必要があります。
このモデルの利点は、実装が比較的簡単であり、実行環境が比較的簡単であることです。欠点は、長い時間がかかるタスクがある限り、後続のタスクを整理し、プログラム全体の実行を遅らせる必要があることです。一般的なブラウザは、特定のJavascriptコードが長い間実行されているため(デッドループなど)、この場所にページ全体を貼り付け、他のタスクを実行できないため、多くの場合、反応しません(偽の死)。
ほとんどのWebアプリケーションのボトルネックはI/O 、つまり、ディスクの読み取りと書き込み、ネットワークの読み取りと書き込み、およびデータベースの読み取りと書き込みです。この期間を待つために使用する戦略は、パフォーマンスを改善するための重要なポイントになりました
同期および非同期
この問題を解決するために、 Javascript言語は、タスクの実行モードを同期(同期)と非同期(非同期)の2つのタイプに分割します。
「同期モード」は、前のセクションのモードです。後者のタスクは、前のタスクが終了してから実行されるのを待ちます。プログラムの実行順序は一貫しており、タスクの配置順序と同期しています。 「非同期モード」は完全に異なります。各タスクには、1つ以上のコールバック関数( callback )があります。前のタスクが終了した後、それは次のタスクではありませんが、コールバック関数が実行されます。後者のタスクは、前のタスクが終了するのを待たずに実行されるため、プログラムの実行命令は、タスクの配置順序と一貫性があり、非同期です。
「非同期モード」は非常に重要です。ブラウザ側では、ブラウザが応答を失うことを避けるために、長期操作を非同期に実行する必要があります。最良の例は、AJAX操作です。サーバー側では、「非同期モード」は唯一のモードです。実行環境はシングルスレッドであるため、すべてのhttp要求を同期的に実行できる場合、サーバーのパフォーマンスは急激に低下し、すぐに応答が失われます。
プロセスとスレッド
Macシステムのプロセスとスレッド
図から、プロセスには複数のスレッドが含まれることがわかります。プロセスは、プロジェクトのワークショップのようなものです。スレッドはこのワークショップの労働者です。スレッドを導入するオペレーティングシステムでは、通常、リソースを割り当てるための基本ユニットとしてプロセスを使用し、独立した操作と独立したスケジューリングの基本ユニットとしてスレッドを使用します。スレッドはプロセスよりも小さく、基本的にシステムリソースを所有していないため、スケジューリングのオーバーヘッドははるかに小さくなり、システム内の複数のプログラム間の同時実行の程度をより効率的に改善できます。
違い
スレッドとプロセスの違いは、子プロセスと親プロセスが異なるコードとデータスペースを持っていることです。複数のスレッドがデータスペースを共有している一方で、各スレッドには実行コンテキスト用の独自の実行スタックとプログラムカウンターがあります。マルチスレッドは、主にCPU時間を節約し、特定の状況に応じて使用するために使用されます。コンピューターのメモリリソースとCPUは、スレッドの実行中に使用する必要があります。
モジュールとパッケージモジュール
モジュール:特定の特定の関数を実装してモジュラープログラミングを実装するファイル。 [モジュール名](モジュール名)を介してモジュールを紹介します。
- モジュール(変数、関数など)の関数は、 exportsオブジェクトにプロパティを割り当てることにより、発信者に提供されます。
モジュールの使用方法は?
ノードでモジュールを使用すると非常に便利です。 JavaScriptコードでは、グローバル関数require()を使用してモジュールをロードできます。たとえば、 nodeに付属のHTTPサーバーモジュールをロードするには、 require("http")を使用できます。
バッグ
パッケージ:パッケージは、リリース、更新、依存関係管理、およびバージョン制御のためにモジュールをカプセル化するフォルダーです。 Package.jsonを介してパッケージ情報を説明する:エントリファイル、依存関係外部パッケージなど。NPM npm installコマンドを介してパッケージをインストールし、 require順にパッケージを使用します。
非同期I/Oおよびイベント駆動型
Node.jsの非同期メカニズムはイベントベースです。各I/Oはリクエストです。すべてのディスクI/O 、ネットワーク通信、およびデータベースクエリは、非ブロッキング方法で要求されます。返された結果は、イベントループによって処理されます。下の図に示すように:
Node.jsプロセスは、1つのイベントのみを同時に処理し、すぐにイベントループを入力して、完了後に後続のイベントを確認および処理します。これの利点は、CPUとメモリが同時に存在し、1つのことを集中化しながら、時間のかかるI/O操作を可能な限り並行して実行できるようにすることです。
ノードプログラミングを開始します
ここでは、 node.js開発にwebstormを使用することをお勧めします。これは便利で高速で、MACの下でのCMDや端子よりもはるかに使いやすいです。
ノードのインストールについては、自分でBaiduをお願いします。ここでは詳しく説明しません。 webstormの下のノードプログラミングインターフェイスを見てみましょう。
書かれたノードコードインターフェイスを右クリックして[実行]をクリックするだけです。これは便利で高速です
以下は、ノードの出力インターフェイスです。
Macシステムでは、使用する3つのツール、CODA2、Webstorm、Sublime Text3をお勧めします。これらは私がこれまでに持っている最高の開発ツールです。どちらがあなたの好みに沿っているかを試してみることもできます。
webstormのノード開発には、最初に特定のファイルを構成する必要があります。誰もがそれをするためにバイドゥを使うべきです。私のwebstormが構成されているため、ステップを表示するためにスクリーンショットを撮ることはできません。一般的な手順は次のとおりです。MACシステムの下で、最初に上部バーのwebstormをクリックしてから、 perferenceをクリックしてから、 Node.js and NPMをクリックし、右側の構成をクリックすると、次のようになります。
windowsシステムの下でのプロセスの手順は、このプロセスとほぼ類似しています。私が使用するバージョンは8.0.4です。
グローバル変数
JSプログラミングでは、Global NameSpaceを汚染し、コードカップリングのリスクを高めることを避けるために、各変数にVARキーワードを追加することをお勧めします。
コンソール
consoleは、文字を標準の出力ストリームstandout (STDOUT)および標準エラーストリーム(STDERR)に出力するために使用されます。
console.log()文字を標準の出力ストリームに印刷し、複数のパラメーターを受け入れ、c-like printf()形式で出力される新しいラインで終了します
console.log(__dirname)输出文件目录コードの実行時間を計算します
console.time(label) console.timeEnd(label)最初と最後に同じラベルを指定し、実行時間を中央で計算するコードを配置するだけです。
__filenameおよび__dirname
console.log(__filename);// /Users/hwax/Desktop/My Project/avalon/hello.js console.log(__dirname);// /Users/hwax/Desktop/My Project/avalon