この記事では、開発者向けの Node.js の 4 つの重要なポイントをまとめています。
1. ノンブロッキングまたは非同期 I/O
Node.js はサーバー側のフレームワークであるため、その主な仕事の 1 つはブラウザーのリクエストを処理することです。従来の I/O システムでは、各リクエストは前のリクエストが到着した後に発行されます。したがって、これはブロッキング I/O と呼ばれます。サーバーは現在のリクエストを処理する他のリクエストをブロックするため、ブラウザは待機します。
Node.js はこの方法では I/O を処理しません。リクエストの処理に時間がかかる場合、Node.js はリクエストをイベント ループに送信し、コール スタック内の次のリクエストの処理を続行します。遅延リクエストが処理されると、Node.js に通知され、ブラウザーが応答します。
以下では例を使用して説明します。
I/O をブロックしています
// take order for table 1 and wait... var order1 = orderBlocking(['Coke', 'Iced Tea']); // once order is ready, take order back to table. serveOrder(order1); // once order is delivered, move on to another table. // take order for table 2 and wait... var order2 = orderBlocking(['Coke', 'Water']); // once order is ready, take order back to table. serveOrder(order2); // once order is delivered, move on to another table. // take order for table 3 and wait... var order3 = orderBlocking(['Iced Tea', 'Water']); // once order is ready, take order back to table. serveOrder(order3); // once order is delivered, move on to another table.
このレストランの例では、ウェイターはメニューの指示を受け取り、食事が処理されるのを待ち、食事が処理された後に食事をテーブルに運びます。ウェイターは自分の食事が処理されるのを待っている間、他の顧客のメニュー注文を拒否していました。
ノンブロッキング I/O
// take order for table 1 and move on... orderNonBlocking(['Coke', 'Iced Tea'], function(drinks){ return serveOrder(drinks); }); // take order for table 2 and move on... orderNonBlocking(['Beer', 'Whiskey'], function(drinks){ return serveOrder(drinks); }); // take order for table 3 and move on... orderNonBlocking(['Hamburger', 'Pizza'], function(food){ return serveOrder(food); });
ノンブロッキング モードでは、ウェイターは受け取ったメニューの指示をシェフに通知し、次のテーブルの指示を受け取ります。最初のテーブルの食事が終わると、彼はそのテーブルに料理を提供し、引き続き他のゲストから指示を受けます。このようにして、ウェイターは指示をブロックして時間を無駄にすることがなくなります。
2. プロトタイプ
プロトタイプは、JS における複雑な概念です。 Java や C++ などの一般的な継承メカニズム言語では、コードの再利用を実現するには、まずクラスを作成し、それからオブジェクトを生成するか、クラス拡張を通じてオブジェクトを生成する必要があります。しかし、JS には同様のクラスの概念がありません。 JS でオブジェクトを作成した後、そのオブジェクトを拡張するか、それを通じて新しいオブジェクトを作成する必要があります。これをプロトタイプ継承と呼びます。
各 JS オブジェクトはプロトタイプ オブジェクトに接続され、そのオブジェクトのプロパティを継承します。各オブジェクトは、事前定義された JS Object.prototype に関連付けられます。 obj.propName または obj['propName'> を通じてオブジェクト プロパティを検索しても失敗した場合は、obj.hasOwnProperty('propName') を通じて検索を試みることができます。物体。プロパティがプロトタイプ チェーンに存在しない場合は、未定義の値が返されます。
次の例で説明してみましょう:
if (typeof Object.create !== 'function') { Object.create = function (o) { var F = function () {}; F.prototype = o; return new F(); }; var otherPerson = Object.create(person);
新しいオブジェクトを作成するときは、プロトタイプベースのオブジェクトを選択する必要があります。ここでは、オブジェクト関数に create メソッドを追加しました。 create メソッドは、別のオブジェクトに基づいてオブジェクトを作成し、それをパラメーターとして渡します。
新しいオブジェクトを変更しても、そのプロトタイプは変更されません。ただし、プロトタイプ オブジェクトを変更すると、その変更はそのプロトタイプに基づくすべてのオブジェクトに影響します。
3. モジュール
Java でパッケージを使用したことがある場合、Node.js コンポーネントは似ています。そうでない場合でも、心配する必要はありません。コンポーネントは実際には、特定の機能を実装するために使用される単純な JS ファイルです。コンポーネント パターンの目的は、作業を容易にすることです。コンポーネントを使用するには、JAVA でパッケージをインポートするのと同じように、JS ファイルをインポートする必要があります。 Node.js には 2 種類のコンポーネントがあります
コア モジュール - コア モジュールは、Node.js ライブラリと連携してプリコンパイルされています。その目的は、プログラマが頻繁に使用する機能を公開し、作業の重複を避けることです。共通のコアコンポーネントには、HTTP、URL、EVENTS、FILE SYSTEM などが含まれます。
ユーザー定義モジュール (UserDefined Modules) - ユーザー定義モジュールは、特定の機能を実装するためにユーザーに提供されるコンポーネントです。コア コンポーネントだけではプログラマのニーズを満たすのに十分ではない場合、カスタム コンポーネントが役に立ちます。
コンポーネントは require 関数を通じて抽出されます。これがコア コンポーネントの場合、パラメータはコンポーネント名です。これがユーザー定義コンポーネントの場合、パラメータはファイル システム内のコンポーネント パスです。例:
// extract a core module like this var http = require('http); // extract a user defined module like this var something = require('./folder1/folder2/folder3/something.js');
4. 回调(Callbacks)
在JS中,函数是第一类对象。也就是说你可以像对常规对象那样对函数进行所有操作。例如指派函数到一个变量,把这些作为参数传给方法,把它们声明为对象的属性,甚至是把它们从函数里返回。
回调在JS中是异步函数,可以作为参数传递给其它函数或从其它函数里执行或返回而后再执行。这是回调的基本概念。
当我们把一个回调函数作为参数传递给另外的函数时,我们传递的仅仅是函数的定义;换言之,我们不会知道回调函数的执行时间。这完全依赖于回调函数机制。它会在稍后某个时间点进行回调调用。这是Node.js的非阻塞或异步行为的基本概念,可用下例进行说明:
setTimeout(function() { console.log("world"); }, 2000) console.log("hello");
这是一个最简单的调用。我们把一个匿名函数作为参数进行传递,作用是为setTimeout函数进行控制台的输出记录登记。因为这仅仅是个函数定义,我们不知道函数何时会被执行。这取决于setTimeout函数的second参数,即2S后。
首先,second记录语句记录了对控制台的输出,2S后,在回调函数中的记录语句记录了输出的内容。
// output hello world
写在最后
以上4点对Node.js开发者来说是要彻底理解和掌握的,建议多动手来好好体会这4个要点的含义。