モジュールローディング機構
入力値のコピーであるCommonJSモジュールローディング機構が出力され、出力後の値は、モジュール内の変更の影響は、この値よりも小さいです。
ここでは、モジュールファイルlib.jsです
// lib.js
var counter = 3;
function incCounter(){
counter ++;
}
module.exports = {
counter,
incCounter
}
上記のコード出力内部変数counter
とこの変数の内部メソッドが書き換えられますincCounter
。
そして、上記のモジュールをロードします。
// main.js
var counter = require('./lib').counter;
var incCounter = require('./lib').incCounter;
console.log(counter) //3
incCounter();
console.log(counter) //3
コードは、上述のcounter
出力モジュールは影響を与えないlib.js内に変更した後counter
#5.1は、内部処理の流れを必要とします
require
CommonJSの中のコマンドは、別のモジュール指定コマンドをロードするために使用されます。
- 実際に、彼はグローバルコマンドではなく、現在のモジュールにポイント
module.require
順番に内部コマンドノードを呼び出し、コマンド、Module._load
。
Module._load = function(request, parent, isMain) {
// 1. 检查 Module._cache,是否缓存之中有指定模块
// 2. 如果缓存之中没有,就创建一个新的Module实例
// 3. 将它保存到缓存
// 4. 使用 module.load() 加载指定的模块文件,
// 读取文件内容之后,使用 module.compile() 执行文件代码
// 5. 如果加载/解析过程报错,就从缓存删除该模块
// 6. 返回该模块的 module.exports
};
使用して上記の手順4、module.compile()
次のように指定されたモジュールを実行するためのスクリプトは、ロジックがあります。
Module.prototype._compile = function(content, filename) {
// 1. 生成一个require函数,指向module.require
// 2. 加载其他辅助方法到require
// 3. 将文件内容放到一个函数之中,该函数可调用 require
// 4. 执行该函数
};
上記のステップ1とステップ2、require
プライマリとセカンダリの方法として機能します。
require()
:ロード外部モジュールrequire.resolve()
絶対パスにモジュール名解決さrequire.main
:メインモジュールにポインティングrequire.cache
:キャッシュモジュールへのすべてのポイントrequire.extensions
:ファイルの拡張子によると、実行するためにさまざまな機能を呼び出します
いったんrequire
関数が準備ができているスクリプトの内容全体がロードされるように、それは地球環境を汚染避けるため、新機能の中に入れました。パラメータの機能が含まれrequire
、module
、exports
およびその他のパラメータ。
(function (exports, require, module, __filename, __dirname) {
// YOUR CODE INJECTED HERE!
});
Module._compile
この方法は、そう、同期的に実行されるModule._load
完全な実行にそれを待つために、ユーザーに戻りますmodule.exports
値。
【終わり】