Komut dosyamı node.js REPL'e nasıl yüklerim?


137

foo.jsREPL'de oynamak istediğim bazı işlevleri içeren bir komut dosyam var.

Düğümün betiğimi yürütmesini ve ardından tüm bildirilen globalleri içeren bir REPL'e atlamasının bir yolu var mı, python -i foo.pyveya ile yapabildiğim gibi ghci foo.hs?

Yanıtlar:


179

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())

Eşzamansız bir geri aramanın içindeki repl'e bırakmak istersem ne olur?
Chet

2
@Chet Sorunuz mevcut soruyla uyuşmuyorsa yeni bir StackOverflow sorusu
yazarsınız

@Chet (async () => {daha fazla kod}) () ile başka bir dosya .load edebilirsiniz; ve aynı küreselleri paylaşacak.
nurettin

MacOS kullanıyorsanız ipucu (belki başkaları da). REPL'e ".load" yazabilir (boşluğa dikkat edin) ve komutunuza doğru yolu eklemek için dosyayı Finder'dan Terminal'e sürükleyip / bırakabilirsiniz. Bu, üzerinde çalıştığınız dosyalar birkaç seviye aşağıda ise kullanışlıdır.
jamesnotjim

35

her zaman bu komutu kullanırım

node -i -e "$(< yourScript.js)"

Python'da olduğu gibi paketler olmadan çalışır.


1
Bunun windows cmd'de nasıl çalıştırılacağını bilen var mı? Bash'de çalıştırdım ama pencerelerde değil.
Sharpiro

@Sharpiro: Git'i yüklerseniz, Windows PC'nize bir mini-UNIX kurma seçeneğiniz vardır. Git'in Windows için normal dağılımını kastediyorum.
Juan Lanus

Bununla ilgili sinir bozucu olan tek şey, Node.js'nin repl istemini yazdırması ve ardından komut dosyanızı çalıştırması, böylece herhangi bir çıktı istemden sonra takılı kalmasıdır. stackoverflow.com/a/45893494/3538165'te bu sorun yoktur, ancak bu çözüm için işlevlerin, repl ad alanında son bulması için değişkenlere açık bir şekilde atanması gerekir, bu nedenle de pek iyi değildir.
Radon Rosborough

10

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: 

8

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.


8

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()
  • npm aracılığıyla kurulan dox()her modüle eklenen işlev aracılığıyla repl'deki kullanıcı modülü okumalarına erişin, yanimarked.dox()
  • erişim işlevinin vurgulanan kaynak kodu , işlevin nerede tanımlandığı hakkında bilgi (dosya, keten numarası) ve mümkün srcolan her işleve eklenen özellik aracılığıyla işlev yorumları ve / veya jsdocs , yaniexpress.logger.src
  • scriptie-talkie desteği (.talkkomutabakın)
  • komutlar ve klavye kısayolları ekler
  • vim anahtar bağlamaları
  • anahtar harita desteği
  • eşleştirme belirteci eklentisi ile eşleşen parenler
  • repl'de girilen kodu klavye kısayolu veya .appendkomutuyla dosyaya geri ekler

Bakınız: https://github.com/thlorenz/replpad


Bu CXX=clang++ npm install replpadhatayı çözmek zorunda kaldımg++: error: unrecognized command line option '-stdlib=libc++'
ShadSterling

Ama sonra çalıştırdığımda başarısız oluyor# # Fatal error in ../deps/v8/src/api.cc, line 1248 # Check failed: !value_obj->IsJSReceiver() || value_obj->IsTemplateInfo(). # Illegal instruction: 4
ShadSterling

5

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


2
neden sadece node -i -r "./build/main/index.js"?
Z. Khullah

4

Ş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 .
chbrown

4

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.


4

İş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

2
Bunu aylardır kullanıyorum ve yeni bir kabuk ortamına geçişte bazı ayarlarımı kaybettim ve bunu tekrar izlemek zorunda kaldım. Bu yüzden burada olduğum için, bu gerçekten yararlı işlev için size teşekkür edeceğimi düşündüm.
Xaekai

3

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 .


1

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.

Daha iyi cevap

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


8
Lütfen cevabınıza biraz açıklama ekleyin
mechnicov
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.