1

REPL の require がメインコンテキストのキャッシュを使用せず、ファイルを再度必要とするのはなぜですか?

例: test.js:

var repl = require('repl');
global.a = require('./a');
repl.start({
  prompt: "node via stdin> ",
  input: process.stdin,
  output: process.stdout
});

a.js

console.log(1)

私はtest.jsを始めています:

node test.js

それは「1」を印刷します

REPL で「require('./a')」を出力すると:

node via stdin> var aInREPL = require('./a')

そして再び「1」を出力するので、global.a !== aInREPL

しかし、メインプログラムと同じオブジェクトを REPL で取得する必要がある場合があります (たとえば、Singletone)。これどうやってするの?

4

2 に答える 2

0

必要なコード(オブジェクト、関数、..)をREPLのコンテキストに追加します。

var repl = require('repl');
repl.start({
  prompt: "node via stdin> ",
  input: process.stdin,
  output: process.stdout
}).context.a = require('./a.js');

これで、1を1回だけ出力するか、REPLのコンテキストにグローバルを追加します

于 2012-09-30T02:26:07.707 に答える
0

デフォルトでは、REPL は別のコンテキストで実行されます (詳細については、repl.start関数を参照してください)。

基本的に、新しく開始された REPL とグローバル コンテキストを共有するには、2 つのオプションがあります。

  • useGlobal: trueへの呼び出しでオプションを指定できますstart
  • context外部オブジェクトを REPL のプロパティにアタッチできます。

どちらの方法が優先されるかは、何を達成したいかによって異なりますuseGlobal。選択したオブジェクトのみを共有したい場合は、contextプロパティを使用して、共有したいオブジェクトのみを割り当てます (例については、Scott の投稿を参照してください)。

于 2012-09-30T14:29:07.860 に答える