Node.jsモジュールシステム


Node.js ファイルが相互に呼び出せるようにするために、Node.js は単純なモジュール システムを提供します。

モジュールは Node.js アプリケーションの基本コンポーネントであり、ファイルとモジュールは 1 対 1 に対応します。言い換えれば、 Node.js ファイルはモジュールであり、JavaScript コード、JSON、またはコンパイルされた C/C++ 拡張機能などがあります。

モジュールを作成する

Node.js では、モジュールの作成は非常に簡単です。次のように、次のコードで「main.js」ファイルを作成します。

var hello = require('./hello');
hello.world();

上の例では、コード require('./ hello') が導入され、現在のディレクトリに hello.js ファイルが追加されます (./ は現在のディレクトリで、node.js のデフォルトのサフィックスは js です)。

Node.js は、exports と require の 2 つのオブジェクトを提供します。ここで、exports はモジュールによって公開されるインターフェイスであり、require はモジュールのインターフェイスを外部から取得するために使用されます。つまり、取得したモジュールのエクスポート オブジェクトです。

次に、hello.js ファイルを作成します。コードは次のとおりです:

exports.world = function() {
  console.log('Hello World');
}

上記の例では、hello.js は、exports オブジェクトを使用して、world をモジュールのアクセス インターフェイスとして使用し、main.js では require を使用します。 ('./hello ') してこのモジュールをロードすると、直接アクセスできます hello.js のエクスポート オブジェクトのメンバー関数について質問します。

オブジェクトをモジュールにカプセル化したい場合があります。その形式は次のとおりです:

module.exports = function() {
  // ...
}

例:

//hello.js 
function Hello() { 
	var name; 
	this.setName = function(thyName) { 
		name = thyName; 
	}; 
	this.sayHello = function() { 
		console.log('Hello ' + name); 
	}; 
}; 
module.exports = Hello;

この方法でオブジェクトを直接取得できます:

//main.js 
var Hello = require('./hello'); 
hello = new Hello(); 
hello.setName('BYVoid'); 
hello.sayHello();

モジュールインターフェースの唯一の変更点は次のとおりです。 use module.exports = Hello Exports.world = function(){} を置き換えました。 モジュールが外部参照される場合、そのインターフェイス オブジェクトは、元の Hello オブジェクトではなく、出力される Hello オブジェクトそのものになります。 輸出。


サーバー側モジュールをどこに配置するか?

コード内でモジュールを使用していることに気づいたかもしれません。このように:

var http = require("http");

...

http.createServer(...);

Node.js には「http」というモジュールが付属しており、コード内でそれをリクエストし、戻り値をローカル変数に割り当てます。

これにより、ローカル変数が、http モジュールによって提供されるすべてのパブリック メソッドを備えたオブジェクトに変わります。

Node.jsのrequireメソッドにおけるファイル検索戦略は以下の通りです:

Node.jsには4種類のモジュール(ネイティブモジュールと3種類のファイルモジュール)があるため、requireメソッドは非常にシンプルですが、内部ロードは非常に複雑であり、ロードの優先順位も異なります。以下の図に示すように:

nodejs-require

ファイル モジュール キャッシュからのロード

ネイティブ モジュールとファイル モジュールの優先順位は異なりますが、ファイル モジュール キャッシュからの既存のモジュールのロードよりも優先されません。

ネイティブ モジュールからのロード

ネイティブ モジュールの優先順位は、ファイル モジュール キャッシュの優先順位に次いで 2 番目です。ファイル名を解析した後、require メソッドはまずモジュールがネイティブ モジュール リストにあるかどうかを確認します。 http モジュールを例に挙げます。ディレクトリには http/http.js/http.node/http.json ファイルがありますが、require("http") はこれらのファイルからではなく、ネイティブ モジュールからロードされます。

ネイティブモジュールにもキャッシュ領域があり、こちらも最初にキャッシュ領域からロードされます。キャッシュ領域がロードされていない場合は、ネイティブ モジュール ロード メソッドが呼び出されてロードおよび実行されます。

ファイルからロード

ファイル モジュール キャッシュが存在せず、ネイティブ モジュールではない場合、Node.js は require メソッドで渡されたパラメーターを解析し、ファイル システムから実際のファイルをロードします。前のセクションで紹介したとおり、ここではファイル モジュールを見つけるプロセスについて詳しく説明します。知っておく価値のある詳細もいくつかあります。

require メソッドは、

  • http、fs、path などのネイティブ モジュールのパラメータを受け入れます。

  • ./mod または ../mod、相対パスを持つファイルモジュール。

  • /pathtomodule/mod、絶対パス付きのファイルモジュール。

  • mod、非ネイティブモジュール用のファイルモジュール。