node.js REPL에 스크립트를 어떻게로드합니까?


137

foo.jsREPL에서 놀고 싶은 기능이 포함 된 스크립트 가 있습니다.

방법은 내 스크립트를 실행하고 내가 함께 할 수처럼 다음, 모든 선언 전역으로 REPL에 뛰어 노드 가지고 있는가 python -i foo.pyghci foo.hs?

답변:


179

설명하는 정확한 기능을 제공하기위한 내장 기능은 아직 없습니다. 그러나 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())

비동기 콜백 내부의 repl에 드롭하려면 어떻게해야합니까?
Chet

2
@Chet 질문이 기존 질문과 일치하지 않으면 새 StackOverflow 질문을 작성합니다.
vossad01

@Chet 당신은 (async () => {more code}) (); 그리고 같은 세계를 공유 할 것입니다.
nurettin

macOS를 사용하는 경우 팁 (다른 사람도 가능) REPL에 ".load"(공백 참고)를 입력하고 Finder에서 터미널로 파일을 끌어다 놓아 명령에 올바른 경로를 추가 할 수 있습니다. 작업중인 파일의 레벨이 여러 수준 인 경우 편리합니다.
jamesnotjim

35

나는 항상이 명령을 사용합니다

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

패키지없이 파이썬에서와 똑같이 작동합니다.


1
누구든지 Windows cmd 에서이 작업을 수행하는 방법을 알고 있습니까? 나는 bash에서 작동하지만 창은 작동하지 않습니다.
Sharpiro

@Sharpiro : Git을 설치하면 Windows PC에 mini-UNIX를 설치할 수 있습니다. Git의 Windows 배포는 정상입니다.
Juan Lanus

이것에 대해 짜증나는 한 가지는 Node.js가 repl 프롬프트를 인쇄 한 다음 스크립트 실행하여 프롬프트 후에 출력이 멈추는 것입니다. stackoverflow.com/a/45893494/3538165 에는이 문제가 없지만 해당 솔루션 함수에 대해 변수에 명시 적으로 할당하여 repl 네임 스페이스로 끝나야하므로 매우 좋지 않습니다.
Radon Rosborough

10

노드 추가를 대화식 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: 

8

다른 방법은 해당 기능을 전역으로 정의하는 것입니다.

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

그런 다음 REPL에 파일을 다음과 같이 사전로드하십시오.

node -r ./file.js

그런 다음 helloWorldREPL에서 직접 기능에 액세스 할 수 있습니다.


8

스크립트를 반복적으로 다시로드하는 데 지쳐서 replpad를 만들었습니다 .

다음을 통해 간단히 설치하십시오. npm install -g replpad

그런 다음 다음을 실행하여 사용하십시오. replpad

현재 및 모든 하위 디렉토리의 모든 파일을보고 변경시 파일을 파이프에 파이프하려면 다음을 수행하십시오. replpad .

사이트의 비디오를 확인하여 작동 방식에 대한 더 나은 아이디어를 얻고 다음과 같은 다른 멋진 기능에 대해 알아보십시오.

  • dox()모든 핵심 기능에 추가 된 기능을 통해 repl의 핵심 모듈 문서에 액세스fs.readdir.dox()
  • dox()npm을 통해 설치된 모든 모듈에 추가 되는 기능을 통해 repl의 사용자 모듈 readme에 액세스합니다.marked.dox()
  • 기능의 강조 표시된 소스 코드 , 기능이 정의 된 위치에 대한 정보 (파일, 줄 번호) 및 모든 기능에 추가 된 특성을 통해 가능한 경우 기능 설명 및 / 또는 jsdoc 에 액세스하십시오.srcexpress.logger.src
  • scriptie-talkie 지원 (참조.talk 명령 )
  • 명령 및 키보드 단축키를 추가합니다
  • vim 키 바인딩
  • 키 맵 지원
  • 일치하는 괄호 일치를 통해 토큰 플러그인
  • 키보드 단축키 또는 .append명령을 통해 repl에 입력 된 코드를 파일에 다시 추가

참조 : https://github.com/thlorenz/replpad


CXX=clang++ npm install replpad오류를 해결 해야했습니다g++: error: unrecognized command line option '-stdlib=libc++'
ShadSterling

그러나 내가 그것을 실행하면 실패합니다# # 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. 쿨라

4

현재는 직접 할 수 mylib = require('./foo.js')는 없지만 REPL에서 할 수 있습니다 . 전역으로 선언되지 않은 메소드가 내보내집니다.


REPL이 여러 줄 주석과 같은 완벽하게 유효한 자바 스크립트 (적어도 내 구성에서는) 때문에 .load my_work.js일부 추가 exports.working_var = ...선언이 필요하지만을 선호합니다 readline.
chbrown

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경우 running node src.js은 노드를 시작하고 파일을로드하고 REPL을 시작 var하고 최상위 수준에서 선언 된 모든 객체와 내 보낸 전역을 복사합니다 . if (require.main === module)경우이 코드가 실행되지 않습니다 보장하지만은 src.js스루 포함되어 require문. 사실, 명령문 src.js내에서 디버깅 목적으로 독립형을 실행할 때 실행하려는 코드를 추가 할 수 있습니다 if.


4

George의 답변에 대한 bash 함수 버전은 다음과 같습니다 .

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

이것을 당신의 것으로 넣으면 ~/.bash_profile별명처럼 사용할 수 있습니다.

noderepl foo.js

2
나는 이것을 몇 달 동안 사용해 왔으며 새로운 쉘 환경으로 전환 할 때 일부 설정을 잃어 버렸고 다시 추적해야했습니다. 그래서 여기 왔기 때문에이 유용한 기능에 대해 감사한다고 생각했습니다.
Xaekai 2019

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로 모든 줄을 입력하지만 어떤 이유로 파일이 끝난 후 노드가 종료됩니다

또 다른 문제는 기능이 게양되지 않는다는 것입니다.

더 나은 답변

node -e require('repl').start({useGlobal:true}); -r ./test2.js

그런 다음 test2.js 내에 var없이 선언 된 모든 전역 변수는 REPL에서 사용할 수 있습니다

왜 전역 범위의 var a를 사용할 수 없는지 잘 모르겠습니다.


8
제발 추가 답변에 약간의 explanaton을
mechnicov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.