web-dev-qa-db-fra.com

Comment charger mon script dans le REPL node.js?

J'ai un script foo.js qui contient certaines fonctions que je veux jouer dans le REPL.

Existe-t-il un moyen de demander à node d’exécuter mon script, puis de sauter dans un REPL avec toutes les fonctions globales déclarées, comme je le peux avec python -i foo.py ou ghci foo.hs?

118
hugomg

Il n'y a toujours rien d'intégré pour fournir la fonctionnalité exacte que vous décrivez. Cependant, une alternative à l’utilisation de require consiste à utiliser le .load commande dans le REPL, comme ceci:

.load foo.js

Il charge le fichier ligne par ligne comme si vous l'aviez tapé dans le REPL. Contrairement à require, cela pollue l’historique REPL avec les commandes que vous avez chargées. Cependant, il a l’avantage d’être répétable car il n’est pas mis en cache comme require.

Ce qui est meilleur pour vous dépendra de votre cas d'utilisation.


Edit: Son applicabilité est limitée car il ne fonctionne pas en mode strict, mais trois ans plus tard, j'ai appris que si votre script n'a pas 'use strict', vous pouvez tilisez eval pour charger votre script sans polluer l’historique REPL historique:

var fs = require('fs');
eval(fs.readFileSync('foo.js').toString())
158
vossad01

j'utilise toujours cette commande

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

fonctionne exactement comme dans Python sans aucun paquet.

25
George Shalvashvili

J'ai fait Vorpal.js , qui gère ce problème en transformant votre nœud add en un CLI interactif. Il supporte une extension REPL, qui vous place dans un REPL dans le contexte de votre application en cours d'exécution.

var vorpal = require('vorpal')();
var repl = require('vorpal-repl');

vorpal
  .delimiter('myapp>')
  .use(repl)
  .show()
  .parse(process.argv); 

Ensuite, vous pouvez exécuter l'application et il va tomber dans un REPL.

$ node myapp.js repl
myapp> repl: 
8
dthree

J'ai créé replpad depuis que je suis fatigué de recharger le script à plusieurs reprises.

Installez-le simplement via: npm install -g replpad

Puis utilisez-le en lançant: replpad

Si vous voulez qu'il regarde tous les fichiers du sous-répertoire courant et tous les sous-répertoires et les dirige vers le repl lorsqu'ils changent, faites: replpad .

Regardez les vidéos sur le site pour avoir une meilleure idée de la façon dont cela fonctionne et découvrez quelques autres fonctionnalités de Nice comme celles-ci:

  • accédez au document principal du module dans la réplique via la fonction dox() ajoutée à chaque fonction principale, c'est-à-dire fs.readdir.dox()
  • accéder aux readmes du module utilisateur dans le repl via la fonction dox() ajoutée à chaque module installé via npm, c'est-à-dire marked.dox()
  • le code source en surbrillance de la fonction d'accès , les informations sur où la fonction a été définie (fichier , linumber) et les commentaires de fonction et/ou jsdocs si possible via la propriété src ajoutée à chaque fonction, c.-à-d. express.logger.src
  • scriptie-talkie support (voir la commande .talk)
  • ajoute des commandes et des raccourcis clavier
  • raccourcis clavier vim
  • support de la carte de touches
  • parens correspondants via match token plugin
  • ajoute le code entré dans la réponse au fichier via un raccourci clavier ou une commande .append
7
Thorsten Lorenz

Une autre façon consiste à définir ces fonctions comme globales.

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

Ensuite, préchargez le fichier dans le REPL comme:

node -r ./file.js

La fonction helloWorld est alors directement accessible dans le REPL.

7
Ashish Chaudhary

Pourquoi ne pas charger le fichier dans un noeud interactif?

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

Ensuite, vous pouvez ajouter aux scripts package.json

"repl": "node -e 'var client = require(\"./build/main/index.js\"); console.log(\"Use `client` in repl\")' -i",

testé en utilisant le noeud v8.1.2

5
lfender6445

replpad est cool, mais pour un moyen rapide et facile de charger un fichier dans un nœud, d'importer ses variables et de démarrer une réplique, vous pouvez ajouter le code suivant à la fin de votre fichier .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]);
    })();
}

Maintenant, si votre fichier est src.js, Exécuter node src.js Démarrera le nœud, chargera le fichier, lancera une réplique et copiera tous les objets déclarés comme var au niveau supérieur également. comme tous les globals exportés. La if (require.main === module) garantit que ce code ne sera pas exécuté si src.js Est inclus via une instruction require. En fait, vous pouvez ajouter le code que vous souhaitez exécuter lorsque vous exécutez src.js En mode autonome à des fins de débogage dans l'instruction if.

4
user1936097

Actuellement, vous ne pouvez pas le faire directement, mais vous pouvez mylib = require('./foo.js') dans le REPL. Rappelez-vous que les méthodes sont exportées et non déclarées comme globales.

4
Ricardo Tomasi

Une autre suggestion que je ne vois pas ici: essayez ce petit bout de code

#!/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

Ensuite, vous pouvez simplement exécuter ce script et il inclura foo en tant que variable

3
corvid

Voici une version de fonction bash de réponse de George :

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

Si vous mettez ceci dans votre ~/.bash_profile vous pouvez l’utiliser comme un alias, c’est-à-dire:

noderepl foo.js
3
Eliot

Ancienne réponse

type test.js|node -i

Ouvre le noeud REPL et saisit toutes les lignes de test.js dans REPL, mais pour une raison quelconque, le noeud se ferme à la fin du fichier

Un autre problème est que les fonctions ne seront pas hissées.

Meilleure réponse

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

Tous les globaux déclarés sans var dans test2.js seront disponibles dans le REPL.

je ne sais pas pourquoi la var dans la portée globale ne sera pas disponible

1
Jew