web-dev-qa-db-ja.com

スクリプトをnode.js REPLにロードするにはどうすればよいですか?

スクリプトがありますfoo.jsこれには、REPLでやりたい機能がいくつか含まれています。

Nodeにスクリプトを実行させてから、REPLに宣言されたすべてのグローバルを使用して、python -i foo.py または ghci foo.hs

118
hugomg

説明したとおりの機能を提供する組み込み機能はまだありません。ただし、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())
158
vossad01

私はいつもこのコマンドを使用します

node -i -e "$(< yourScript.js)"

パッケージなしでPythonと同じように動作します。

25

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: 
8
dthree

replpad を作成しました。スクリプトを繰り返しリロードするのにうんざりしたからです。

単に[npm install -g replpad]からインストールします

次に、実行して使用します:replpad

現在およびすべてのサブディレクトリ内のすべてのファイルを監視し、変更時にそれらをreplにパイプする場合:replpad .

サイトの動画をご覧になり、どのように機能するかをよく理解し、次のようなその他の素敵な機能について学習してください。

  • すべてのコア関数に追加されるdox()関数、つまりfs.readdir.dox()を介してreplのコアモジュールドキュメントにアクセスします。
  • npm経由でインストールされたすべてのモジュールに追加されるdox()関数を介して、replのユーザーモジュールreadmeにアクセスします。つまり、marked.dox()
  • アクセス関数の強調表示されたソースコード、関数が定義された場所の情報(ファイル、行番号)および関数のコメントおよび/またはjsdocs可能な場合は、すべての関数に追加されるsrcプロパティ、つまりexpress.logger.src
  • scriptie-talkie support.talkコマンドを参照)
  • コマンドとキーボードショートカットを追加します
  • vimキーバインディング
  • キーマップのサポート
  • かっこ一致一致トークンプラグイン経由
  • キーボードショートカットまたは.appendコマンドを使用して、replに入力されたコードをファイルに追加します
7
Thorsten Lorenz

別の方法は、これらの関数をグローバルとして定義することです。

global.helloWorld = function() { console.log("Hello World"); }

次に、REPLとしてファイルをプリロードします。

node -r ./file.js

次に、関数helloWorldにREPLで直接アクセスできます。

7

インタラクティブなノード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を使用してテスト済み

5
lfender6445

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_スタンドアロンを実行しているときに実行したいコードを追加できます。

4
user1936097

現在、それを直接行うことはできませんが、REPLでmylib = require('./foo.js')することはできます。メソッドはグローバルとして宣言されているのではなく、エクスポートされていることに注意してください。

4
Ricardo Tomasi

ここに表示されていない別の提案:この小さなコードを試してください

#!/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が含まれます。

3
corvid

George's answer のbash関数バージョンは次のとおりです。

noderepl() {
    FILE_CONTENTS="$(< $1 )"
    node -i -e "$FILE_CONTENTS"
}

これを~/.bash_profileエイリアスのように使用できます。つまり:

noderepl foo.js
3
Eliot

古い答え

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が使用できない理由がわからない

1
Jew