var module = require("./some_module.js"); module.f(); // console.log(module.obj); // module(); //
モジュール自体の何かをエクスポートするには、登録する必要があります。
exports.f = function() { return 123; }; exports.obj = { name: "Foobar", age: 33 }; // , // ! module.exports = function() { return "I have not a name"; }
なぜ常に機能しないのですか?
この質問に対する答えは、require()関数がどのように機能するかを理解することにあります。
私が理解したようにrequire()を呼び出すとき、exportsというオブジェクトを作成し、転送されたファイルを変数に読み取り、この変数からすべてのコードを実行します。 その後、コードの実行中に変更されたエクスポートオブジェクトを返します。
require()関数を作成してみましょう。 認識を単純化するために、ファイル名ではなく、文字列変数の形式でファイルの内容を関数に渡します。 それをスクリプトと呼びましょう。
require関数の定義は次のようになります。
function require(script) { var exports = {}; eval(script); return exports; }
しかし、名前のないオブジェクトをエクスポートする必要がある場合はどうでしょうか?
module.exports = function() {}
覚えていますか? 名前モジュールを持つオブジェクトを追加し、オブジェクトをそのエクスポートプロパティに割り当てます。
require関数は少し複雑になります:
function require(script) { var module = {}; var exports = {}; eval(script); return module.exports ? module.exports : exports; }
テストを実行します。
var script = "exports.foo = 'foo'; exports.bar = 'bar';"; // var foobar = require(script); // console.log(foobar.foo); // : foo console.log(foobar.bar); // : bar
うまくいく!
名前のないオブジェクトをエクスポートしてテストを実行します。
var script = "module.exports = function() { return 'foobar'; }"; // var foobar = require(script); // console.log(foobar()); // : foobar
それも動作します。
モジュールの名前のないオブジェクトと名前のオブジェクトのエクスポートからテストを開始します。
var script = "exports.arr = [1, 2, 3]; module.exports = function() { return 'foobar'; }"; // var foobar = require(script); // console.log(foobar()); // : foobar console.log(foobar.arr); // : undefined
動作しません!
ちなみに、標準のnode.js require()関数を使用する場合は機能しません。 これは、私たちの機能がそれとあまり変わらないことを示しており、私たちは正しい軌道に乗っています。
しかし、名前のないオブジェクトと名前付きオブジェクトの両方をどのようにエクスポートしますか 答えは、module.exportsを使用するだけでよく、名前付きオブジェクトは名前のないオブジェクトの後に必ずエクスポートされるということです。
前の例を修正します。
var script = "module.exports = function() { return 'foobar'; }\n" + "module.exports.arr = [1, 2, 3];\n" + "module.exports.result = 'Ok'\n"; var foobar = require(script); // console.log(foobar()); // : foobar console.log(foobar.arr); // : [1, 2, 3] console.log(foobar.result); // : Ok
うまくいく!
親愛なる読者の私の例が、node.jsのモジュールのエクスポートとインポートのメカニズムをよりよく理解するのに役立つことを願っています。 一見したところ、それは非常に単純で、開発者自身が書いています。 ただし、組み込みのrequire()関数の操作を理解していなければ、コードの奇跡的な結果だけが得られることがあります。