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 evalSenaryonu 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 helloWorlddoğ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()srcolan her işleve eklenen özellik aracılığıyla işlev yorumları ve / veya jsdocs , yaniexpress.logger.src.talkkomutabakın).appendkomutuyla dosyaya geri eklerBakınız: https://github.com/thlorenz/replpad
CXX=clang++ npm install replpadhatayı çö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.jsBazı ek exports.working_var = ...bildirimler gerektirmesine rağmen bunu tercih edilir buluyorum , çünkü REPL çok satırlı yorumlar gibi (en azından benim readlineyapı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.jsdüğüm başlatacak, dosyayı yükleyecek, bir REPL başlatacak ve varen ü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.jsbir içinden dahildir requireaçıklamada. Aslında, ifade src.jsiç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_profiletakma 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 foobir 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