2

ファイルの読み込みを独自の関数に置き換えるために、require() にモンキー パッチを適用しようとしています。内部で require(module_id) が次のようなことをしていると思います:

  1. module_id をファイル パスに変換する
  2. ファイル パスを文字列として読み込む
  3. 文字列をモジュール オブジェクトにコンパイルし、さまざまなグローバルを正しく設定します

ステップ 1 + 3 を再実装せずにステップ 2 を置き換えようとしています。パブリック API を見ると、1 ~ 3 を実行する require() と、1 を実行する require.resolve() があります。ステップ 2 を分離する方法はありますか?ステップ3?

私は嘲笑のようなrequire mokingツールのソースを見てきまし. require() 関数。

コンテキストについては、require_at_commit(module_id, git_commit_id) 関数を作成しようとしています。これは、モジュールとそのモジュールのいずれかを、指定されたコミットで要求されたものとしてロードします。

この関数が必要なのは、a) コードベースのさまざまな部分に依存し、b) コードベースを進化させても変更されないことが保証されている特定の関数を記述できるようにしたいからです。さまざまな時点でコードを「凍結」したいので、これはコードベースの 20 個のコピーをパッケージ化する必要を回避する簡単な方法であると考えました (別の方法として、「my_code_v1」: 「git://.. ." を package.json に追加しましたが、バージョンが 20 になると肥大化して遅くなるような気がします)。

アップデート:

したがって、モジュールをロードするためのソース コードは次のとおりです: https://github.com/joyent/node/blob/master/lib/module.js。具体的には、このようなことを行うには、Module._load を再実装する必要がありますが、これは非常に簡単です。ただし、大きな障害があります。ステップ 1 の module_id をファイル パスに変換することは、実際には思ったより難しいことです。これは、resolveFilename が fs.exists() を呼び出して検索を終了する場所を知る必要があるためです...したがって、個々のファイルを置き換えるだけではなく、ディレクトリ全体を置き換える必要があります。つまり、require() をオーバーライドするのではなく、git リビジョン全体をディレクトリにエクスポートし、require() をそのディレクトリに向ける方がおそらく簡単です。 .

更新 2:

完全に別のアプローチを使用することになりました...以下に追加した回答を参照してください

4

2 に答える 2