जवाबों:
आपके द्वारा वर्णित सटीक कार्यक्षमता प्रदान करने के लिए अभी भी कुछ भी अंतर्निहित नहीं है। हालाँकि, REPL के भीतर कमांडrequire
का उपयोग करने के लिए इसका उपयोग करने का एक विकल्प , जैसे:.load
.load foo.js
यह फ़ाइल को लाइन में उसी तरह लोड करता है जैसे कि आपने इसे REPL में टाइप किया था। इसके विपरीत require
आपके द्वारा लोड किए गए आदेशों के साथ REPL इतिहास को प्रदूषित करता है। हालांकि, इसे दोहराने योग्य होने का लाभ है क्योंकि यह कैश्ड की तरह नहीं है require
।
जो आपके लिए बेहतर है वह आपके उपयोग के मामले पर निर्भर करेगा।
संपादित करें: इसकी सीमित प्रयोज्यता है क्योंकि यह सख्त मोड में काम नहीं करता है, लेकिन तीन साल बाद मुझे पता चला है कि अगर आपकी स्क्रिप्ट नहीं है 'use strict'
, तो आप REPL इतिहास को प्रदूषित किए बिना अपनी स्क्रिप्ट को लोड करने के eval
लिए उपयोग कर सकते हैं :
var fs = require('fs');
eval(fs.readFileSync('foo.js').toString())
मैं हमेशा इस कमांड का उपयोग करता हूं
node -i -e "$(< yourScript.js)"
बिना किसी पैकेज के पाइथन की तरह ही काम करता है।
मैंने 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 में एक्सेस किया जा सकता है।
मैंने जब से स्क्रिप्ट को बार-बार लोड करने के लिए थक गया तब से मैंने रिप्पड बनाया ।
बस इसे माध्यम से स्थापित करें: npm install -g replpad
फिर इसे चलाकर उपयोग करें: replpad
यदि आप चाहते हैं कि यह वर्तमान और सभी उपनिर्देशिकाओं में सभी फ़ाइलों को देखें और जब वे परिवर्तन करते हैं, तो उन्हें उत्तर में पाइप करें: replpad .
साइट पर वीडियो देखें कि यह कैसे काम करता है और कुछ अन्य अच्छी विशेषताओं के बारे में जानने के लिए एक बेहतर विचार प्राप्त करें:
dox()
हर कोर फ़ंक्शन में जोड़े जाने वाले फ़ंक्शन के माध्यम से उत्तर में कोर मॉड्यूल डॉक्स का उपयोग करेंfs.readdir.dox()
dox()
इंस्टॉल किए गए प्रत्येक मॉड्यूल में जोड़े जाने वाले फ़ंक्शन के माध्यम से उत्तर में एक्सेस उपयोगकर्ता मॉड्यूल रीडम्स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 में कर सकते हैं । याद रखें तरीकों का निर्यात किया जाता है, ग्लोबल्स के रूप में घोषित नहीं किया जाता है।
.load my_work.js
कुछ अतिरिक्त exports.working_var = ...
घोषणाओं की आवश्यकता के बावजूद यह बेहतर लगता है , क्योंकि आरईपीएल पूरी तरह से वैध जावास्क्रिप्ट के कुछ प्रकारों पर बारफिल्ट करता है, जैसे बहुस्तरीय टिप्पणियां (कम से कम मेरे 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
।
यहां जॉर्ज के उत्तर का एक बश फ़ंक्शन संस्करण है :
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
तब test2.js के बिना var के घोषित सभी ग्लोबल्स REPL में उपलब्ध होंगे
निश्चित नहीं है कि वैश्विक दायरे में var क्यों उपलब्ध नहीं होगा