আমি কীভাবে আমার স্ক্রিপ্টটি নোড.জেএসআরপিএল-এ লোড করব?


137

আমার কাছে একটি স্ক্রিপ্ট foo.jsরয়েছে যাতে আমি আরপিএলে খেলতে চাই এমন কিছু ফাংশন রয়েছে।

নোডটি কীভাবে আমার স্ক্রিপ্টটি কার্যকর করতে পারে এবং তারপরে সমস্ত ঘোষিত গ্লোবালগুলির সাথে একটি রিপলটিতে ঝাঁপিয়ে পড়ার মতো কোনও উপায় আছে, যেমন আমি করতে পারি python -i foo.pyবা করতে পারি ghci foo.hs?

উত্তর:


179

আপনার বর্ণনার সঠিক কার্যকারিতা সরবরাহ করতে এখনও অন্তর্নির্মিত কিছু নেই। তবে, আরপিএল-এর মধ্যে কমান্ডটিrequire ব্যবহার করার জন্য এটির বিকল্পের মতো:.load

.load foo.js

এটি আরএপি-লাইন ফাইলটি এমনভাবে লোড করে যেমন আপনি এটি আরপিএলে টাইপ করেছেন। requireএটির বিপরীতে REPL ইতিহাসকে দূষিত করে আপনি যে কমান্ডগুলি লোড করেছেন তা দিয়ে। তবে এটির পুনরাবৃত্তিযোগ্য হওয়ার সুবিধা রয়েছে কারণ এটি ক্যাশেড নয় require

আপনার জন্য ভাল যা আপনার ব্যবহারের ক্ষেত্রে নির্ভর করবে।


সম্পাদনা: এটি প্রয়োগযোগ্যতা সীমিত কারণ এটি কঠোর মোডে কাজ করে না, তবে তিন বছর পরে আমি শিখেছি যে যদি আপনার স্ক্রিপ্টটি না থাকে তবে 'use strict'আপনি REPL ইতিহাসকে দূষিত না করে আপনার স্ক্রিপ্টটি লোড করতে ব্যবহারeval করতে পারেন :

var fs = require('fs');
eval(fs.readFileSync('foo.js').toString())

আমি যদি কোনও অ্যাসিঙ্ক কলব্যাকের ভিতরে থাকা Repl এ যেতে চাই তবে কী হবে?
চেত

2
@ চেট আপনার প্রশ্নটি যদি বিদ্যমান প্রশ্নের সাথে মেলে না তবে আপনি একটি নতুন স্ট্যাকওভারফ্লো প্রশ্নটি লিখে রাখবেন :-)
ভোসাদড 01 ই

@ চ্যাট করুন আপনি (async () => code আরও কোড}) () দিয়ে অন্য ফাইলটি ডাউনলোড করতে পারেন; এবং এটি একই গ্লোবালগুলি ভাগ করে নেবে।
নুরেটিন

আপনি ম্যাকোজে থাকলে টিপ (সম্ভবত অন্যরাও)। আপনি ".লোড" টাইপ করতে পারেন (স্পেস নোট করুন) আরইপিএলে এবং টান টার্মিনালে ফাইন্ডার থেকে আপনার কমান্ডের সঠিক পাথ যোগ করতে ফাইলটি টেনে / ড্রপ করতে পারেন। আপনি যে ফাইলগুলির সাথে কাজ করছেন সেগুলি কয়েকটি স্তরের নিচে থাকলে এটি কার্যকর।
jamesnotjim

35

আমি সর্বদা এই আদেশ ব্যবহার করি

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

পাইথনে যেমন কোনও প্যাকেজ ছাড়াই কাজ করে।


1
উইন্ডোস সিএমডি এ এই কাজটি কীভাবে পেতে হয় তা কি কেউ জানেন? আমি এটি কাজ করেছিলাম, তবে উইন্ডোতে নয়।
শার্পিরো

@ শার্পিরো: আপনি যদি গিট ইনস্টল করেন তবে আপনার উইন্ডোজ পিসিতে একটি মিনি-ইউনিক্স ইনস্টল করার বিকল্প রয়েছে। উইন্ডোজের জন্য গিটের স্বাভাবিক বিতরণ।
জুয়ান ল্যানাস

