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


137

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

방법은 내 스크립트를 실행하고 내가 함께 할 수처럼 다음, 모든 선언 전역으로 REPL에 뛰어 노드 가지고 있는가 python -i foo.py나 ghci 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.