Réponses:
Il n'y a toujours rien de intégré pour fournir la fonctionnalité exacte que vous décrivez. Cependant, une alternative à son utilisation require
pour utiliser la .load
commande dans le REPL, comme ceci:
.load foo.js
Il charge le fichier ligne par ligne comme si vous l'aviez tapé dans la 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 le mieux pour vous dépendra de votre cas d'utilisation.
Edit: Il a une applicabilité limitée car il ne fonctionne pas en mode strict, mais trois ans plus tard, j'ai appris que si votre script ne l'a pas 'use strict'
, vous pouvez l' utiliser eval
pour charger votre script sans polluer l'historique REPL:
var fs = require('fs');
eval(fs.readFileSync('foo.js').toString())
j'utilise toujours cette commande
node -i -e "$(< yourScript.js)"
fonctionne exactement comme en Python sans aucun paquet.
J'ai créé Vorpal.js , qui gère ce problème en transformant l'ajout de votre nœud en une CLI interactive. Il prend en charge une extension REPL, qui vous place dans une 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 elle tombera dans une REPL.
$ node myapp.js repl
myapp> repl:
Une autre façon est de 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
Ensuite, la fonction helloWorld
est accessible directement dans le REPL.
J'ai créé replpad car j'étais fatigué de recharger le script à plusieurs reprises.
Installez-le simplement via: npm install -g replpad
Ensuite, utilisez-le en exécutant: replpad
Si vous voulez qu'il surveille tous les fichiers dans le sous-répertoire courant et tous les sous-répertoires et les redirige vers le repl lorsqu'ils changent, faites: replpad .
Regardez les vidéos sur le site pour avoir une meilleure idée de son fonctionnement et découvrez quelques autres fonctionnalités intéressantes comme celles-ci:
dox()
fonction qui est ajoutée à chaque fonction principale, c'est-à-direfs.readdir.dox()
dox()
fonction qui est ajoutée à chaque module installé via npm, iemarked.dox()
src
propriété qui est ajoutée à chaque fonction, c'est-à-direexpress.logger.src
.talk
commande).append
commandeCXX=clang++ npm install replpad
contourner l'erreurg++: error: unrecognized command line option '-stdlib=libc++'
# # Fatal error in ../deps/v8/src/api.cc, line 1248 # Check failed: !value_obj->IsJSReceiver() || value_obj->IsTemplateInfo(). # Illegal instruction: 4
Pourquoi ne pas charger le fichier dans un nœud interactif 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
Ensuite, vous pouvez ajouter des scripts package.json
"repl": "node -e 'var client = require(\"./build/main/index.js\"); console.log(\"Use `client` in repl\")' -i",
testé avec le nœud v8.1.2
node -i -r "./build/main/index.js"
?
Actuellement, vous ne pouvez pas le faire directement, mais vous pouvez le faire mylib = require('./foo.js')
dans le REPL. N'oubliez pas que les méthodes sont exportées et non déclarées comme globales.
.load my_work.js
, malgré la nécessité de quelques exports.working_var = ...
déclarations supplémentaires , car le REPL barfs sur certains types de javascript parfaitement valides, comme les commentaires multilignes (au moins avec ma readline
configuration).
replpad
c'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 un repl, 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
, l'exécution node src.js
lancera le nœud, chargera le fichier, lancera une REPL et copiera tous les objets déclarés comme var
au niveau supérieur ainsi que tous les globaux exportés. Le if (require.main === module)
garantit que ce code ne sera pas exécuté s'il src.js
est inclus via une require
instruction. En fait, vous pouvez ajouter n'importe quel code que vous souhaitez exécuter lorsque vous exécutez de manière src.js
autonome à des fins de débogage dans l' if
instruction.
Voici une version de fonction bash de la 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
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
comme variable
Ancienne réponse
type test.js|node -i
Ouvre le nœud REPL et saisit toutes les lignes de test.js dans REPL, mais pour une raison quelconque, le nœud se fermera après 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
Ensuite, tous les globaux déclarés sans var dans test2.js seront disponibles dans le REPL
Je ne sais pas pourquoi var a dans la portée globale ne sera pas disponible