回答:
あなたが説明したとおりの機能を提供するための組み込み機能はまだありません。ただし、REPL内でコマンドrequire
を使用するための、.load
次のような代替手段:
.load foo.js
REPLで入力した場合と同じように、ファイルを1行ずつロードします。これとは異なりrequire
、ロードしたコマンドでREPL履歴を汚染します。ただし、のようにキャッシュされないため、繰り返し可能という利点がありrequire
ます。
どちらが適しているかは、ユースケースによって異なります。
編集:それはstrictモードで作業をしないためには、限られた適用性を持っていますが、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:
別の方法は、それらの関数をグローバルとして定義することです。
global.helloWorld = function() { console.log("Hello World"); }
次に、REPLにファイルをプリロードします。
node -r ./file.js
次に、helloWorld
REPLで関数に直接アクセスできます。
スクリプトを繰り返しリロードするのに飽きたのでreplpadを作成しました。
単にそれを介してそれをインストールしてください: npm install -g replpad
次に、次のコマンドを実行して使用します。 replpad
現在およびすべてのサブディレクトリ内のすべてのファイルを監視し、それらが変更されたときにそれらをreplにパイプする場合: replpad .
それがどのように機能するかについてより良い考えを得るためにサイト上のビデオをチェックして、それがこれらのようなある他のいくつかの素晴らしい機能について学ぶ:
dox()
すべてのコア関数に追加される関数を介してreplのコアモジュールドキュメントにアクセスします。fs.readdir.dox()
dox()
npmを介してインストールされたすべてのモジュールに追加される関数を介してreplのユーザーモジュールreadmeにアクセスしますmarked.dox()
src
ます。express.logger.src
.talk
コマンドを参照).append
コマンドを使用して、replに入力されたコードをファイルに追加しますCXX=clang++ npm install replpad
エラーを回避しなければなりg++: error: unrecognized command line option '-stdlib=libc++'
# # Fatal error in ../deps/v8/src/api.cc, line 1248 # Check failed: !value_obj->IsJSReceiver() || value_obj->IsTemplateInfo(). # Illegal instruction: 4
ファイルをインタラクティブノード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を使用してテスト済み
node -i -r "./build/main/index.js"
?
現在、それを直接行うことはできませんがmylib = require('./foo.js')
、REPLで行うことができます。メソッドはグローバルとして宣言されずにエクスポートされることに注意してください。
.load my_work.js
いくつかの追加のexports.working_var = ...
宣言が必要ですが、REPLが複数行のコメントなどの完全に有効なjavascriptの少なくとも一部をreadline
構成しているため(少なくとも私の構成では)、これよりも好ましいと思います。
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)
場合は、このコードが実行されないことを保証しsrc.js
て含まれているrequire
声明。実際、src.js
スタンドアロンで実行しているときに、if
ステートメント内でデバッグ目的で実行するコードを追加できます。
古い答え
type test.js|node -i
ノードREPLを開き、test.jsからREPLにすべての行を入力しますが、何らかの理由でノードはファイルの終了後に終了します
もう1つの問題は、その機能が巻き上げられないことです。
node -e require('repl').start({useGlobal:true}); -r ./test2.js
次に、test2.js内でvarなしで宣言されたすべてのグローバルがREPLで使用可能になります
グローバルスコープの変数aが使用できない理由がわからない