এটির জন্য বিরক্তিকর একটি জিনিস হ'ল নোড.জেএস পুনরায় প্রম্পট প্রিন্ট করবে এবং তারপরে আপনার স্ক্রিপ্টটি চালাবে, সুতরাং প্রম্পটের পরে কোনও আউটপুট আটকে যায়। stackoverflow.com/a/45893494/3538165 এই সমস্যাটি নেই তবে সমাধানের জন্য repl নেমস্পেসে শেষ করতে অবশ্যই ভেরিয়েবলগুলিকে স্পষ্টভাবে নির্ধারিত করতে হবে, তাই খুব ভালও নয়।
রেডন রোসবারো

10

আমি ভোরপাল.জেস তৈরি করেছি , যা আপনার নোডকে একটি ইন্টারেক্টিভ সিএলআইতে যুক্ত করে এই সমস্যাটি পরিচালনা করে। এটি একটি আরএপিএল এক্সটেনশান সমর্থন করে, যা আপনাকে আপনার চলমান অ্যাপ্লিকেশনের প্রেক্ষাপটে একটি আরপিএল এ ফেলে দেয়।

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: 

8

আর একটি উপায় হ'ল এই ফাংশনগুলি গ্লোবাল হিসাবে সংজ্ঞায়িত করা।

global.helloWorld = function() { console.log("Hello World"); }

তারপরে ফাইলটিকে আরপিএলে প্রিললোড করুন:

node -r ./file.js

তারপরে ফাংশনটি helloWorldসরাসরি আরপিএলে প্রবেশ করা যায়।


8

বারবার স্ক্রিপ্টটি পুনরায় লোড করতে করতে ক্লান্ত হয়ে পড়েছি বলে আমি রিলপ্যাড তৈরি করেছি

কেবল এটির মাধ্যমে ইনস্টল করুন: npm install -g replpad

তারপরে এটি চালিয়ে ব্যবহার করুন: replpad

আপনি যদি বর্তমান এবং সমস্ত উপ-ডিরেক্টরিতে সমস্ত ফাইল দেখতে চান এবং যখন তারা পরিবর্তন করেন তখন এগুলি repl এ পাইপ করুন: replpad .

এটি কীভাবে কাজ করে সে সম্পর্কে আরও ভাল ধারণা পেতে সাইটে ভিডিওগুলি দেখুন এবং এর মতো আরও কয়েকটি সুন্দর বৈশিষ্ট্য সম্পর্কে শিখুন:

  • dox()প্রতিটি মূল ফাংশনে যুক্ত হওয়া ক্রিয়াকলাপের মাধ্যমে প্রতিবেদনে মূল মডিউল ডক্স অ্যাক্সেস করুনfs.readdir.dox()
  • dox()এনপিএম এর মাধ্যমে ইনস্টল হওয়া প্রতিটি মডিউলে যুক্ত হওয়া ফাংশনটির মাধ্যমে রেপুলেটে ব্যবহারকারী মডিউল রিডমেস অ্যাক্সেস করুনmarked.dox()
  • ফাংশনটির হাইলাইটেড সোর্স কোড অ্যাক্সেস করুন, ফাংশনটি কোথায় সংজ্ঞায়িত করা হয়েছে সে সম্পর্কিত তথ্য (ফাইল, লিনেনবার্ট) এবং ফাংশন মন্তব্য এবং / অথবা jsdocs যেখানে সম্ভাব্য srcপ্রতিটি ফাংশনে যুক্ত হওয়া সংস্থার মাধ্যমে সম্ভব ieexpress.logger.src
  • স্ক্রিপ্টি-টকি সমর্থন (.talkকমান্ড দেখুন)
  • কমান্ড এবং কীবোর্ড শর্টকাট যুক্ত করে
  • ভিম কী বাইন্ডিংস
  • কী মানচিত্র সমর্থন
  • ম্যাচ টোকেন প্লাগইনের মাধ্যমে প্যারেন্স মিলছে
  • কোডটি কিবোর্ড শর্টকাট বা .appendকমান্ডের মাধ্যমে পুনরায় ফাইলটিতে প্রবেশ করা হয়েছে end

দেখুন: https://github.com/thlorenz/replpad


আমাকে 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
শ্যাড স্টার্লিং

5

ইন্টারেক্টিভ নোড রেপলিতে ফাইলটি লোড করবেন না কেন?

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

