私はこれを試しました:
// mod.js
var a = 1;
this.b = 2;
exports.c = 3;
// test.js
var mod = require('./mod.js');
console.log(mod.a); // undefined
console.log(mod.b); // 2
console.log(mod.c); // 3, so this === exports?
だから私はrequire()がこのように実装されるかもしれないことをイメージします:
var require = function (file) {
var exports = {};
var run = function (file) {
// include "file" here and run
};
run.apply(exports, [file]);
return exports;
}
そうですか? require()を理解するのを手伝ってください、またはどこでソースコードを見つけることができます。ありがとう!
Andrey はソースコードを示しましたが、使用方法についても疑問がある場合は、簡単で簡単な説明がここにあります( http://nodejs.org/api/modules.html =)。
これらは私にとって2つの良い例でした。
//foo.js, multiple methods
var circle = require('./circle.js');
console.log( 'The area of a circle of radius 4 is ' + circle.area(4));
//circle.js
var PI = Math.PI;
exports.area = function (r) {
return PI * r * r;
};
exports.circumference = function (r) {
return 2 * PI * r;
};
//bar.js
var square = require('./square.js');
var mySquare = square(2);
console.log('The area of my square is ' + mySquare.area());
//square.js, single method
module.exports = function(width) {
return {
area: function() {
return width * width;
}
};
}
私の好きなパターンは
(function (controller) {
controller.init = function (app) {
app.get("/", function (req, res) {
res.render("index", {});
});
};
})(module.exports);
var mod = require('./mod.js');
Requireは、pathと呼ばれる1つの引数を取る関数です。この場合、パスは./mod.js
です
requireが呼び出されると、一連のタスクが発生します:
lib/module.js で宣言されたModule.prototype.require
関数を呼び出します。これは、パスが存在し、文字列であることをアサートします
Module._resolveFilename(request, parent, isMain)
を介してファイルを解決する lib/module.js の関数であるModule._load
を呼び出します。
Module._resolveFilename
関数が呼び出され、モジュールがネイティブかどうかが確認されます(ネイティブモジュールは lib/internal/bootstrap_node.js で定義されているNativeModule
関数によって返されます)、はいの場合モジュールを返します。そうでない場合は、parhの文字数(少なくとも2文字)といくつかの文字(パスは./
で始まる必要があります)をチェックします/) lib/internal/bootstrap_node.js で定義されているModule._resolveLookupPaths
関数経由var module = new Module(filename, parent);
で指定されたファイルの新しいモジュールを作成しますNativeModule.prototype.compile
を介してv8を介してコンパイルされますNativeModule.wrap
は、mod.js
でコンパイルされたjavascriptコンテンツを受け取り、それをラップします。このすべてを機能させる他のコードでラップします。したがって、mod.js
で記述したコードは関数式でラップされます。つまり、ノードに書き込むものはすべてV8で実行されます