web-dev-qa-db-fra.com

Comment écrire plusieurs lignes de code dans Node REPL

Je voudrais évaluer

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

en bloc, au lieu d'évaluer ligne par ligne 

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

Existe-t-il un moyen simple de déplacer l'invite à la ligne suivante?

31
user3812377

Le noeud v6.4 a un mode editor. À l'invite de réponse, tapez .editor et vous pouvez entrer plusieurs lignes.

exemple

$ 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.

Voici la documentation de toutes les commandes spéciales de réplication https://nodejs.org/api/repl.html#repl_commands_and_special_keys

58
jhnstn

Vous pouvez utiliser if(1){ pour démarrer un bloc qui ne se terminera pas tant que vous n’aurez pas entré }. Cela affichera la valeur de la dernière ligne du bloc.

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

En mode multiligne, vous manquez beaucoup de REPL subtilités telles que l'auto-complétion et la notification immédiate des erreurs de syntaxe. Si vous êtes bloqué en mode multiligne en raison d'une erreur de syntaxe dans le bloc, utilisez ^C pour revenir à l'invite normale.

19
Phssthpok

la solution de jhnstn est parfaite, mais si vous recherchez d'autres alternatives, vous pouvez insérer le code dans une chaîne multiligne, puis eval comme suit:

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

Bien sûr c'est un bidouillage;)

2
benjaminz

Node.js REPL prend en charge les blocs et peut renvoyer la dernière expression d'un bloc. Il en va de même pour d'autres implémentations de console (console devtools de Chrome).

Cela peut entraîner une erreur de syntaxe, il s'agit d'un changement radical dans le noeud 10.9.0 . { pourrait être un littéral d'objet, un bloc ne peut pas être évalué sans ambiguïté comme un bloc:

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

Bien que cela puisse être évalué sans équivoque en tant que bloc, il retournera undefined:

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

Puisque la dernière expression d'un bloc est consignée, console.log n'est pas nécessaire ici:

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

Notez qu'il s'agit d'une étendue de bloc. Ainsi, let, const et class ne fuiront pas vers REPL, ce comportement peut être souhaitable ou non.

0
estus

Je n’ai peut-être pas bien compris la question, mais si vous voulez écrire une commande multiligne dans la console de la répl, vous pouvez utiliser les touches Maj + Entrée pour passer aux lignes suivantes.

0
Mihai Sabadac