답변:
설명하는 정확한 기능을 제공하기위한 내장 기능은 아직 없습니다. 그러나 require이를 사용 하여 REPL 내에서 .load명령 을 사용 하는 대안 은 다음과 같습니다.
.load foo.js
REPL에 입력 한 것처럼 파일을 한 줄씩로드합니다. 이와 달리 require,로드 한 명령으로 REPL 기록을 오염시킵니다. 그러나와 같이 캐시되지 않기 때문에 반복 가능하다는 장점이 require있습니다.
사용 사례에 따라 더 나은 방법이 있습니다.
편집 : 그것은 엄격 모드에서 작업을하지 않지만, 3 년 후에 나는 스크립트가없는 경우 있음을 배웠습니다 때문에이 제한 적용을 가지고 'use strict', 당신은 할 수 사용하는 eval스크립트를로드 할 수 REPL 기록을 오염하지 않고 :
var fs = require('fs');
eval(fs.readFileSync('foo.js').toString())
나는 항상이 명령을 사용합니다
node -i -e "$(< yourScript.js)"
패키지없이 파이썬에서와 똑같이 작동합니다.
노드 추가를 대화식 CLI로 전환하여이 문제를 처리하는 Vorpal.js를 만들었습니다 . 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
그런 다음 helloWorldREPL에서 직접 기능에 액세스 할 수 있습니다.
스크립트를 반복적으로 다시로드하는 데 지쳐서 replpad를 만들었습니다 .
다음을 통해 간단히 설치하십시오. npm install -g replpad
그런 다음 다음을 실행하여 사용하십시오. replpad
현재 및 모든 하위 디렉토리의 모든 파일을보고 변경시 파일을 파이프에 파이프하려면 다음을 수행하십시오. replpad .
사이트의 비디오를 확인하여 작동 방식에 대한 더 나은 아이디어를 얻고 다음과 같은 다른 멋진 기능에 대해 알아보십시오.
dox()모든 핵심 기능에 추가 된 기능을 통해 repl의 핵심 모듈 문서에 액세스fs.readdir.dox()dox()npm을 통해 설치된 모든 모듈에 추가 되는 기능을 통해 repl의 사용자 모듈 readme에 액세스합니다.marked.dox()srcexpress.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"?
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경우 running node src.js은 노드를 시작하고 파일을로드하고 REPL을 시작 var하고 최상위 수준에서 선언 된 모든 객체와 내 보낸 전역을 복사합니다 . if (require.main === module)경우이 코드가 실행되지 않습니다 보장하지만은 src.js스루 포함되어 require문. 사실, 명령문 src.js내에서 디버깅 목적으로 독립형을 실행할 때 실행하려는 코드를 추가 할 수 있습니다 if.
George의 답변에 대한 bash 함수 버전은 다음과 같습니다 .
noderepl() {
FILE_CONTENTS="$(< $1 )"
node -i -e "$FILE_CONTENTS"
}
이것을 당신의 것으로 넣으면 ~/.bash_profile별명처럼 사용할 수 있습니다.
noderepl foo.js
이전 답변
type test.js|node -i
노드 REPL을 열고 test.js에서 REPL로 모든 줄을 입력하지만 어떤 이유로 파일이 끝난 후 노드가 종료됩니다
또 다른 문제는 기능이 게양되지 않는다는 것입니다.
node -e require('repl').start({useGlobal:true}); -r ./test2.js
그런 다음 test2.js 내에 var없이 선언 된 모든 전역 변수는 REPL에서 사용할 수 있습니다
왜 전역 범위의 var a를 사용할 수 없는지 잘 모르겠습니다.