Nadal nie ma nic wbudowanego, które zapewniałoby dokładnie taką funkcjonalność, którą opisujesz. Jednak alternatywa dla używania require
go do używania .load
polecenia w REPL, na przykład:
.load foo.js
Ładuje plik wiersz po wierszu, tak jakbyś wpisał go w REPL. W przeciwieństwie do require
tego zanieczyszcza historię REPL za pomocą załadowanych poleceń. Ma jednak tę zaletę, że jest powtarzalny, ponieważ nie jest przechowywany w pamięci podręcznej require
.
To, co jest lepsze dla ciebie, zależy od twojego przypadku użycia.
Edycja: ma ograniczone zastosowanie, ponieważ nie działa w trybie ścisłym, ale trzy lata później dowiedziałem się, że jeśli twój skrypt nie ma 'use strict'
, możesz użyć eval
do załadowania skryptu bez zanieczyszczania historii REPL:
var fs = require('fs');
eval(fs.readFileSync('foo.js').toString())
zawsze używam tego polecenia
node -i -e "$(< yourScript.js)"
działa dokładnie tak samo, jak w Pythonie bez żadnych pakietów.
źródło
Stworzyłem Vorpal.js , który rozwiązuje ten problem, zmieniając Twój węzeł w interaktywny CLI. Obsługuje rozszerzenie REPL, które przenosi Cię do REPL w kontekście uruchomionej aplikacji.
var vorpal = require('vorpal')(); var repl = require('vorpal-repl'); vorpal .delimiter('myapp>') .use(repl) .show() .parse(process.argv);
Następnie możesz uruchomić aplikację i spadnie ona do REPL.
źródło
Innym sposobem jest zdefiniowanie tych funkcji jako globalnych.
global.helloWorld = function() { console.log("Hello World"); }
Następnie załaduj plik w REPL jako:
Następnie funkcja
helloWorld
jest dostępna bezpośrednio w REPL.źródło
Stworzyłem replpad, ponieważ zmęczyło mnie wielokrotne ładowanie skryptu.
Po prostu zainstaluj go przez:
npm install -g replpad
Następnie użyj go, uruchamiając:
replpad
Jeśli chcesz, aby obserwował wszystkie pliki w bieżącym i wszystkich podkatalogach i przesyłał je do odpowiedzi, gdy się zmienią, wykonaj:
replpad .
Obejrzyj filmy w witrynie, aby lepiej zrozumieć, jak to działa, i poznaj inne fajne funkcje, takie jak te:
dox()
funkcji, która jest dodawana do każdej funkcji podstawowej, tjfs.readdir.dox()
dox()
funkcji, która jest dodawana do każdego modułu zainstalowanego przez npm, tjmarked.dox()
src
właściwość dodawaną do każdej funkcji, tj.express.logger.src
.talk
poleceń).append
poleceniaZobacz: https://github.com/thlorenz/replpad
źródło
CXX=clang++ npm install replpad
obejść błądg++: 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
Dlaczego nie załadować pliku do interaktywnej repliki węzła?
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
Następnie możesz dodać skrypty do package.json
"repl": "node -e 'var client = require(\"./build/main/index.js\"); console.log(\"Use `client` in repl\")' -i",
testowano przy użyciu węzła 8.1.2
źródło
node -i -r "./build/main/index.js"
?Obecnie nie możesz tego zrobić bezpośrednio, ale możesz
mylib = require('./foo.js')
w REPL. Pamiętaj, że metody są eksportowane, a nie deklarowane jako globalne.źródło
.load my_work.js
, pomimo wymagania kilku dodatkowychexports.working_var = ...
deklaracji, ponieważ barf REPL na niektórych rodzajach doskonale poprawnych skryptów javascript, takich jak komentarze wielowierszowe (przynajmniej w mojejreadline
konfiguracji).replpad
jest fajny, ale aby szybko i łatwo załadować plik do węzła, zaimportować jego zmienne i rozpocząć odpowiedź, możesz dodać następujący kod na końcu pliku .jsif (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]); })(); }
Teraz, jeśli twój plik jest
src.js
, uruchomienienode src.js
uruchomi węzeł, załaduje plik, uruchomi REPL i skopiuje wszystkie obiekty zadeklarowane jakovar
na najwyższym poziomie, a także wszystkie wyeksportowane globale. Wif (require.main === module)
gwarantuje, że ten kod nie zostanie wykonane, jeślisrc.js
jest włączone za pośrednictwemrequire
rachunku. W rzeczywistości możesz dodać dowolny kod, który chcesz, aby był wykonywany, gdy uruchamiaszsrc.js
autonomicznie do celów debugowania wif
instrukcji.źródło
Oto wersja funkcji bash odpowiedzi George'a :
noderepl() { FILE_CONTENTS="$(< $1 )" node -i -e "$FILE_CONTENTS" }
Jeśli umieścisz to w swoim
~/.bash_profile
, możesz używać go jak aliasu, tj .:źródło
Kolejna sugestia, której tutaj nie widzę: wypróbuj ten mały kod
#!/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
Następnie możesz po prostu uruchomić ten skrypt i dołączy on
foo
jako zmiennąźródło
Stara odpowiedź
Otworzy węzeł REPL i wpisze wszystkie wiersze z test.js do REPL, ale z jakiegoś powodu węzeł zakończy pracę po zakończeniu pliku
Innym problemem jest to, że funkcje nie zostaną podniesione.
Lepsza odpowiedź
node -e require('repl').start({useGlobal:true}); -r ./test2.js
Wtedy wszystkie wartości globalne zadeklarowane bez zmiennej w test2.js będą dostępne w REPL
nie wiem, dlaczego zmienna o zasięgu globalnym nie będzie dostępna
źródło
type
że nie działabash
. Aby uzyskać lepszą odpowiedź, wydaje się, że możesz po prostu obejść sięnode -r noderc.js
bez ręcznego uruchamiania repl. Ale musisz przypisać doglobal
bezpośrednio w skrypcie funkcji / var. Powinien istnieć sposób na odpowiednie „vm.runInContext”, aby pobrać więcej wartości ze skryptu.