Yanıtlar:
Hala tarif ettiğiniz tam işlevselliği sağlamak için yerleşik hiçbir şey yoktur. Bununla birlikte, REPL içindeki komuturequire
kullanmak için kullanmanın bir alternatifi , örneğin:.load
.load foo.js
Dosyayı, tıpkı REPL'e yazmışsınız gibi satır satır yükler. Bunun aksine require
, REPL geçmişini yüklediğiniz komutlarla kirletir. Ancak, tekrarlanabilir olma avantajına sahiptir çünkürequire
.
Hangisinin sizin için daha iyi olduğu, kullanım durumunuza bağlı olacaktır.
Düzenleme: o katı modda çalışması değil, ancak üç yıl sonra ben komut yoksa öğrendik çünkü sınırlı uygulanabilirliği vardır 'use strict'
yapabilirsiniz kullanmak eval
Senaryonu yüklemek için REPL geçmişini kirletmeden:
var fs = require('fs');
eval(fs.readFileSync('foo.js').toString())
her zaman bu komutu kullanırım
node -i -e "$(< yourScript.js)"
Python'da olduğu gibi paketler olmadan çalışır.
Düğüm eklemenizi etkileşimli bir CLI'ye dönüştürerek bu sorunu çözen Vorpal.js'yi yaptım . Çalışan uygulamanızın bağlamında sizi bir REPL'e düşüren bir REPL uzantısını destekler.
var vorpal = require('vorpal')();
var repl = require('vorpal-repl');
vorpal
.delimiter('myapp>')
.use(repl)
.show()
.parse(process.argv);
Ardından uygulamayı çalıştırabilirsiniz ve bir REPL'e düşecektir.
$ node myapp.js repl
myapp> repl:
Başka bir yol da bu işlevleri küresel olarak tanımlamaktır.
global.helloWorld = function() { console.log("Hello World"); }
Ardından, REPL'deki dosyayı şu şekilde önceden yükleyin:
node -r ./file.js
Daha sonra işleve helloWorld
doğrudan REPL'den erişilebilir.
Komut dosyasını tekrar tekrar yüklemekten bıktığım için replpad'i oluşturdum .
Basitçe şu şekilde kurun: npm install -g replpad
Ardından şunu çalıştırarak kullanın: replpad
Geçerli ve tüm alt dizinlerdeki tüm dosyaları izlemesini ve değiştiklerinde bunları repl'ye yönlendirmesini istiyorsanız, şunu yapın: replpad .
Nasıl çalıştığına dair daha iyi bir fikir edinmek ve bunlara benzeyen diğer bazı güzel özellikler hakkında bilgi edinmek için sitedeki videolara göz atın:
dox()
Her çekirdek işleve eklenen işlev aracılığıyla repl'deki çekirdek modül belgelerine erişin , ör.fs.readdir.dox()
dox()
her modüle eklenen işlev aracılığıyla repl'deki kullanıcı modülü okumalarına erişin, yanimarked.dox()
src
olan her işleve eklenen özellik aracılığıyla işlev yorumları ve / veya jsdocs , yaniexpress.logger.src
.talk
komutabakın).append
komutuyla dosyaya geri eklerBakınız: https://github.com/thlorenz/replpad
CXX=clang++ npm install replpad
hatayı çözmek zorunda kaldımg++: 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
Dosyayı neden etkileşimli bir düğüm çoğaltmasına yüklemiyorsunuz?
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
Ardından package.json betiklerine ekleyebilirsiniz.
"repl": "node -e 'var client = require(\"./build/main/index.js\"); console.log(\"Use `client` in repl\")' -i",
düğüm v8.1.2 kullanılarak test edildi
node -i -r "./build/main/index.js"
?
Şu anda bunu doğrudan yapamazsınız, ancak mylib = require('./foo.js')
REPL'de yapabilirsiniz . Metodların global olarak beyan edilmediğini, ihraç edildiğini unutmayın.
.load my_work.js
Bazı ek exports.working_var = ...
bildirimler gerektirmesine rağmen bunu tercih edilir buluyorum , çünkü REPL çok satırlı yorumlar gibi (en azından benim readline
yapılandırmamla) mükemmel bir şekilde geçerli bazı javascript türlerini engelliyor .
replpad
iyidir, ancak bir dosyayı düğüme yüklemenin, değişkenlerini içe aktarmanın ve bir repl başlatmanın hızlı ve kolay bir yolu için aşağıdaki kodu .js dosyanızın sonuna ekleyebilirsiniz
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]);
})();
}
Şimdi, dosyanız src.js
çalışıyorsa, çalışan node src.js
düğüm başlatacak, dosyayı yükleyecek, bir REPL başlatacak ve var
en üst düzeyde olduğu bildirilen tüm nesneleri ve dışa aktarılan tüm nesneleri kopyalayacaktır . if (require.main === module)
Eğer bu kod yürütülmez olmasını sağlar src.js
bir içinden dahildir require
açıklamada. Aslında, ifade src.js
içinde hata ayıklama amacıyla bağımsız olarak çalıştırdığınızda çıkarılmasını istediğiniz herhangi bir kodu ekleyebilirsiniz if
.
İşte George'un cevabının bash fonksiyonu versiyonu :
noderepl() {
FILE_CONTENTS="$(< $1 )"
node -i -e "$FILE_CONTENTS"
}
Bunu kendi içine koyarsan ~/.bash_profile
takma ad gibi kullanabilirsin, yani:
noderepl foo.js
Burada görmediğim başka bir öneri: bu küçük kodu deneyin
#!/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
Daha sonra bu komut dosyasını çalıştırabilirsiniz ve foo
bir değişken olarak içerecektir .
Eski cevap
type test.js|node -i
REPL düğümünü açacak ve test.js'den REPL'ye tüm satırları yazacak, ancak bazı nedenlerden dolayı düğüm dosya bittikten sonra çıkacak
Diğer bir sorun da, işlevlerin kaldırılmamasıdır.
node -e require('repl').start({useGlobal:true}); -r ./test2.js
Ardından, test2.js içinde var olmadan bildirilen tüm globaller REPL'de mevcut olacaktır.
küresel kapsamdaki var a'nın neden kullanılamayacağından emin değilim