Node.js ファイルが相互に呼び出せるようにするために、Node.js は単純なモジュール システムを提供します。
モジュールは Node.js アプリケーションの基本コンポーネントであり、ファイルとモジュールの間には 1 対 1 の対応関係があります。 言い換えれば、Node.js ファイルはモジュールであり、JavaScript コード、JSON、またはコンパイルされた C/C++ 拡張機能である可能性があります。
Node.js では、モジュールのインポートは非常に簡単です。main.js ファイルを作成し、hello モジュールをインポートします。コードは次のとおりです。
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のexportsオブジェクトのメンバー関数に問い合わせます。
オブジェクトをモジュールにカプセル化したい場合があります。その形式は次のとおりです。
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();
モジュール インターフェイスの唯一の変更は、exports.world = function(){} の代わりに module.exports = Hello を使用することです。 モジュールが外部から参照される場合、そのインターフェイス オブジェクトは、元のエクスポートではなく、エクスポートされる Hello オブジェクト自体になります。
お気づきかと思いますが、コード内ですでにモジュールを使用しています。 このように:
var http = require("http");
...
http.createServer(...);
Node.js には http というモジュールが付属しており、コード内でそれをリクエストし、戻り値をローカル変数に割り当てます。
これにより、ローカル変数が、http モジュールによって提供されるすべてのパブリック メソッドを備えたオブジェクトに変わります。
Node.js の require メソッドのファイル検索戦略は次のとおりです。
Node.jsには4種類のモジュール(ネイティブモジュールと3種類のファイルモジュール)があるため、requireメソッドは非常にシンプルですが、内部の読み込みは非常に複雑で、読み込みの優先順位も異なります。
ネイティブ モジュールとファイル モジュールの優先順位は異なりますが、常に最初にファイル モジュールのキャッシュから既存のモジュールを読み込みます。
ネイティブ モジュールの優先順位は、ファイル モジュール キャッシュの優先順位に次いで 2 番目です。 require メソッドは、ファイル名を解析した後、まずモジュールがネイティブ モジュール リストにあるかどうかを確認します。 http モジュールを例にとると、ディレクトリには http/http.js/http.node/http.json ファイルがありますが、require("http") はこれらのファイルからではなく、ネイティブ モジュールからロードされます。
ネイティブ モジュールにもキャッシュ領域があり、最初にキャッシュ領域からロードされます。 キャッシュ領域がロードされていない場合は、ネイティブモジュールのloadingメソッドを呼び出してロードして実行します。
ファイル モジュール キャッシュが存在せず、ネイティブ モジュールではない場合、Node.js は require メソッドによって渡されたパラメータを解析し、ファイル システムから実際のファイルをロードします。ロード プロセス中のパッケージ化とコンパイルの詳細これは最初のセクションで紹介しましたが、ここではファイル モジュールを見つけるプロセスを詳しく説明しますが、知っておく価値のある詳細がいくつかあります。
require メソッドは次のパラメータを受け入れます:
パス Y で require(X) ステートメントの実行シーケンスを実行します。
1. X が組み込みモジュールの場合
a. 組み込みモジュールを返却する
b. 実行を停止する
2. X が「/」で始まる場合
a. Y をファイルのルート パスとして設定します
3. X が './' または '/' または '../' で始まる場合
a. LOAD_AS_FILE(Y + X)
b. LOAD_AS_DIRECTORY(Y + X)
4. LOAD_NODE_MODULES(X, dirname(Y))
5. "not found"という例外がスローされる
LOAD_AS_FILE(X)
1. X がファイルの場合、X を JavaScript テキストとしてロードし、実行を停止します。
2. X.js がファイルの場合、X.js を JavaScript テキストとしてロードし、実行を停止します。
3. X.json がファイルの場合、X.json を JavaScript オブジェクトに解析し、実行を停止します。
4. X.node がファイルの場合、X.node をバイナリ プラグインとしてロードし、実行を停止します。
LOAD_INDEX(X)
1. X/index.js がファイルの場合、X/index.js を JavaScript テキストとしてロードし、実行を停止します。
2. X/index.json がファイルの場合、X/index.json を JavaScript オブジェクトに解析し、実行を停止します。
3. X/index.node がファイルの場合は、X/index.node をバイナリ プラグインとしてロードし、実行を停止します。
LOAD_AS_DIRECTORY(X)
1. X/package.json がファイルの場合、
a. X/package.json を解析し、「main」フィールドを探します。
b. let M = X + (json main 字段)
c. LOAD_AS_FILE(M)
d. LOAD_INDEX(M)
2. LOAD_INDEX(X)
LOAD_NODE_MODULES(X, START)
1. let DIRS=NODE_MODULES_PATHS(START)
2. for each DIR in DIRS:
a. LOAD_AS_FILE(DIR/X)
b. LOAD_AS_DIRECTORY(DIR/X)
NODE_MODULES_PATHS(START)
1. let PARTS = path split(START)
2. let I = count of PARTS - 1
3. let DIRS = []
4. while I >= 0,
a. if PARTS[I] = "node_modules" CONTINUE
b. DIR = path join(PARTS[0 .. I] + "node_modules")
c. DIRS = DIRS + DIR
d. let I = I - 1
5. return DIRS
exports と module.exports の使用
プロパティやメソッドを外部に公開したい場合は、exports を使用できます。オブジェクト (多くのプロパティやメソッドを含むクラスと同様) を公開したい場合は、次を使用できます。 module.exports 。