답변:
설명하는 정확한 기능을 제공하기위한 내장 기능은 아직 없습니다. 그러나 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
그런 다음 helloWorld
REPL에서 직접 기능에 액세스 할 수 있습니다.
스크립트를 반복적으로 다시로드하는 데 지쳐서 replpad를 만들었습니다 .
다음을 통해 간단히 설치하십시오. npm install -g replpad
그런 다음 다음을 실행하여 사용하십시오. replpad
현재 및 모든 하위 디렉토리의 모든 파일을보고 변경시 파일을 파이프에 파이프하려면 다음을 수행하십시오. 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"
?
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를 사용할 수 없는지 잘 모르겠습니다.