ฉันมีสคริปต์foo.js
ที่มีฟังก์ชันบางอย่างที่ฉันต้องการเล่นใน REPL
มีวิธีที่จะให้โหนดรันสคริปต์ของฉันแล้วกระโดดเข้าสู่ REPL พร้อมกับ globals ที่ประกาศทั้งหมดเช่นที่ฉันสามารถทำได้python -i foo.py
หรือghci foo.hs
ไม่
ฉันมีสคริปต์foo.js
ที่มีฟังก์ชันบางอย่างที่ฉันต้องการเล่นใน REPL
มีวิธีที่จะให้โหนดรันสคริปต์ของฉันแล้วกระโดดเข้าสู่ REPL พร้อมกับ globals ที่ประกาศทั้งหมดเช่นที่ฉันสามารถทำได้python -i foo.py
หรือghci foo.hs
ไม่
คำตอบ:
ยังไม่มีอะไรในตัวเพื่อให้มีฟังก์ชันการทำงานที่ตรงตามที่คุณอธิบาย อย่างไรก็ตามทางเลือกอื่นในการใช้require
เพื่อใช้.load
คำสั่งภายใน REPL เช่น:
.load foo.js
มันโหลดไฟล์ทีละบรรทัดเหมือนกับที่คุณพิมพ์ลงใน REPL ซึ่งแตกต่างจากrequire
นี้จะทำให้ประวัติ REPL เป็นมลพิษด้วยคำสั่งที่คุณโหลด อย่างไรก็ตามมีข้อได้เปรียบในการทำซ้ำได้เนื่องจากไม่ได้แคชเหมือนrequire
.
ซึ่งจะดีกว่าสำหรับคุณจะขึ้นอยู่กับกรณีการใช้งานของคุณ
แก้ไข:มีการใช้งานที่ จำกัด เนื่องจากไม่ทำงานในโหมดเข้มงวด แต่สามปีต่อมาฉันได้เรียนรู้ว่าหากสคริปต์ของคุณไม่มี'use strict'
คุณสามารถใช้eval
เพื่อโหลดสคริปต์ของคุณได้โดยไม่ทำให้ประวัติ REPL เสียหาย:
var fs = require('fs');
eval(fs.readFileSync('foo.js').toString())
ฉันมักจะใช้คำสั่งนี้
node -i -e "$(< yourScript.js)"
ทำงานเหมือนกับใน Python โดยไม่มีแพ็คเกจใด ๆ
ฉันสร้างVorpal.jsซึ่งจัดการปัญหานี้โดยเปลี่ยนโหนดของคุณเพิ่มเป็น CLI แบบโต้ตอบ สนับสนุนส่วนขยาย REPL ซึ่งจะนำคุณเข้าสู่ REPL ภายในบริบทของแอปที่ทำงานอยู่
var vorpal = require('vorpal')();
var repl = require('vorpal-repl');
vorpal
.delimiter('myapp>')
.use(repl)
.show()
.parse(process.argv);
จากนั้นคุณสามารถเรียกใช้แอปและจะหล่นลงใน REPL
$ node myapp.js repl
myapp> repl:
อีกวิธีหนึ่งคือการกำหนดฟังก์ชันเหล่านั้นเป็นส่วนกลาง
global.helloWorld = function() { console.log("Hello World"); }
จากนั้นโหลดไฟล์ล่วงหน้าใน REPL เป็น:
node -r ./file.js
จากนั้นhelloWorld
สามารถเข้าถึงฟังก์ชั่นได้โดยตรงใน REPL
ฉันสร้างreplpadเนื่องจากเบื่อที่จะโหลดสคริปต์ซ้ำ ๆ
เพียงติดตั้งผ่าน: npm install -g replpad
จากนั้นใช้โดยเรียกใช้: replpad
หากคุณต้องการให้มันดูไฟล์ทั้งหมดในไดเร็กทอรีปัจจุบันและไดเร็กทอรีย่อยทั้งหมดและไพพ์ไฟล์เหล่านั้นลงในเรพเมื่อเปลี่ยนให้ทำดังนี้ replpad .
ดูวิดีโอบนไซต์เพื่อรับทราบวิธีการทำงานที่ดีขึ้นและเรียนรู้เกี่ยวกับคุณสมบัติที่ดีอื่น ๆ ที่มีเช่นนี้:
dox()
ฟังก์ชันที่เพิ่มให้กับทุกฟังก์ชันหลักเช่นfs.readdir.dox()
dox()
ฟังก์ชันที่เพิ่มให้กับทุกโมดูลที่ติดตั้งผ่าน npm เช่นmarked.dox()
src
คุณสมบัติที่เพิ่มให้กับทุกฟังก์ชันเช่นexpress.logger.src
.talk
คำสั่ง).append
คำสั่งCXX=clang++ npm install replpad
แก้ไขข้อผิดพลาดg++: 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
ทำไมไม่โหลดไฟล์ลงในโหนดโต้ตอบแทน?
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
จากนั้นคุณสามารถเพิ่มลงในสคริปต์ package.json
"repl": "node -e 'var client = require(\"./build/main/index.js\"); console.log(\"Use `client` in repl\")' -i",
ทดสอบโดยใช้โหนด v8.1.2
node -i -r "./build/main/index.js"
?
ขณะนี้คุณไม่สามารถทำได้โดยตรง แต่คุณสามารถทำได้mylib = require('./foo.js')
ใน REPL วิธีการจำจะถูกส่งออกไม่ได้ประกาศเป็น globals
.load my_work.js
แม้ว่าจะต้องมีexports.working_var = ...
การประกาศเพิ่มเติมเนื่องจาก REPL barfs บนจาวาสคริปต์ที่ถูกต้องสมบูรณ์บางประเภทเช่นความคิดเห็นหลายบรรทัด (อย่างน้อยก็ด้วยreadline
การกำหนดค่าของฉัน)
replpad
เป็นวิธีที่ยอดเยี่ยม แต่สำหรับวิธีที่ง่ายและรวดเร็วในการโหลดไฟล์ลงในโหนดนำเข้าตัวแปรและเริ่มการจำลองคุณสามารถเพิ่มรหัสต่อไปนี้ที่ท้ายไฟล์. js ของคุณ
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]);
})();
}
ตอนนี้ถ้าไฟล์ของคุณsrc.js
กำลังทำงานอยู่node src.js
จะเริ่มโหนดโหลดไฟล์เริ่ม REPL และคัดลอกออบเจ็กต์ทั้งหมดที่ประกาศว่าvar
อยู่ในระดับบนสุดตลอดจนโลกที่ส่งออก if (require.main === module)
เพื่อให้แน่ใจว่ารหัสนี้จะไม่ได้รับการดำเนินการถ้าsrc.js
จะรวมผ่านrequire
คำสั่ง ฉันเป็นจริงคุณสามารถเพิ่มรหัสใด ๆ ที่คุณต้องการแยกออกเมื่อคุณใช้งานsrc.js
แบบสแตนด์อโลนเพื่อวัตถุประสงค์ในการดีบักภายในif
คำสั่ง
นี่คือฟังก์ชัน bash ของ คำตอบของ George :
noderepl() {
FILE_CONTENTS="$(< $1 )"
node -i -e "$FILE_CONTENTS"
}
หากคุณใส่สิ่งนี้ไว้~/.bash_profile
คุณสามารถใช้เป็นนามแฝงได้เช่น:
noderepl foo.js
ข้อเสนอแนะอื่นที่ฉันไม่เห็นที่นี่: ลองใช้รหัสนี้เล็กน้อย
#!/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
จากนั้นคุณสามารถเรียกใช้สคริปต์นี้และจะรวมfoo
เป็นตัวแปร
คำตอบเก่า
type test.js|node -i
จะเปิดโหนด REPL และพิมพ์ทุกบรรทัดจาก test.js เป็น REPL แต่ด้วยเหตุผลบางประการโหนดจะออกหลังจากจบไฟล์
ปัญหาอีกประการหนึ่งคือฟังก์ชันจะไม่ถูกยกขึ้น
node -e require('repl').start({useGlobal:true}); -r ./test2.js
จากนั้น globals ทั้งหมดที่ประกาศโดยไม่มี var ภายใน test2.js จะพร้อมใช้งานใน REPL
ไม่แน่ใจว่าเหตุใด var a ในขอบเขตส่วนกลางจึงไม่พร้อมใช้งาน
type
bash
เพื่อให้ได้คำตอบที่ดีขึ้นดูเหมือนว่าคุณสามารถทำได้node -r noderc.js
โดยไม่ต้องเริ่มการจำลองด้วยตนเอง แต่คุณต้องกำหนดให้global
โดยตรงในสคริปต์สำหรับฟังก์ชัน / var ควรมีวิธีการ "vm.runInContext" ที่เหมาะสมเพื่อที่จะรับค่าเพิ่มเติมจากสคริปต์