রিডলাইন মডিউলের ভূমিকা
রিডলাইন মডিউল হল একটি মূল Node.js মডিউল যা একটি পঠনযোগ্য স্ট্রীম (যেমন process.stdin) থেকে একবারে একটি লাইন থেকে ডেটা পড়ার জন্য একটি ইন্টারফেস প্রদান করে।
এটি বিশেষভাবে দরকারী:
ইন্টারেক্টিভ কমান্ড লাইন অ্যাপ্লিকেশন
ব্যবহারকারীদের সাথে ইন্টারঅ্যাক্ট করে এমন CLI অ্যাপ্লিকেশন তৈরি করা
স্ট্রাকচার গাইড
সেটআপ গাইড এবং সেটআপ টুল
কমান্ড লাইন গেম
টেক্সট-ভিত্তিক গেম এবং অ্যাপ
সাধারণ ব্যবহারের ক্ষেত্রে
- ইন্টারেক্টিভ কমান্ড লাইন অ্যাপ্লিকেশন
- কনফিগারেশন গাইড এবং সেটআপ টুল
- কমান্ড লাইন গেম
- REPL (রিড-ইভাল-প্রিন্ট লুপ) পরিবেশ
- লাইন দ্বারা লাইন বড় টেক্সট ফাইল প্রক্রিয়াকরণ
- কাস্টম শেল এবং CLI তৈরি করা হচ্ছে
মূল বৈশিষ্ট্য
- লাইন-বাই-লাইন ইনপুট প্রক্রিয়াকরণ
- কাস্টম প্রম্পট এবং বিন্যাস
- ট্যাব সমাপ্তি সমর্থন
- ইতিহাস ব্যবস্থাপনা
- একটি ইভেন্ট-চালিত ইন্টারফেস
- প্রতিশ্রুতি-ভিত্তিক API সমর্থন
দ্রষ্টব্য:
রিডলাইন মডিউলটি Node.js-এ অন্তর্নির্মিত, তাই কোনও অতিরিক্ত ইনস্টলেশনের প্রয়োজন নেই।
কমান্ড লাইনের মাধ্যমে ব্যবহারকারীদের সাথে যোগাযোগ করতে বা লাইন-ভিত্তিক উপায়ে পাঠ্য ইনপুট প্রক্রিয়া করার প্রয়োজন এমন যেকোনো অ্যাপ্লিকেশনের জন্য এটি আদর্শ।
রিডলাইন দিয়ে শুরু করা
রিডলাইন মডিউল ব্যবহার করে একটি সাধারণ ইন্টারেক্টিভ কমান্ড-লাইন অ্যাপ্লিকেশন তৈরি করার একটি দ্রুত উদাহরণ এখানে:
মৌলিক ইন্টারেক্টিভ প্রম্পট
const readline = require('readline'); // ইনপুট/আউটপুটের জন্য একটি ইন্টারফেস তৈরি করুন const rl = readline.createInterface({ ইনপুট: process.stdin, আউটপুট: process.stdout }); // একটি প্রশ্ন জিজ্ঞাসা করুন এবং প্রতিক্রিয়া পরিচালনা করুন rl.question('আপনার নাম কি?', (নাম) => { console.log(`হ্যালো, ${name}!`); // প্রশ্ন জিজ্ঞাসা করা চালিয়ে যান rl.question('আপনার বয়স কত?', (বয়স) => { console.log(`5 বছরের মধ্যে, আপনি ${parseInt(বয়স) + 5} বছর বয়সী হবেন।`); // হয়ে গেলে ইন্টারফেস বন্ধ করুন rl.close(); }); }); // অ্যাপ্লিকেশন প্রস্থান হ্যান্ডেল rl.on('close', () => { console.log('বিদায়!'); process.exit(0); });
আমদানি এবং সেটআপ
আপনার মডিউল সেটআপ এবং প্রয়োজনীয়তার উপর নির্ভর করে রিডলাইন মডিউলটি বিভিন্ন উপায়ে আমদানি করা যেতে পারে:
CommonJS (Node.js ডিফল্ট)
// মৌলিক প্রয়োজন const readline = require('readline'); // destructuring ব্যবহার করে নির্দিষ্ট পদ্ধতি আমদানি করুন const { createInterface } = require('readline'); // ডিফল্ট সেটিংস সহ ইন্টারফেস তৈরি করুন const rl = createInterface({ ইনপুট: process.stdin, আউটপুট: process.stdout });
ES মডিউল (Node.js 12+)
// ডিফল্ট আমদানি ব্যবহার করে 'রিডলাইন' থেকে রিডলাইন আমদানি করুন; // নামযুক্ত আমদানি ব্যবহার করে 'রিডলাইন' থেকে { createInterface } আমদানি করুন; // গতিশীল আমদানি (Node.js 14+) const { createInterface } = await import('readline'); // ইন্টারফেস তৈরি করুন const rl = createInterface({ ইনপুট: process.stdin, আউটপুট: process.stdout });
সর্বোত্তম অনুশীলন:
rl.close() ব্যবহার করে সর্বদা রিডলাইন ইন্টারফেসটি বন্ধ করুন, যখন আপনি এটি সম্পন্ন করেন, যা সিস্টেম সংস্থানগুলিকে খালি করতে সহায়তা করে এবং আপনার প্রোগ্রামটিকে পরিষ্কারভাবে প্রস্থান করার অনুমতি দেয়।
একটি রিডলাইন ইন্টারফেস তৈরি করা হচ্ছে
CreateInterface পদ্ধতিটি একটি রিডলাইন ইন্টারফেস তৈরি করার প্রধান উপায়। এটি বেশ কয়েকটি কনফিগারেশন বৈশিষ্ট্য সহ একটি বিকল্প অবজেক্ট নেয়:
মৌলিক ইন্টারফেস তৈরি
const readline = require('readline'); // একটি বেস ইন্টারফেস তৈরি করুন const rl = readline.createInterface({ ইনপুট: process.stdin, // শোনার জন্য পঠনযোগ্য স্ট্রিম আউটপুট: process.stdout, // লিখতে যোগ্য স্ট্রীম প্রম্পট: '>', // ব্যবহার করার জন্য প্রম্পট স্ট্রিং (ডিফল্ট: '>') });
সাধারণ বিকল্প:
- input:শোনার জন্য পঠনযোগ্য স্ট্রিম (ডিফল্ট: process.stdin)
- output:লেখার জন্য লিখিত স্ট্রীম (ডিফল্ট: process.stdout)
- prompt:ব্যবহার করার জন্য প্রম্পট স্ট্রিং (ডিফল্ট: '>')
- terminal:সত্য হলে, আউটপুটটিকে TTY হিসাবে বিবেচনা করে (ডিফল্ট: output.isTTY)
- historySize:ইতিহাস এন্ট্রির সর্বাধিক সংখ্যা (ডিফল্ট: 30)
- removeHistoryDuplicates:সত্য হলে, ডুপ্লিকেট ইতিহাস এন্ট্রি মুছে দেয় (ডিফল্ট: মিথ্যা )
- completer:স্বয়ংক্রিয় টেপ-শেষ জন্য ঐচ্ছিক ফাংশন
- crlfDelay:CR এবং LF-এর মধ্যে বিলম্ব (ডিফল্ট: 100ms)
- escapeCodeTimeout:ক্যারেক্টার এস্কেপ সিকোয়েন্সের জন্য অপেক্ষা করার সময় (ডিফল্ট: 500ms)
উন্নত ইন্টারফেসের উদাহরণ
const readline = require('readline'); const fs = প্রয়োজন('fs'); // উন্নত বিকল্পগুলির সাথে একটি ইন্টারফেস তৈরি করুন const rl = readline.createInterface({ ইনপুট: fs.createReadStream('input.txt'), // ফাইল থেকে পড়ুন আউটপুট: process.stdout, // কনসোলে লিখুন টার্মিনাল: মিথ্যা, // ইনপুট একটি টার্মিনাল নয় ইতিহাসের আকার: 100, // বড় ইতিহাস removeHistoryDuplicates: true, // ডুপ্লিকেট কমান্ড সঞ্চয় করবেন না প্রম্পট: 'CLI>', // কাস্টম প্রম্পট crlfDelay: Infinity, // সমস্ত CR/LF-কে একক লাইন বিরতি হিসাবে বিবেচনা করুন escapeCodeTimeout: 200 // দ্রুত এস্কেপ কোড সনাক্তকরণ }); // ফাইল থেকে প্রতিটি লাইন পরিচালনা করুন rl.on('লাইন', (লাইন) => { console.log(`প্রসেসিং: ${line}`); }); // ফাইলের শেষ হ্যান্ডেল করুন rl.on('close', () => { console.log('সমাপ্ত প্রক্রিয়াকরণ ফাইল'); });
দ্রষ্টব্য:
ফাইল প্রক্রিয়াকরণের জন্য ইন্টারফেস তৈরি করার সময়, TTY-নির্দিষ্ট বৈশিষ্ট্যগুলি নিষ্ক্রিয় করতে এবং কর্মক্ষমতা উন্নত করতে টার্মিনাল: মিথ্যা সেট করুন।
বেসিক রিডলাইন পদ্ধতি
রিডলাইন মডিউল ব্যবহারকারীর সাথে যোগাযোগ করার জন্য বিভিন্ন পদ্ধতি প্রদান করে। এখানে কিছু প্রায়শই ব্যবহৃত পদ্ধতি রয়েছে:
1. rl.question(query, callback)
ব্যবহারকারীর কাছে একটি প্রশ্ন প্রদর্শন করে এবং ব্যবহারকারীর প্রতিক্রিয়া সহ একটি কলব্যাক কল করে। এটি সাধারণ ব্যবহারকারীর মিথস্ক্রিয়াগুলির জন্য সর্বাধিক ব্যবহৃত পদ্ধতিগুলির মধ্যে একটি।
একটি মৌলিক উদাহরণ
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question('What is your name? ', (name) => {
console.log(`Hello, ${name}!`);
rl.close();
});
নেস্টেড প্রশ্নের উদাহরণ
function askQuestion(query) {
return new Promise(resolve => {
rl.question(query, resolve);
});
}
async function userSurvey() {
try {
const name = await askQuestion('What is your name? ');
const age = await askQuestion('How old are you? ');
const email = await askQuestion('What is your email? ');
console.log('\n=== User Information ===');
console.log(`Name: ${name}`);
console.log(`Age: ${age}`);
console.log(`Email: ${email}`);
} catch (error) {
console.error('An error occurred:', error);
} finally {
rl.close();
}
}
userSurvey();
rl.question() :
- কলব্যাক ফাংশনে সর্বদা ত্রুটিগুলি পরিচালনা করুন
- একাধিক প্রশ্নের জন্য আরও ভাল প্রবাহ নিয়ন্ত্রণের জন্য প্রতিশ্রুতি ব্যবহার করুন বা অ্যাসিঙ্ক/অপেক্ষা করুন
- প্রক্রিয়াকরণের আগে ব্যবহারকারীর ইনপুট যাচাই করুন
- সম্পদ মুক্ত করা শেষ হলে সর্বদা ইন্টারফেস বন্ধ করুন
2. rl.prompt([preserveCursor])
আউটপুটে বর্তমান প্রম্পট লেখে এবং ব্যবহারকারীর ইনপুটের জন্য অপেক্ষা করে। ঐচ্ছিক preserveCursor প্যারামিটার (বুলিয়ান) নির্ধারণ করে যে কার্সারের অবস্থান সংরক্ষণ করা উচিত কিনা।
একটি মৌলিক প্রম্পটের উদাহরণ
const readline = require('readline'); const rl = readline.createInterface({ ইনপুট: process.stdin, আউটপুট: process.stdout, প্রম্পট: 'CLI>' }); // প্রাথমিক প্রম্পট প্রদর্শন করুন rl.prompt(); // ইনপুট প্রতিটি লাইন হ্যান্ডেল rl.on('লাইন', (লাইন) => { const ইনপুট = line.trim(); সুইচ (ইনপুট) { কেস 'হ্যালো': console.log('হ্যালো সেখানে!'); বিরতি কেস 'সময়': console.log(`বর্তমান সময়: ${new Date().toLocaleTimeString()}`); বিরতি কেস 'প্রস্থান': rl.close(); প্রত্যাবর্তন ডিফল্ট: console.log(`আপনি প্রবেশ করেছেন: ${input}`); } // আবার প্রম্পট প্রদর্শন করুন rl.prompt(); }); // অ্যাপ্লিকেশন প্রস্থান হ্যান্ডেল rl.on('close', () => { console.log('বিদায়!'); process.exit(0); });
প্রম্পট ব্যবহার করার জন্য টিপস:
- প্রম্পট স্ট্রিং পরিবর্তন করতে rl.setPrompt() ব্যবহার করুন
- মাল্টি-লাইন প্রম্পটের জন্য, প্রম্পট স্ট্রিংয়ে লাইন ব্রেক যোগ করুন
- আপনার প্রম্পটে রং যোগ করতে চক মত একটি লাইব্রেরি ব্যবহার করুন
- প্রতিটি ইনপুট পরিচালনা করার পরে প্রম্পট পুনরায় প্রদর্শন করতে rl.prompt() কল করতে ভুলবেন না
3. rl.write(data[, key])
আউটপুট স্ট্রীমে ডেটা লেখে। ঐচ্ছিক কী প্যারামিটারটি কীস্ট্রোক অনুকরণ করতে ব্যবহার করা যেতে পারে।
উদাহরণ লেখ
const readline = require('readline'); const rl = readline.createInterface({ ইনপুট: process.stdin, আউটপুট: process.stdout }); // একটি স্বাগত বার্তা প্রদর্শন করুন rl.write('CLI অ্যাপ্লিকেশনে স্বাগতম!\n'); rl.write('='.repeat(30) + '\n\n'); // একটি ডিফল্ট মান প্রিলোড করুন rl.question('আপনার ব্যবহারকারীর নাম লিখুন:', (ব্যবহারকারীর নাম) => { console.log(`হ্যালো, ${username}!`); // একটি ডিফল্ট মান টাইপ করা অনুকরণ করুন rl.write('default@example.com'); // লাইনের শুরুতে কার্সার সরান rl.write(null, { ctrl: true, name: 'a' }); rl.question('আপনার ইমেল লিখুন:', (ইমেল) => { console.log(`আপনার ইমেল হল: ${email}`); rl.close(); }); });
rl.write() :
- শিরোনাম বা বিভাগের শিরোনাম দেখানো হচ্ছে
- প্রম্পটে ডিফল্ট মান প্রদান করা
- পরীক্ষার জন্য ব্যবহারকারীর ইনপুট অনুকরণ করা
- একটি কাস্টম ইনপুট বিন্যাস তৈরি করা হচ্ছে
4. rl.close()
রিডলাইন ইন্টারফেস বন্ধ করে এবং ইনপুট এবং আউটপুট স্ট্রীমের নিয়ন্ত্রণ প্রকাশ করে। সিস্টেম রিসোর্স মুক্ত করা এবং আপনার প্রোগ্রামকে পরিষ্কারভাবে প্রস্থান করার অনুমতি দেওয়ার জন্য এটি গুরুত্বপূর্ণ।
একটি নিখুঁত পরিষ্কার আপ উদাহরণ
const readline = require('readline'); const rl = readline.createInterface({ ইনপুট: process.stdin, আউটপুট: process.stdout }); // অ্যাপ্লিকেশন প্রস্থান হ্যান্ডেল ফাংশন exitApp() { console.log('\nসম্পদ পরিষ্কার করা...'); // যেকোন প্রয়োজনীয় পরিষ্কার-পরিচ্ছন্নতা সম্পাদন করুন // (যেমন, ডাটাবেস সংযোগ বন্ধ করা, রেকর্ড লেখা ইত্যাদি) // রিডলাইন ইন্টারফেস বন্ধ করুন rl.close(); } // Ctrl+C হ্যান্ডেল করুন rl.on('SIGINT', () => { console.log('\nSIGINT প্রাপ্ত হয়েছে। প্রস্থান হচ্ছে...'); exitApp(); }); // স্বাভাবিক আউটপুট পরিচালনা করুন rl.on('close', () => { console.log('বিদায়!'); process.exit(0); }); // অ্যাপ্লিকেশন শুরু করুন console.log('অ্যাপ্লিকেশন শুরু হয়েছে। প্রস্থান করতে Ctrl+C টিপুন।'); rl.prompt();
5. rl.pause() এবং rl.resume()
এই পদ্ধতিগুলি আপনাকে অস্থায়ীভাবে ইনপুট স্ট্রীমকে বিরতি এবং পুনরায় শুরু করার অনুমতি দেয়, যা ব্যবহারকারীর ইনপুট প্রবাহ নিয়ন্ত্রণের জন্য দরকারী।
পজ/চালিয়ে যান উদাহরণ
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
let isPaused = false;
console.log('Type "pause" to pause input, "resume" to continue, or "exit" to quit');
rl.on('line', (input) => {
const command = input.trim().toLowerCase();
switch (command) {
case 'pause':
if (!isPaused) {
console.log('Input paused. Type "resume" to continue...');
rl.pause();
isPaused = true;
}
break;
case 'resume':
if (isPaused) {
console.log('Resuming input...');
rl.resume();
rl.prompt();
isPaused = false;
}
break;
case 'exit':
console.log('Goodbye!');
rl.close();
return;
default:
if (!isPaused) {
console.log(`You entered: ${input}`);
rl.prompt();
}
}
});
rl.prompt();
কখন পজ/রিজুমে ব্যবহার করবেন:
- দীর্ঘ-চলমান ক্রিয়াকলাপগুলি সম্পাদন করার সময় ব্যবহারকারীর ইনপুট দ্বারা বাধা দেওয়া উচিত নয়
- নির্দিষ্ট অপারেশন চলাকালীন ব্যবহারকারীর ইনপুট সাময়িকভাবে নিষ্ক্রিয় করার সময়
- দীর্ঘ আউটপুটগুলির জন্য একটি পেজিং প্রক্রিয়া প্রয়োগ করার সময়
- যখন ইনপুট প্রক্রিয়াকরণ থ্রোটল করা প্রয়োজন
পদ্ধতির সারাংশ
| পদ্ধতি | ব্যাখ্যা |
|---|---|
| rl.question(query, callback) | ক্যোয়ারী প্রদর্শন করে এবং ব্যবহারকারীর ইনপুটের জন্য অপেক্ষা করে, তারপর ব্যবহারকারীর প্রতিক্রিয়া সহ কলব্যাক কল করে |
| rl.prompt([preserveCursor]) | ব্যবহারকারীর ইনপুটের জন্য একটি কাঠামোগত প্রম্পট প্রদর্শন করে |
| rl.write(data[, key]) | আউটপুট স্ট্রীমে ডেটা লেখে, কী-প্রেস ইভেন্টগুলিও অনুকরণ করতে পারে |
| rl.close() | রিডলাইন ইন্টারফেস বন্ধ করে এবং ইনপুট এবং আউটপুট স্ট্রীমের নিয়ন্ত্রণ প্রকাশ করে |
| rl.pause() | readline ইনপুট স্ট্রীম বিরতি দেয় |
| rl.resume() | রিডলাইন ইনপুট স্ট্রীম পুনরায় শুরু করে |
রিডলাইনের সাথে প্রতিশ্রুতি ব্যবহার করা
রিডলাইন মডিউলের কলব্যাক-ভিত্তিক API আরও আধুনিক, অ্যাসিঙ্ক/ওয়েট ফ্রেন্ডলি কোডের প্রতিশ্রুতিতে কাস্ট করা যেতে পারে:
const readline = require('readline'); // ইন্টারফেস তৈরি করুন const rl = readline.createInterface({ ইনপুট: process.stdin, আউটপুট: process.stdout }); // প্রতিশ্রুতি-ভিত্তিক ক্যোয়ারী ফাংশন ফাংশন askQuestion(কোয়েরি) { নতুন প্রতিশ্রুতি ফেরত (সমাধান => { rl.question(কোয়েরি, সমাধান); }); } // রিডলাইনের সাথে async/await ব্যবহার করা অ্যাসিঙ্ক ফাংশন প্রধান() { চেষ্টা করুন { const name = await askQuestion('আপনার নাম কি?'); console.log(`হ্যালো, ${name}!`); const age = await askQuestion('আপনার বয়স কত?'); console.log(`5 বছরের মধ্যে, আপনি ${parseInt(বয়স) + 5} বছর বয়সী হবেন।`); const location = await askQuestion('আপনি কোথায় থাকেন?'); console.log(`${location} একটি দুর্দান্ত জায়গা!`); console.log('আপনার উত্তরের জন্য ধন্যবাদ!'); } ধরা (ত্রুটি) { console.error('Error:', error); } অবশেষে { rl.close(); } } // প্রধান ফাংশন চালান প্রধান();
লাইন দ্বারা একটি ফাইল লাইন পড়া
ইন্টারেক্টিভ ইনপুট ছাড়াও, রিডলাইন মডিউল লাইন দ্বারা ফাইলগুলিও পড়তে পারে, যা বড় টেক্সট ফাইলগুলির দক্ষ প্রক্রিয়াকরণের জন্য দরকারী:
const fs = প্রয়োজন('fs'); const readline = require('readline'); // ফাইলের জন্য একটি পঠনযোগ্য স্ট্রিম তৈরি করুন const fileStream = fs.createReadStream('example.txt'); // রিডলাইন ইন্টারফেস তৈরি করুন const rl = readline.createInterface({ ইনপুট: ফাইলস্ট্রিম, crlfDelay: Infinity // CR LF-এর সমস্ত ঘটনাকে একক লাইন বিরতি হিসাবে স্বীকৃতি দিন }); // লাইন নম্বরের জন্য কাউন্টার চলুন লাইন নম্বর = 0; // লাইন দ্বারা ফাইল লাইন প্রক্রিয়া rl.on('লাইন', (লাইন) => { লাইন নম্বর ++; console.log(`লাইন ${lineNumber}: ${line}`); }); // ফাইলের শেষ হ্যান্ডেল করুন rl.on('close', () => { console.log(`${lineNumber} লাইন দিয়ে ফাইল পড়া শেষ।`); });
দ্রষ্টব্য:
এই পদ্ধতিটি বড় ফাইলগুলির জন্য মেমরি-দক্ষ কারণ এটি পুরো ফাইলটিকে মেমরিতে লোড করার পরিবর্তে একবারে একটি লাইন প্রক্রিয়া করে।
টেপের শেষ
ট্যাব শেষ কমান্ড এবং ফাইল পাথ পরামর্শ প্রদান করে ব্যবহারকারীর অভিজ্ঞতা উন্নত করে। রিডলাইন মডিউল আপনাকে কাস্টম উপসংহার যুক্তি প্রয়োগ করতে দেয়:
কিভাবে ট্যাব সিদ্ধান্ত কাজ করে:
- ব্যবহারকারী ট্যাব কী টিপে
- রিডলাইন বর্তমান লাইন এবং কার্সার অবস্থানের সাথে আপনার সম্পূর্ণ ফাংশনকে কল করে
- আপনার অ্যাক্টিভিটি সুপারিশে পরিণত হয়
- রিডলাইন ফলাফল প্রদর্শন করে বা শুধুমাত্র একটি মিল থাকলে স্বয়ংক্রিয়ভাবে সম্পূর্ণ হয়
const readline = require('readline'); const fs = প্রয়োজন('fs'); const path = require('path'); // স্বয়ংক্রিয় সমাপ্তির জন্য উপলব্ধ কমান্ড const commands = ['সহায়তা', 'প্রস্থান', 'তালিকা', 'ক্লিয়ার', 'তথ্য', 'সংস্করণ', 'ইতিহাস']; // একটি সম্পূর্ণ ফাংশন সহ একটি রিডলাইন ইন্টারফেস তৈরি করুন const rl = readline.createInterface({ ইনপুট: process.stdin, আউটপুট: process.stdout, প্রম্পট: 'myapp>', সম্পূর্ণকারী: ফাংশন(লাইন) { // কমান্ডের শেষ যদি (!line.includes('')) { const hits = commands.filter(c => c.startsWith(line)); // কোনো মিল না থাকলে সব ফলাফল প্রদর্শন করুন [hits.length? হিট: কমান্ড, লাইন]; } // ফাইল পাথ ফলাফল ("তালিকা" এর মত কমান্ডের জন্য) যদি (line.startsWith('list')) { const dir = line.split('')[1] || '।'; চেষ্টা করুন { let completions = fs.readdirSync(dir); // ডিরেক্টরির পরে স্ল্যাশ যোগ করুন completions = completions.map(ফাইল => { const fullPath = path.join(dir, file); ফিরুন fs.statSync(fullPath).isDirectory()? ফাইল + '/' : ফাইল; }); const hits = completions.filter(c => c.startsWith(line.split('')[1] ||'')); [hits.length? হিট: সমাপ্তি, লাইন. স্প্লিট('')[1] || '']; } ধরা (ত্রুটি) { প্রত্যাবর্তন [[], লাইন]; } } প্রত্যাবর্তন [[], লাইন]; } }); // প্রম্পট সেট করুন rl.prompt(); // কমান্ড পরিচালনা করুন rl.on('লাইন', (লাইন) => { লাইন = লাইন.ট্রিম(); সুইচ (সত্য) { কেস লাইন === 'হেল্প': console.log('উপলভ্য কমান্ড:'); commands.forEach(cmd => console.log(` ${cmd}`)); বিরতি কেস লাইন === 'প্রস্থান': console.log('বিদায়!'); rl.close(); প্রত্যাবর্তন case line.startsWith('list'): const dir = line.split('')[1] || '।'; চেষ্টা করুন { const ফাইল = fs.readdirSync(dir); console.log(${dir} এর বিষয়বস্তু:`); files.forEach(ফাইল => { const stats = fs.statSync(path.join(dir, file)); console.log(` ${file}${stats.isDirectory() ? '/' : ''}`); }); } ধরা (ত্রুটি) { console.error(`Error listing Directory: ${err.message}`); } বিরতি কেস লাইন === 'ক্লিয়ার': console.clear(); বিরতি কেস লাইন === 'তথ্য': console.log('Node.js CLI উদাহরণ'); console.log(`সংস্করণ: 1.0.0`); বিরতি কেস লাইন === 'সংস্করণ': console.log(`Node.js সংস্করণ: ${process.version}`); বিরতি কেস লাইন === 'ইতিহাস': // দ্রষ্টব্য: এটি ম্যানুয়ালি ইতিহাস সংরক্ষণ করা উচিত console.log('ইতিহাস বৈশিষ্ট্য সম্পূর্ণরূপে বাস্তবায়িত হয়নি।'); বিরতি কেস লাইন === '': // খালি লাইনের জন্য কিছুই করবেন না বিরতি ডিফল্ট: console.log(`অজানা কমান্ড: ${line}`); console.log('উপলব্ধ কমান্ডের জন্য "সহায়তা" টাইপ করুন'); } rl.prompt(); }).on('ক্লোজ', () => { console.log('CLI সমাপ্ত।'); process.exit(0); }); // Ctrl+C হ্যান্ডেল করুন rl.on('SIGINT', () => { rl.question('আপনি কি নিশ্চিত আপনি প্রস্থান করতে চান? (y/n)', (উত্তর) => { যদি (answer.toLowerCase() === 'y') { rl.close(); } অন্য { rl.prompt(); } }); });
মাল্টি-লাইন ইনপুট
রিডলাইন মডিউলটি মাল্টি-লাইন ইনপুট পরিচালনার জন্য দুর্দান্ত, এটি পাঠ্য সম্পাদক, কোড সম্পাদক বা ব্যবহারকারীদের কাছ থেকে একাধিক লাইন সংগ্রহ করার প্রয়োজন এমন যেকোনো অ্যাপ্লিকেশনের জন্য দুর্দান্ত করে তোলে। এটি কার্যকরভাবে কীভাবে করা যায় তা এখানে:
মাল্টি-লাইন ইনপুট টেকনিক:
- শেষ চিহ্নিতকারী:ইনপুট শেষের সংকেত দিতে একটি বিশেষ ক্রম (যেমন ".end") ব্যবহার করুন।
- বন্ধনী ম্যাচিং:সব খোলা বন্ধনী/বন্ধনী বন্ধ হয়ে গেলে স্বয়ংক্রিয়ভাবে সনাক্ত করুন
- উত্সর্গীকৃত আদেশ:মাল্টি-লাইন ইনপুট জমা দিতে একটি নির্দিষ্ট কমান্ড ইস্যু করুন
- সময়সীমা-ভিত্তিক:ব্যবহারকারী কখন টাইপ করা শেষ করেছে তা সনাক্ত করতে একটি টাইমার ব্যবহার করুন
const readline = require('readline'); // ইন্টারফেস তৈরি করুন const rl = readline.createInterface({ ইনপুট: process.stdin, আউটপুট: process.stdout, প্রম্পট: '>' }); console.log('আপনার মাল্টি-লাইন ইনপুট লিখুন। শেষ করতে একটি নতুন লাইনে ".end" টাইপ করুন:'); rl.prompt(); // লাইনগুলি সংরক্ষণ করুন const লাইন = []; // ইনপুট পরিচালনা করুন rl.on('লাইন', (লাইন) => { // শেষ কমান্ড চেক করুন যদি (line.trim() === '.end') { console.log('\nআপনার সম্পূর্ণ ইনপুট:'); console.log('-'.রিপিট(30)); console.log(lines.join('\n')); console.log('-'.রিপিট(30)); // ইনপুট প্রক্রিয়া করুন (উদাহরণ: শব্দ গণনা) const text = lines.join(''); const wordCount = text.split(/\s+/).ফিল্টার(বুলিয়ান).দৈর্ঘ্য; const charCount = text.length; console.log(`\nপরিসংখ্যান:`); console.log(`লাইনস: ${lines.length}`); console.log(`শব্দ: ${wordCount}`); console.log(`অক্ষর: ${charCount}`); rl.close(); প্রত্যাবর্তন } // সংগ্রহে লাইন যোগ করুন lines.push(লাইন); rl.prompt(); });
একটি সাধারণ REPL তৈরি করা
একটি রিড-ইভাল-প্রিন্ট লুপ (REPL) হল একটি ইন্টারেক্টিভ প্রোগ্রামিং পরিবেশ যা ব্যবহারকারীর ইনপুট পড়ে, এটিকে মূল্যায়ন করে এবং ফলাফল প্রিন্ট করে।
কাস্টম REPL তৈরি করার জন্য Readline মডিউলটি দুর্দান্ত। আপনার নিজের REPL তৈরি করার জন্য এখানে একটি বিশদ নির্দেশিকা রয়েছে:
একটি REPL এর প্রধান উপাদানগুলি হল:
- পড়ুন:লাইন দ্বারা ব্যবহারকারী ইনপুট লাইন গ্রহণ করুন
- মূল্যায়ন:ইনপুট বিশ্লেষণ এবং মূল্যায়ন
- প্রিন্ট:ফলাফল বা কোনো আউটপুট দেখান
- লুপ:পরবর্তী কমান্ডের জন্য ইনপুট প্রম্পটে ফিরে যান
- বিশেষ আদেশ:.help, .exit এর মতো কমান্ডগুলি পরিচালনা করুন
- ত্রুটি হ্যান্ডলিং:সিনট্যাক্স ত্রুটি এবং ব্যতিক্রমগুলি সুন্দরভাবে পরিচালনা করুন
const readline = require('readline'); const vm = প্রয়োজন('vm'); // ইন্টারফেস তৈরি করুন const rl = readline.createInterface({ ইনপুট: process.stdin, আউটপুট: process.stdout, প্রম্পট: 'js>' }); // কোড মূল্যায়ন করার জন্য একটি পরিবেশ তৈরি করুন const প্রসঙ্গ = vm.createContext({ কনসোল, সংখ্যা স্ট্রিং, অ্যারে, বস্তু // আপনি উপলব্ধ করতে চান অন্য কোনো বৈশ্বিক ভেরিয়েবল যোগ করুন // আপনি আপনার নিজস্ব ফাংশন যোগ করতে পারেন যোগ করুন: (a, b) => a + b, গুন করুন: (a, b) => a * b }); console.log('সাধারণ জাভাস্ক্রিপ্ট REPL (প্রস্থান করতে Ctrl+C টিপুন)'); console.log('জাভাস্ক্রিপ্ট কোড টাইপ করুন এবং মূল্যায়ন করতে এন্টার টিপুন'); // প্রম্পট প্রদর্শন করুন rl.prompt(); // মাল্টি-লাইন ইনপুট ট্র্যাক করুন let buffer = ''; // ইনপুট পরিচালনা করুন rl.on('লাইন', (লাইন) => { // আমাদের বাফারে লাইন যোগ করুন বাফার += লাইন; চেষ্টা করুন { // সূচক মূল্যায়ন করার চেষ্টা করুন const ফলাফল = vm.runInContext(বাফার, প্রসঙ্গ); // ফলাফল প্রদর্শন করুন console.log('\x1b[33m%s\x1b[0m', '=> ' + ফলাফল); // সফল মূল্যায়নের পর বাফার রিসেট করুন বাফার = ''; } ধরা (ত্রুটি) { // যদি এটি একটি সিনট্যাক্স ত্রুটি হয় এবং অসম্পূর্ণ ইনপুটের কারণে হতে পারে, // ইনপুট সংগ্রহ চালিয়ে যান যদি (SyntaxError && এর ত্রুটির উদাহরণ error.message.includes('ইনপুটের অপ্রত্যাশিত সমাপ্তি')) { // মাল্টি-লাইন মোডে চালিয়ে যান rl.setPrompt('...'); } অন্য { // এটি একটি বাস্তব ত্রুটি, এটি প্রদর্শন করুন এবং বাফার রিসেট করুন console.error('\x1b[31m%s\x1b[0m', 'Error: ' + error.message); বাফার = ''; rl.setPrompt('js>'); } } rl.prompt(); }); // Ctrl+C হ্যান্ডেল করুন rl.on('SIGINT', () => { যদি (buffer.length > 0) { // যদি একটি মুলতুবি এন্ট্রি থাকে, তাহলে তা সাফ করুন console.log('\nইনপুট সাফ'); বাফার = ''; rl.setPrompt('js>'); rl.prompt(); } অন্য { // অন্যথায় প্রস্থান করুন rl.question('\nআপনি কি নিশ্চিত যে আপনি প্রস্থান করতে চান? (y/n)', (উত্তর) => { যদি (answer.toLowerCase() === 'y') { console.log('বিদায়!'); rl.close(); } অন্য { rl.prompt(); } }); } }); rl.on('close', () => { console.log('REPL বন্ধ'); process.exit(0); });
সর্বোত্তম অনুশীলন
রিডলাইন এবং অন্যান্য ইনপুট পদ্ধতির তুলনা
| পদ্ধতি | সুবিধা | অসুবিধা | সেরা |
|---|---|---|---|
| Readline | লাইন-বাই-লাইন প্রক্রিয়াকরণ, ইন্টারেক্টিভ ইনপুট, ইতিহাস, ফলাফল | জটিল ইন্টারফেসের জন্য আরও কোড | CLI, ইন্টারেক্টিভ প্রম্পট, REPLs |
| process.stdin | নিম্ন-স্তরের নিয়ন্ত্রণ, কাঁচা তথ্য | ব্যবহার করা কঠিন, ম্যানুয়াল বাফারিং | বাইনারি ইনপুট, কাস্টম প্রোটোকল |
| Inquirer.js (3rd party) | সমৃদ্ধ UI, একাধিক ইনপুট প্রকার, বৈধতা | বাহ্যিক পক্ষপাত | জটিল ফর্ম, জরিপ, কাঠামো গাইড |
| Commander.js (3rd party) | কমান্ড সংজ্ঞা, বিকল্প পার্সিং | কম ইন্টারেক্টিভ | আর্গুমেন্ট সহ কমান্ড লাইন টুল |
সারাংশ
Node.js Readline , .
এটি বিশেষভাবে দরকারী:
ইন্টারেক্টিভ কমান্ড প্রম্পট
CLI অ্যাপ্লিকেশন যা ব্যবহারকারীর ইনপুটের সাথে ইন্টারঅ্যাক্ট করে
ফাইল প্রসেসিং
লাইন দ্বারা ফাইল প্রক্রিয়াকরণ
কাস্টম REPL পরিবেশ
রিয়েল-টাইম কোড মূল্যায়নের জন্য পরিবেশ
পাঠ্য-ভিত্তিক ইন্টারফেস
টেক্সট-ভিত্তিক গেম এবং অ্যাপ
যদিও পৃষ্ঠে সহজ, প্রতিশ্রুতি, ইভেন্ট পরিচালনা এবং যথাযথ UX বিবেচনার সাথে রিডলাইনকে একত্রিত করা আপনাকে পরিশীলিত কমান্ড-লাইন অ্যাপ্লিকেশন তৈরি করতে দেয় যা একটি দুর্দান্ত ব্যবহারকারীর অভিজ্ঞতা প্রদান করে।