তারপরে আপনি প্যাকেজ.জসন স্ক্রিপ্টগুলিতে যুক্ত করতে পারেন

"repl": "node -e 'var client = require(\"./build/main/index.js\"); console.log(\"Use `client` in repl\")' -i",

নোড v8.1.2 ব্যবহার করে পরীক্ষা করা হয়েছে


2
শুধু না কেন node -i -r "./build/main/index.js"?
জেড খোলা 2'18

4

বর্তমানে আপনি সরাসরি এটি করতে পারবেন না তবে আপনি mylib = require('./foo.js')REPL তে পারেন। মনে রাখবেন পদ্ধতিগুলি রফতানি করা হয়, গ্লোবাল হিসাবে ঘোষিত হয়নি।


.load my_work.jsকিছু অতিরিক্ত exports.working_var = ...ঘোষণাপত্রের প্রয়োজন থাকা সত্ত্বেও আমি এটিকে পছন্দনীয় বলে মনে করি , কারণ একাধিক ধরণের বৈধ জাভাস্ক্রিপ্টের জন্য REPL বার্ফগুলি যেমন মাল্টলাইন মন্তব্য (কমপক্ষে আমার readlineকনফিগারেশন সহ) like
chbrown

4

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নোড শুরু হবে, ফাইলটি লোড করবে, একটি আরএপিএল শুরু করবে varএবং শীর্ষ স্তরের হিসাবে ঘোষিত সমস্ত অবজেক্টের পাশাপাশি কোনও রফতানি গ্লোবালগুলি অনুলিপি করবে। if (require.main === module)নিশ্চিত করে যে এই কোড যদি নির্বাহ করা হবে না src.jsএকটি মাধ্যমে অন্তর্ভুক্ত করা হয় requireবিবৃতি। আমি সত্য, আপনি বিবৃতিতে src.jsডিবাগিংয়ের উদ্দেশ্যে স্বতন্ত্র অবস্থায় চলাকালীন আপনি যে কোনও কোডটি উত্তেজিত করতে চান তা যুক্ত করতে পারেন if


4

জর্জের উত্তরের একটি বাশ ফাংশন সংস্করণ এখানে :

noderepl() {
    FILE_CONTENTS="$(< $1 )"
    node -i -e "$FILE_CONTENTS"
}

আপনি যদি এটি নিজের মধ্যে রাখেন তবে আপনি ~/.bash_profileএটি একটি উপনামের মতো ব্যবহার করতে পারেন, যেমন:

noderepl foo.js

2
আমি এখন কয়েক মাস ধরে এটি ব্যবহার করে আসছি এবং নতুন শেল পরিবেশে পরিবর্তনের জন্য আমি আমার কিছু সেটিংস হারিয়েছি এবং এটিকে আবার পিছনে ট্র্যাক করতে হয়েছিল। আমি যেহেতু এখানে আছি, আমি ভেবেছিলাম এই সত্যিকারের দরকারী কার্যটির জন্য আপনাকে ধন্যবাদ জানাব।
জায়েকাই

3

আরেকটি পরামর্শ যা আমি এখানে দেখছি না: কোডটি এই সামান্য বিট চেষ্টা করুন

#!/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একটি ভেরিয়েবল হিসাবে অন্তর্ভুক্ত হবে


1

পুরানো উত্তর

type test.js|node -i

নোড REPL খুলবে এবং টেস্ট.জেস থেকে আরপিএল-এ সমস্ত লাইনে টাইপ করবে, তবে কোনও কারণে ফাইল শেষ হওয়ার পরে নোড প্রস্থান করবে

আরেকটি সমস্যা হ'ল, সেই ফাংশনগুলি উত্তোলন করা হবে না।

ভাল উত্তর

node -e require('repl').start({useGlobal:true}); -r ./test2.js

তারপরে টেস্ট 2.জেএস-এর মধ্যে বৈচিত্র্যহীনভাবে ঘোষণা করা সমস্ত গ্লোবালগুলি আরপিএলে উপলব্ধ হবে

বিশ্বব্যাপী সুযোগগুলিতে কেন var এ উপলব্ধ হবে না তা নিশ্চিত


8
আপনার উত্তরের জন্য দয়া করে কিছু ব্যাখ্যা যোগ করুন
মেকনিকভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.