【抜粋】モジュールローディング機構

モジュールローディング機構

入力値のコピーである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は、内部処理の流れを必要とします

requireCommonJSの中のコマンドは、別のモジュール指定コマンドをロードするために使用されます。

  • 実際に、彼はグローバルコマンドではなく、現在のモジュールにポイント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関数が準備ができているスクリプトの内容全体がロードされるように、それは地球環境を汚染避けるため、新機能の中に入れました。パラメータの機能が含まれrequiremoduleexportsおよびその他のパラメータ。

(function (exports, require, module, __filename, __dirname) {
  // YOUR CODE INJECTED HERE!
});

Module._compileこの方法は、そう、同期的に実行されるModule._load完全な実行にそれを待つために、ユーザーに戻りますmodule.exports値。

【終わり】

おすすめ

転載: www.cnblogs.com/wuxiaoyi/p/11937289.html