LiaoXuefengウェブサイトノート
モジュールを理解する
まず、hello.jsファイルを作成しました。このhello.jsファイルはモジュールであり、モジュールの名前はファイル名(.jsサフィックスを削除)であるため、hello.jsファイルはhelloという名前のモジュールです。
hello.jsを変更し、関数を作成して、他の場所でこの関数を呼び出すことができるようにします。
'use strict';
var s = 'Hello';
function greet(name) {
console.log(s + ', ' + name + '!');
}
module.exports = greet;
関数greet()
はhelloモジュールで定義されています。最後の行は、他のモジュールが関数を使用できるように、関数greetがモジュールの出力として公開されることを意味しgreet
ます。
main.jsファイルを作成しgreet
、helloモジュールの関数を呼び出します。
'use strict';
// 引入hello模块:
var greet = require('./hello');
var s = 'Michael';
greet(s); // Hello, Michael!
helloモジュールの導入では、ノードが提供するrequire関数を使用することに注意してください。
var greet = require('./hello');
インポートされたモジュールは変数として変数に保存されます。greet
実際、変数greet
はhello.jsでmodule.exports = greet;
出力するために使用するgreet
関数です。したがって、main.jsはhello.jsモジュールで定義されたgreet()
関数を正常に参照し、それを直接使用できます。
require()を使用してモジュールをインポートするときは、モジュールの相対パスに注意してください。main.jsとhello.jsは同じディレクトリにあるため、現在のディレクトリを使用します。
var greet = require( './ hello'); //相対ディレクトリを書き込むことを忘れないでください!
モジュール名のみを書き込む場合:
var greet = require('hello');
次に、Nodeは組み込みモジュール、グローバルモジュール、現在のモジュールの下でhello.jsを順番に検索し、エラーが発生する可能性があります。
module.js
throw err;
^
Error: Cannot find module 'hello'
at Function.Module._resolveFilename
at Function.Module._load
...
at Function.Module._load
at Function.Module.runMain
このエラーが発生した場合は、以下を確認する必要があります。
- モジュール名が正しく記述されているかどうか。
- モジュールファイルが存在するかどうか。
- 相対パスが正しく記述されているかどうか。
CommonJS仕様
このモジュールロードメカニズムは、CommonJS仕様と呼ばれます。この仕様では、各.jsファイルはモジュールであり、その中で使用される変数名と関数名は互いに競合しません。たとえば、hello.jsとmain.jsはどちらもグローバル変数を宣言しますがvar s = 'xxx'
、互いに影響はありません。
モジュールが変数を外部に公開したい場合(関数は変数でもあります)、それを使用できますmodule.exports = variable;
。モジュールが他のモジュールによって公開された変数を参照する必要がある場合、モジュールを参照する変数var ref = require('module_name');
を取得できます。
結論として
モジュール内で変数を外部に出力するには、次を使用します。
module.exports = variable;
出力変数は、任意のオブジェクト、関数、配列などにすることができます。
他のモジュールによって出力されたオブジェクトをインポートするには、次を使用します。
var foo = require('other_module');
インポートされる特定のオブジェクトは、インポートされたモジュールによって出力されるオブジェクトによって異なります。
深い理解
ノードは最初にオブジェクトを準備できますmodule
:
// 准备module对象:
var module = {
id: 'hello',
exports: {
}
};
var load = function (module) {
// 读取的hello.js代码:
function greet(name) {
console.log('Hello, ' + name + '!');
}
module.exports = greet;
// hello.js代码结束
return module.exports;
};
var exported = load(module);
// 保存module:
save(module, exported);
つまり、変数module
は、jsファイルをロードする前にNodeによって準備され、ロード関数に渡される変数です。この変数をhello.jsmodule
で直接使用できる理由は、実際には関数のパラメーターであるためです。module.exports = greet;
パラメータmodule
をload()
関数に渡すことにより、hello.jsは変数をノード実行環境に正常に渡し、ノードはmodule
変数をどこかに保存します。
Nodeはインポートされたすべてを格納module
するrequire()
ためmodule
、時間を取得したら、対応するNodeを見つけますmodule
。これmodule
はexports
変数の戻り値であり、別のモジュールがスムーズな出力モジュールを取得します。
var greet = require('./hello');
module.exports和exports
キー値オブジェクト{}を出力する場合は、exports
この既存の空のオブジェクト{}を使用して、新しいキー値オブジェクトを追加し続けることができます。
関数または配列を出力module.exports
する場合は、オブジェクトに直接値を割り当てる必要があります。
したがって、結論を導き出すことができます。直接module.exports
割り当ては、あらゆる状況に対処できます。
module.exports = {
foo: function () {
return 'foo'; }
};
または:
module.exports = function () {
return 'foo'; };
最後に、モジュール変数を出力する方法を強くお勧めmodule.exports = xxx
します。これにより、1つのメソッドのみを記憶する必要があります。