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


137

foo.jsREPLで使用したいいくつかの関数を含むスクリプトがあります。

方法は、私のスクリプトを実行し、私はできるように、その後、すべての宣言グローバルでREPLにジャンプノード持つことがありますpython -i foo.pyghci foo.hs

回答:


179

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

非同期コールバック内のreplにドロップしたい場合はどうなりますか?
Chet

2
@Chet質問が既存の質問と一致しない場合、新しいStackOverflow質問を作成します:-)
vossad01

@Chetあなたは(async()=> {more code})();で別のファイルを.loadできます。同じグローバルを共有します。
ヌレッティン2018

macOSを使用している場合のヒント(多分他のものも)。REPLに「.load」(スペースに注意)と入力し、Finderからターミナルにファイルをドラッグアンドドロップして、コマンドに正しいパスを追加できます。これは、作業中のファイルが数レベル下の場合に便利です。
jamesnotjim

35

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

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

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


1
誰かがこれをwindows cmdで動作させる方法を知っていますか?私はbashで動作しましたが、windowsでは動作しません。
Sharpiro

@Sharpiro:Gitをインストールする場合、Windows PCにミニUNIXをインストールするオプションがあります。Windows向けのGitの正規分布です。
Juan Lanus

このことについて迷惑なんだ一つのことは、Node.jsのはREPLプロンプトを印刷しますです、その後任意の出力はプロンプトの後にスタックして、スクリプトを実行します。stackoverflow.com/a/45893494/3538165にはこの問題はありませんが、そのソリューションでは、関数を明示的に変数に割り当てて、最終的にrepl名前空間になるようにする必要があるため、あまり良くありません。
Radon Rosborough

10

私は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

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

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

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

node -r ./file.js

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


8

スクリプトを繰り返しリロードするのに飽きたのでreplpadを作成しました。

単にそれを介してそれをインストールしてください: npm install -g replpad

次に、次のコマンドを実行して使用します。 replpad

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

それがどのように機能するかについてより良い考えを得るためにサイト上のビデオをチェックして、それがこれらのようなある他のいくつかの素晴らしい機能について学ぶ:

  • dox()すべてのコア関数に追加される関数を介してreplのコアモジュールドキュメントにアクセスします。fs.readdir.dox()
  • dox()npmを介してインストールされたすべてのモジュールに追加される関数を介してreplのユーザーモジュールreadmeにアクセスしますmarked.dox()
  • 関数の強調表示されたソースコード関数が定義された場所に関する情報(ファイル、行番号)、および関数のコメントや、可能な場合はすべての関数に追加されるプロパティを介したjsdocsにアクセスしsrcます。express.logger.src
  • スクリプトトーキーのサポート.talkコマンドを参照)
  • コマンドとキーボードショートカットを追加します
  • vimキー割り当て
  • キーマップのサポート
  • マッチトークンプラグインによる括弧のマッチング
  • キーボードショートカットまたは.appendコマンドを使用して、replに入力されたコードをファイルに追加します

参照:https : //github.com/thlorenz/replpad


私は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
ShadSterling

5

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


2
どうしてnode -i -r "./build/main/index.js"
Z.クラ2018年

4

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


.load my_work.jsいくつかの追加のexports.working_var = ...宣言が必要ですが、REPLが複数行のコメントなどの完全に有効なjavascriptの少なくとも一部をreadline構成しているため(少なくとも私の構成では)、これよりも好ましいと思います。
chbrown 2015年

4

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ステートメント内でデバッグ目的で実行するコードを追加できます。


4

これがジョージの答えの bash関数バージョンです :

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

これをあなたの中に入れれば~/.bash_profile、エイリアスのように使うことができます:

noderepl foo.js

2
私はこれを数か月間使用しており、新しいシェル環境への移行時に設定の一部を失い、これを再度追跡する必要がありました。私はここにいるので、この本当に便利な機能に感謝したいと思いました。
Xaekai

3

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

#!/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、変数として含まれます


1

古い答え

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


8
してください追加あなたの答えに、いくつかのexplanatonを
mechnicov
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.