Risposte:
Non c'è ancora nulla di integrato per fornire la funzionalità esatta che descrivi. Tuttavia, un'alternativa all'utilizzo require
per utilizzare il .load
comando all'interno del REPL, come tale:
.load foo.js
Carica il file riga per riga proprio come se fosse stato digitato nel REPL. Diversamente da require
ciò, inquina la cronologia REPL con i comandi caricati. Tuttavia, ha il vantaggio di essere ripetibile perché non è memorizzato nella cache require
.
Quale è meglio per te dipenderà dal tuo caso d'uso.
Modifica: ha un'applicabilità limitata perché non funziona in modalità rigorosa, ma tre anni dopo ho imparato che se lo script non ha 'use strict'
, è possibile utilizzare eval
per caricare lo script senza inquinare la cronologia REPL:
var fs = require('fs');
eval(fs.readFileSync('foo.js').toString())
uso sempre questo comando
node -i -e "$(< yourScript.js)"
funziona esattamente come in Python senza pacchetti.
Ho creato Vorpal.js , che gestisce questo problema trasformando il tuo nodo in un'interfaccia della riga di comando interattiva. Supporta un'estensione REPL, che ti porta in una REPL nel contesto dell'app in esecuzione.
var vorpal = require('vorpal')();
var repl = require('vorpal-repl');
vorpal
.delimiter('myapp>')
.use(repl)
.show()
.parse(process.argv);
Quindi è possibile eseguire l'app e verrà rilasciata in una REPL.
$ node myapp.js repl
myapp> repl:
Un altro modo è definire quelle funzioni come globali.
global.helloWorld = function() { console.log("Hello World"); }
Quindi precaricare il file nella REPL come:
node -r ./file.js
Quindi è helloWorld
possibile accedere alla funzione direttamente nel REPL.
Ho creato replpad da quando mi sono stancato di ricaricare ripetutamente lo script.
Basta installarlo tramite: npm install -g replpad
Quindi usalo eseguendo: replpad
Se vuoi che guardi tutti i file nelle sottodirectory correnti e in tutte e li installi nella sostituzione quando cambiano fai: replpad .
Guarda i video sul sito per avere un'idea migliore di come funziona e conoscere alcune altre belle funzionalità che ha come queste:
dox()
funzione aggiunta a ogni funzione principale, ad esfs.readdir.dox()
dox()
funzione che viene aggiunta a ogni modulo installato tramite npm, ad esmarked.dox()
src
proprietà che viene aggiunta a ogni funzione, ad es.express.logger.src
.talk
comando).append
comandoCXX=clang++ npm install replpad
aggirare l'erroreg++: 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
Perché non caricare il file in un nodo interattivo sostitutivo?
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
Quindi è possibile aggiungere agli script package.json
"repl": "node -e 'var client = require(\"./build/main/index.js\"); console.log(\"Use `client` in repl\")' -i",
testato usando il nodo v8.1.2
node -i -r "./build/main/index.js"
?
Attualmente non puoi farlo direttamente, ma puoi farlo mylib = require('./foo.js')
nel REPL. Ricorda che i metodi vengono esportati, non dichiarati come globali.
.load my_work.js
, nonostante richiedano alcune exports.working_var = ...
dichiarazioni aggiuntive , perché REPL barfa su alcuni tipi di javascript perfettamente validi, come i commenti multilinea (almeno con la mia readline
configurazione).
replpad
è interessante, ma per un modo semplice e veloce di caricare un file nel nodo, importare le sue variabili e avviare un sostituto, è possibile aggiungere il seguente codice alla fine del file .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]);
})();
}
Ora, se il tuo file è src.js
, l'esecuzione node src.js
avvia il nodo, carica il file, avvia una REPL e copia tutti gli oggetti dichiarati come var
di livello superiore e tutti i globi esportati. Le if (require.main === module)
assicura che questo codice non verrà eseguito se src.js
è incluso attraverso un require
comunicato. In effetti, è possibile aggiungere qualsiasi codice che si desidera essere escluso quando si esegue src.js
autonomamente per scopi di debug all'interno dell'istruzione if
.
Ecco una versione della funzione bash della risposta di George :
noderepl() {
FILE_CONTENTS="$(< $1 )"
node -i -e "$FILE_CONTENTS"
}
Se lo metti nel tuo ~/.bash_profile
puoi usarlo come un alias, cioè:
noderepl foo.js
Un altro suggerimento che non vedo qui: prova questo po 'di codice
#!/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
Quindi puoi semplicemente eseguire questo script e includerà foo
come variabile
Vecchia risposta
type test.js|node -i
Aprirà il nodo REPL e digiterà tutte le righe da test.js in REPL, ma per qualche ragione il nodo si chiuderà al termine del file
Un altro problema è che le funzioni non verranno sollevate.
node -e require('repl').start({useGlobal:true}); -r ./test2.js
Quindi tutti i globali dichiarati senza var all'interno di test2.js saranno disponibili nel REPL
non so perché var a nell'ambito globale non sarà disponibile