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
?
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())
j'utilise toujours cette commande
node -i -e "$(< yourScript.js)"
fonctionne exactement comme dans Python sans aucun paquet.
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:
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:
dox()
ajoutée à chaque fonction principale, c'est-à-dire fs.readdir.dox()
dox()
ajoutée à chaque module installé via npm, c'est-à-dire marked.dox()
src
ajoutée à chaque fonction, c.-à-d. express.logger.src
.talk
).append
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.
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
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
.
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.
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
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
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.
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