Antworten:
Es ist immer noch nichts eingebaut, um die genaue Funktionalität bereitzustellen, die Sie beschreiben. Eine Alternative zur Verwendung require
, um den .load
Befehl in der REPL zu verwenden, wie z.
.load foo.js
Es lädt die Datei zeilenweise so, als hätten Sie sie in die REPL eingegeben. Im Gegensatz require
dazu verschmutzt der REPL-Verlauf mit den von Ihnen geladenen Befehlen. Es hat jedoch den Vorteil, dass es wiederholbar ist, da es nicht wie zwischengespeichert ist require
.
Was für Sie besser ist, hängt von Ihrem Anwendungsfall ab.
Edit: Es begrenzte Anwendbarkeit hat , weil es keine Arbeit im Strict - Modus der Fall ist, aber drei Jahre später habe ich gelernt , dass , wenn Ihr Skript nicht 'use strict'
, können Sie verwenden eval
das Skript zu laden , um ohne die REPL Geschichte zu verschmutzen:
var fs = require('fs');
eval(fs.readFileSync('foo.js').toString())
Ich benutze immer diesen Befehl
node -i -e "$(< yourScript.js)"
funktioniert genau wie in Python ohne Pakete.
Ich habe Vorpal.js erstellt , das dieses Problem löst , indem Ihr Knoten in eine interaktive CLI umgewandelt wird. Es unterstützt eine REPL-Erweiterung, mit der Sie im Kontext Ihrer laufenden App in eine REPL versetzt werden.
var vorpal = require('vorpal')();
var repl = require('vorpal-repl');
vorpal
.delimiter('myapp>')
.use(repl)
.show()
.parse(process.argv);
Dann können Sie die App ausführen und sie wird in eine REPL eingefügt.
$ node myapp.js repl
myapp> repl:
Eine andere Möglichkeit besteht darin, diese Funktionen als global zu definieren.
global.helloWorld = function() { console.log("Hello World"); }
Laden Sie dann die Datei in der REPL wie folgt vor:
node -r ./file.js
Dann helloWorld
kann direkt in der REPL auf die Funktion zugegriffen werden.
Ich habe ein Replpad erstellt, da ich es satt hatte, das Skript wiederholt neu zu laden .
Einfach installieren über: npm install -g replpad
Verwenden Sie es dann, indem Sie Folgendes ausführen: replpad
Wenn Sie möchten, dass alle Dateien im aktuellen und in allen Unterverzeichnissen überwacht und bei Änderungen in die Repl-Datei übertragen werden, gehen Sie wie folgt vor: replpad .
Schauen Sie sich die Videos auf der Website an, um eine bessere Vorstellung davon zu bekommen, wie es funktioniert, und lernen Sie einige andere nette Funktionen kennen, die es wie diese hat:
dox()
Funktion, die jeder Kernfunktion hinzugefügt wird, auf die Dokumente des Kernmoduls in der Replfs.readdir.dox()
dox()
Funktion, die jedem über npm installierten Modul hinzugefügt wird, auf die Readmes des Benutzermoduls in der Antwort zumarked.dox()
src
Eigenschaft, die jeder Funktion hinzugefügt wird, d. hexpress.logger.src
.talk
Befehl).append
Befehl wieder an die Datei anCXX=clang++ npm install replpad
den Fehler g++: 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
Warum nicht die Datei in eine interaktive Knotenreplikation laden?
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
Dann können Sie package.json-Skripte hinzufügen
"repl": "node -e 'var client = require(\"./build/main/index.js\"); console.log(\"Use `client` in repl\")' -i",
getestet mit Knoten v8.1.2
node -i -r "./build/main/index.js"
?
Derzeit können Sie das nicht direkt tun, aber Sie können mylib = require('./foo.js')
in der REPL. Denken Sie daran, dass Methoden exportiert und nicht als global deklariert werden.
.load my_work.js
, obwohl einige zusätzliche exports.working_var = ...
Deklarationen erforderlich sind , da die REPL einige Arten von perfekt gültigem Javascript wie mehrzeilige Kommentare (zumindest bei meiner readline
Konfiguration) blockiert .
replpad
ist cool, aber für eine schnelle und einfache Möglichkeit, eine Datei in einen Knoten zu laden, ihre Variablen zu importieren und eine Replikation zu starten, können Sie den folgenden Code am Ende Ihrer .js-Datei hinzufügen
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]);
})();
}
Wenn Ihre Datei nun ausgeführt wird src.js
, node src.js
wird der Knoten gestartet, die Datei geladen, eine REPL gestartet und alle als var
oberste Ebene deklarierten Objekte sowie alle exportierten Globals kopiert. Die if (require.main === module)
sorgt dafür , dass dieser Code nicht ausgeführt werden , wenn src.js
durch eine inbegriffene require
Erklärung. Tatsächlich können Sie jeden Code hinzufügen, der ausgeführt werden soll, wenn Sie src.js
eigenständig zu Debugging-Zwecken innerhalb der if
Anweisung ausgeführt werden.
Hier ist eine Bash-Funktionsversion von Georges Antwort :
noderepl() {
FILE_CONTENTS="$(< $1 )"
node -i -e "$FILE_CONTENTS"
}
Wenn Sie dies in Ihr ~/.bash_profile
eingeben, können Sie es wie einen Alias verwenden, dh:
noderepl foo.js
Ein weiterer Vorschlag, den ich hier nicht sehe: Probieren Sie dieses kleine Stück Code aus
#!/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
Dann können Sie dieses Skript einfach ausführen und es wird foo
als Variable enthalten
Alte Antwort
type test.js|node -i
Öffnet den Knoten REPL und gibt alle Zeilen von test.js in REPL ein. Aus irgendeinem Grund wird der Knoten jedoch nach dem Ende der Datei beendet
Ein weiteres Problem ist, dass Funktionen nicht gehisst werden.
node -e require('repl').start({useGlobal:true}); -r ./test2.js
Dann sind alle in var2.2.s ohne var deklarierten Globals in der REPL verfügbar
Ich bin mir nicht sicher, warum var a im globalen Bereich nicht verfügbar ist