スクリプトがありますfoo.js
これには、REPLでやりたい機能がいくつか含まれています。
Nodeにスクリプトを実行させてから、REPLに宣言されたすべてのグローバルを使用して、python -i foo.py
または ghci foo.hs
?
説明したとおりの機能を提供する組み込み機能はまだありません。ただし、require
を使用する代わりに .load
command REPL内では、次のようになります。
.load foo.js
REPLで入力したかのように、ファイルを1行ずつロードします。 require
とは異なり、これは、ロードしたコマンドでREPL履歴を汚染します。ただし、require
のようにキャッシュされないため、繰り返し可能という利点があります。
どちらが良いかは、ユースケースによって異なります。
編集:厳格モードでは動作しないため、適用範囲は限られていますが、3年後、スクリプトに'use strict'
、次のことができます eval
を使用してスクリプトを読み込む REPL履歴を汚染せずに:
var fs = require('fs');
eval(fs.readFileSync('foo.js').toString())
私はいつもこのコマンドを使用します
node -i -e "$(< yourScript.js)"
パッケージなしでPythonと同じように動作します。
Vorpal.js を作成しました。これは、ノードを対話型CLIに追加することでこの問題を処理します。 REPL拡張機能をサポートし、実行中のアプリのコンテキスト内でREPLにドロップします。
var vorpal = require('vorpal')();
var repl = require('vorpal-repl');
vorpal
.delimiter('myapp>')
.use(repl)
.show()
.parse(process.argv);
その後、アプリを実行すると、REPLにドロップされます。
$ node myapp.js repl
myapp> repl:
replpad を作成しました。スクリプトを繰り返しリロードするのにうんざりしたからです。
単に[npm install -g replpad
]からインストールします
次に、実行して使用します:replpad
現在およびすべてのサブディレクトリ内のすべてのファイルを監視し、変更時にそれらをreplにパイプする場合:replpad .
サイトの動画をご覧になり、どのように機能するかをよく理解し、次のようなその他の素敵な機能について学習してください。
dox()
関数、つまりfs.readdir.dox()
を介してreplのコアモジュールドキュメントにアクセスします。dox()
関数を介して、replのユーザーモジュールreadmeにアクセスします。つまり、marked.dox()
src
プロパティ、つまりexpress.logger.src
.talk
コマンドを参照).append
コマンドを使用して、replに入力されたコードをファイルに追加します別の方法は、これらの関数をグローバルとして定義することです。
global.helloWorld = function() { console.log("Hello World"); }
次に、REPLとしてファイルをプリロードします。
node -r ./file.js
次に、関数helloWorld
にREPLで直接アクセスできます。
インタラクティブなノードreplにファイルをロードしてみませんか?
node -h
-e, --eval script evaluate script
-i, --interactive always enter the REPL even if stdin
node -e 'var client = require("./build/main/index.js"); console.log("Use `client` in repl")' -i
その後、package.jsonスクリプトに追加できます
"repl": "node -e 'var client = require(\"./build/main/index.js\"); console.log(\"Use `client` in repl\")' -i",
ノードv8.1.2を使用してテスト済み
replpad
はクールですが、ファイルをノードにすばやく簡単にロードし、変数をインポートしてreplを開始するために、次のコードを.jsファイルの最後に追加できます。
_if (require.main === module){
(function() {
var _context = require('repl').start({Prompt: '$> '}).context;
var scope = require('lexical-scope')(require('fs').readFileSync(__filename));
for (var name in scope.locals[''] )
_context[scope.locals[''][name]] = eval(scope.locals[''][name]);
for (name in scope.globals.exported)
_context[scope.globals.exported[name]] = eval(scope.globals.exported[name]);
})();
}
_
ファイルが_src.js
_の場合、_node src.js
_を実行するとノードが起動し、ファイルがロードされ、REPLが開始され、var
として宣言されたすべてのオブジェクトがトップレベルと同様にコピーされますエクスポートされたグローバル。 if (require.main === module)
は、require
ステートメントを介して_src.js
_が含まれている場合、このコードが実行されないようにします。実際、if
ステートメント内でデバッグ目的で_src.js
_スタンドアロンを実行しているときに実行したいコードを追加できます。
現在、それを直接行うことはできませんが、REPLでmylib = require('./foo.js')
することはできます。メソッドはグローバルとして宣言されているのではなく、エクスポートされていることに注意してください。
ここに表示されていない別の提案:この小さなコードを試してください
#!/usr/bin/env node
'use strict';
const repl = require('repl');
const cli = repl.start({ replMode: repl.REPL_MODE_STRICT });
cli.context.foo = require('./foo'); // injects it into the repl
次に、このスクリプトを実行するだけで、変数としてfoo
が含まれます。
George's answer のbash関数バージョンは次のとおりです。
noderepl() {
FILE_CONTENTS="$(< $1 )"
node -i -e "$FILE_CONTENTS"
}
これを~/.bash_profile
エイリアスのように使用できます。つまり:
noderepl foo.js
古い答え
type test.js|node -i
ノードREPLを開き、test.jsからREPLにすべての行を入力しますが、何らかの理由でファイルの終了後にノードが終了します
もう1つの問題は、機能が引き上げられないことです。
node -e require('repl').start({useGlobal:true}); -r ./test2.js
その後、test2.js内でvarなしで宣言されたすべてのグローバルは、REPLで使用可能になります
グローバルスコープのvar aが使用できない理由がわからない