Jawaban:
Masih belum ada built-in untuk memberikan fungsionalitas tepat yang Anda gambarkan. Namun, alternatif untuk menggunakannya require
untuk menggunakan .load
perintah dalam REPL, seperti:
.load foo.js
Itu memuat file sejalan dengan baris sama seperti jika Anda mengetiknya di REPL. Tidak seperti require
ini mencemari riwayat REPL dengan perintah yang Anda muat. Namun, ini memiliki keuntungan karena dapat diulang karena tidak di-cache seperti require
.
Mana yang lebih baik untuk Anda akan tergantung pada use case Anda.
Sunting: Ini memiliki penerapan terbatas karena tidak bekerja dalam mode ketat, tetapi tiga tahun kemudian saya telah belajar bahwa jika skrip Anda tidak memiliki 'use strict'
, Anda dapat menggunakan eval
untuk memuat skrip Anda tanpa mencemari riwayat REPL:
var fs = require('fs');
eval(fs.readFileSync('foo.js').toString())
saya selalu menggunakan perintah ini
node -i -e "$(< yourScript.js)"
bekerja persis seperti di Python tanpa paket apa pun.
Saya membuat Vorpal.js , yang menangani masalah ini dengan mengubah simpul Anda menjadi CLI interaktif. Ini mendukung ekstensi REPL, yang menjatuhkan Anda ke dalam REPL dalam konteks aplikasi Anda yang sedang berjalan.
var vorpal = require('vorpal')();
var repl = require('vorpal-repl');
vorpal
.delimiter('myapp>')
.use(repl)
.show()
.parse(process.argv);
Kemudian Anda dapat menjalankan aplikasi dan itu akan jatuh ke dalam REPL.
$ node myapp.js repl
myapp> repl:
Cara lain adalah mendefinisikan fungsi-fungsi tersebut sebagai global.
global.helloWorld = function() { console.log("Hello World"); }
Kemudian pramuat file dalam REPL sebagai:
node -r ./file.js
Maka fungsi tersebut helloWorld
dapat diakses langsung di REPL.
Saya membuat replpad karena saya bosan memuat ulang skrip berulang kali.
Cukup instal melalui: npm install -g replpad
Kemudian gunakan dengan menjalankan: replpad
Jika Anda ingin menonton semua file di subdirektori saat ini dan semua dan pipa ke repl ketika mereka berubah lakukan: replpad .
Lihat video di situs untuk mendapatkan ide yang lebih baik tentang cara kerjanya dan pelajari beberapa fitur bagus lainnya seperti ini:
dox()
fungsi yang ditambahkan ke setiap fungsi inti, yaitufs.readdir.dox()
dox()
fungsi yang ditambahkan ke setiap modul yang diinstal melalui npm, yaitumarked.dox()
src
properti yang ditambahkan ke setiap fungsi, yaituexpress.logger.src
.talk
perintah).append
perintah keyboardCXX=clang++ npm install replpad
mengatasi kesalahang++: 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
Mengapa tidak memuat file ke repl node interaktif?
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
Kemudian Anda bisa menambahkan ke script package.json
"repl": "node -e 'var client = require(\"./build/main/index.js\"); console.log(\"Use `client` in repl\")' -i",
diuji menggunakan simpul v8.1.2
node -i -r "./build/main/index.js"
?
Saat ini Anda tidak bisa melakukan itu secara langsung, tetapi Anda bisa mylib = require('./foo.js')
di REPL. Ingat metode diekspor, tidak dinyatakan sebagai global.
.load my_work.js
, meskipun memerlukan beberapa exports.working_var = ...
deklarasi tambahan , karena REPL muntah pada beberapa jenis javascript yang benar-benar valid, seperti komentar multiline (setidaknya dengan readline
konfigurasi saya ).
replpad
itu keren, tetapi untuk cara cepat dan mudah memuat file ke dalam simpul, mengimpor variabel-variabelnya dan memulai repl, Anda dapat menambahkan kode berikut ke akhir file .js Anda
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]);
})();
}
Sekarang jika file Anda src.js
, menjalankan node src.js
akan memulai node, memuat file, memulai REPL, dan menyalin semua objek yang dinyatakan sebagai var
di tingkat atas serta semua global yang diekspor. The if (require.main === module)
memastikan bahwa kode ini tidak akan dieksekusi jika src.js
disertakan melalui require
pernyataan. Sebenarnya, Anda dapat menambahkan kode apa pun yang ingin dikecualikan saat menjalankan src.js
mandiri untuk keperluan debugging di dalam if
pernyataan.
Inilah versi fungsi bash dari jawaban George :
noderepl() {
FILE_CONTENTS="$(< $1 )"
node -i -e "$FILE_CONTENTS"
}
Jika Anda memasukkan ini ke dalam Anda, ~/.bash_profile
Anda dapat menggunakannya seperti alias, yaitu:
noderepl foo.js
Saran lain yang tidak saya lihat di sini: coba sedikit kode ini
#!/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
Kemudian Anda cukup menjalankan skrip ini dan itu akan dimasukkan foo
sebagai variabel
Jawaban lama
type test.js|node -i
Akan membuka simpul REPL dan mengetikkan semua baris dari test.js ke dalam REPL, tetapi untuk beberapa alasan simpul akan berhenti setelah file berakhir
Masalah lainnya adalah, bahwa fungsi tidak akan diangkat.
node -e require('repl').start({useGlobal:true}); -r ./test2.js
Kemudian semua global yang dinyatakan tanpa var di dalam test2.js akan tersedia di REPL
tidak yakin mengapa var a dalam lingkup global tidak akan tersedia