How to write multiple lines of code in Node REPL

后端 未结 5 2137
一个人的身影
一个人的身影 2020-12-23 19:35

I would like to evaluate

var foo = \"foo\";
console.log(foo);

as a block, instead of evaluating line by line

var foo = \"f         


        
相关标签:
5条回答
  • 2020-12-23 19:48

    Maybe I didn't understand the question well, but if you want to write multiline command in the console of the repl, you can use shift+enter to move to the next lines.

    0 讨论(0)
  • 2020-12-23 19:49

    Node v6.4 has an editor mode. At the repl prompt type .editor and you can input multiple lines.

    example

    $ node                                                                                                   
    > .editor
    // Entering editor mode (^D to finish, ^C to cancel)
    const fn = there => `why hello ${there}`;
    fn('multiline');
    // hit ^D 
    'why hello multiline'
    > // 'block' gets evaluated and back in single line mode.
    

    Here are the docs on all the special repl commands https://nodejs.org/api/repl.html#repl_commands_and_special_keys

    0 讨论(0)
  • 2020-12-23 19:56

    You can use if(1){ to start a block that will not finish until you enter }. It will print the value of the last line of the block.

    > {
    ... var foo = "foo";
    ... console.log(foo);
    ... }
    foo
    undefined
    

    In multiline mode you miss out on a lot of REPL niceties such as autocompletion and immediate notification of syntax errors. If you get stuck in multiline mode due to some syntax error within the block, use ^C to return to the normal prompt.

    0 讨论(0)
  • 2020-12-23 20:08

    jhnstn's solution is perfect, but in case you are looking for other alternatives, you can put the code inside a multiline string and then eval it like so:

    > let myLongCode = `
    ... let a = 1;
    ... let b = 2;
    ... console.log(a + b);
    ... `;
    > eval(myLongCode)
    > 3
    

    Of course this is a hack ;)

    0 讨论(0)
  • 2020-12-23 20:08

    Node.js REPL supports blocks and is able to return the last expression from a block, so do some other console implementations (Chrome devtools console).

    This may result in syntax error, this is a breaking change in Node 10.9.0. { could be a object literal, a block cannot be unambiguously evaluated as a block:

    {
    var foo = "foo";
    console.log(foo);
    }
    

    While this can be unambiguously evaluated as a block and will return undefined:

    ;{
    var foo = "foo";
    console.log(foo);
    }
    

    Since the last expression from a block is logged, console.log isn't needed here:

    ;{
    var foo = "foo";
    foo;
    }
    

    Notice that this is block scope, so let, const and class won't leak to REPL scope, this behaviour can be desirable or not.

    0 讨论(0)
提交回复
热议问题