javascript - Node.js module.exports এর উদ্দেশ্য কী এবং আপনি কীভাবে এটি ব্যবহার করেন?




(8)

Node.js module.exports এর উদ্দেশ্য কী এবং আপনি কীভাবে এটি ব্যবহার করেন?

আমি এই বিষয়ে কোন তথ্য খুঁজে পাচ্ছি না, কিন্তু এটি প্রায়শই সোর্স কোড হিসাবে এটি দেখতে Node.js এর একটি গুরুত্বপূর্ণ অংশ বলে মনে হচ্ছে।

Node.js ডকুমেন্টেশন অনুযায়ী :

মডিউল

বর্তমান module একটি রেফারেন্স। বিশেষ module.exports .exports রপ্তানি বস্তুর মত একই। আরও তথ্যের জন্য src/node.js দেখুন।

কিন্তু এই সত্যিই সাহায্য করে না।

ঠিক কি module.exports করবেন, এবং একটি সহজ উদাহরণ কি হবে?


একটি মডিউল সিস্টেম উদ্দেশ্য কি?

এটা নিম্নলিখিত জিনিস সম্পাদন করে:

  1. সত্যিই বড় মাপে bloating থেকে আমাদের ফাইল রাখে । উদাহরণস্বরূপ ফাইলগুলির সাথে 5000 লাইনের কোড রয়েছে যা সাধারণত উন্নয়নকালে মোকাবিলা করা কঠিন।
  2. উদ্বেগ বিচ্ছেদ বাধ্য করে। আমাদের কোড একাধিক ফাইল মধ্যে বিভক্ত থাকার আমাদের প্রতিটি ফাইলের জন্য উপযুক্ত ফাইলের নাম থাকতে দেয়। এই ভাবে আমরা সহজেই সনাক্ত করতে পারি যে প্রতিটি মডিউল কী করে এবং এটি কোথায় পাওয়া যায় (অনুমান করে আমরা একটি যৌক্তিক ডিরেক্টরি কাঠামো তৈরি করেছি যা এখনও আপনার দায়িত্ব)।

মডিউলগুলি কোডের কিছু অংশ খুঁজে পাওয়া সহজ করে তোলে যা আমাদের কোডকে আরও বেশি রক্ষণযোগ্য করে তোলে।

এটা কিভাবে কাজ করে?

NodejS COMMJS মডিউল সিস্টেম ব্যবহার করে যা নিম্নোক্তভাবে কাজ করে:

  1. যদি কোন ফাইল কিছু রপ্তানি করতে চায় তবে এটি module.export সিনট্যাক্স ব্যবহার করে এটি ঘোষণা করতে হবে
  2. যদি কোনও ফাইল কিছু আমদানি করতে চায় তবে এটি require('file') সিনট্যাক্স ব্যবহার করে এটি ঘোষণা করতে হবে

উদাহরণ:

test1.js

const test2 = require('./test2');    // returns the module.exports object of a file

test2.Func1(); // logs func1
test2.Func2(); // logs func2

test2.js

module.exports.Func1 = () => {console.log('func1')};

exports.Func2 = () => {console.log('func2')};

অন্যান্য দরকারী বিষয় জানতে:

  1. মডিউল ক্যাশে হচ্ছে । যখন আপনি 2 টি ভিন্ন ফাইলগুলিতে একই মডিউল লোড করছেন তখন শুধুমাত্র মডিউলটি একবার লোড করতে হবে। দ্বিতীয় বার একটি require() ক্যাশ থেকে টানা হয় যে একই মডিউলে বলা হয়।
  2. মডিউল সিঙ্ক্রোনাস মধ্যে লোড করা হয় । এই আচরণটি প্রয়োজন, যদি এটি অ্যাসিঙ্ক্রোনাস হয় তবে আমরা এখন require() থেকে পুনরুদ্ধার হওয়া বস্তুর অ্যাক্সেস করতে পারিনি।

Node.js এ কিছু ডিফল্ট বা বিদ্যমান মডিউল রয়েছে যখন আপনি node.js ডাউনলোড এবং ইনস্টল করেন যেমন http, sys ইত্যাদি।

যেহেতু তারা ইতিমধ্যে node.js এ আছে, আমরা এই মডিউলগুলি ব্যবহার করতে চাইলে আমরা মূলত মডিউলগুলি আমদানি করতে চাই, কিন্তু কেন? কারণ তারা ইতিমধ্যে node.js. মধ্যে উপস্থিত। আমদানি তাদের node.js থেকে গ্রহণ এবং আপনার প্রোগ্রাম তাদের নির্বাণ মত। এবং তারপর তাদের ব্যবহার।

যেখানে এক্সপোর্টগুলি ঠিক বিপরীত, আপনি যে মডিউলটি চান তা তৈরি করছেন, মডিউল addition.js বলুন এবং node.js এ মডিউলটিকে নির্বাণ করুন, আপনি এটি রপ্তানি করে এটি করেন।

আমি এখানে কিছু লিখার আগে, মনে রাখবেন, module.exports.additionTwo export.additionTwo হিসাবে একই

হু, তাই কারণ, আমরা পছন্দ করি

exports.additionTwo = function(x)
{return x+2;};

পথ সঙ্গে সতর্কতা অবলম্বন করা আবশ্যক

চলুন আপনি একটি add.js মডিউল তৈরি করেছেন,

exports.additionTwo = function(x){
return x + 2;
};

যখন আপনি আপনার NODE.JS কমান্ড প্রম্পটে এটি চালান:

node
var run = require('addition.js');

এই বলার ত্রুটি হবে

ত্রুটি: মডিউল addition.js খুঁজে পাচ্ছি না

কারণ আমরা node.js প্রক্রিয়া addition.js করতে পারিনি কারণ আমরা পথ উল্লেখ করিনি। সুতরাং, আমরা NODE_PATH ব্যবহার করে পথ সেট করতে পারেন

set NODE_PATH = path/to/your/additon.js

এখন, এই কোন ত্রুটি ছাড়া সফলভাবে চালানো উচিত !!

আরও একটি জিনিস, আপনি NODJPATH সেট না করে, addode ফাইলটি চালাতে পারেন, আপনার নোডজেস কমান্ড প্রম্পটে ফিরে যান:

node
var run = require('./addition.js');

যেহেতু আমরা বর্তমান ডিরেক্টরীতে এটি বলার মাধ্যমে এখানে পাথ সরবরাহ করছি। ./ এটি সফলভাবে চালানো উচিত।


উদ্দেশ্য হল:

মডুলার প্রোগ্রামিং একটি সফটওয়্যার ডিজাইন কৌশল যা একটি প্রোগ্রামের স্বাধীন, বিনিমেয় মডিউলগুলিতে কার্যকারিতা বিচ্ছিন্ন করার উপর জোর দেয়, যেমন প্রতিটিতে পছন্দসই কার্যকারিতাটির একমাত্র দিক প্রয়োগ করার জন্য প্রয়োজনীয় সবকিছু রয়েছে।

Wikipedia

আমি কল্পনাপ্রসূত / পুনর্ব্যবহারযোগ্য কোড ছাড়া একটি বড় প্রোগ্রাম লিখতে কঠিন হয়ে যায়। নোডজে আমরা মডিউল. module.exports ব্যবহার করে মডুলার প্রোগ্রাম তৈরি করতে পারি যা সংজ্ঞায়িত করে এবং require সাথে আমাদের প্রোগ্রাম রচনা করে।

এই উদাহরণটি চেষ্টা করুন:

fileLog.js

function log(string) { require('fs').appendFileSync('log.txt',string); }

module.exports = log;

stdoutLog.js

function log(string) { console.log(string); }

module.exports = log;

program.js

const log = require('./stdoutLog.js')

log('hello world!');

এক্সিকিউট

$ নোড program.js

ওহে বিশ্ব!

এখন ./fileLog.js এর জন্য ./stdoutLog.js সোয়াপিং করার চেষ্টা করুন।


উল্লেখ্য যে নোডজেএস মডিউল প্রক্রিয়াটি CommonJS মডিউলগুলির উপর ভিত্তি করে যা প্রয়োজনীয় অন্যান্য প্রয়োজনীয় বাস্তবায়নের জন্য আবশ্যক , যেমন স্প্রাউট কোর , সিউচডিবি , ওয়াকান্দা , ওরিয়েন্ট ডিবি , আরঙ্গোডিবি , রিংজজেএস , টিএজেএসএস , সিল্কজেএস , কার্ল.জেএস , এমনকি অ্যাডোব ফটোশপ ( PSLib মাধ্যমে PSLib )। আপনি here পরিচিত বাস্তবায়ন সম্পূর্ণ তালিকা খুঁজে পেতে পারেন।

আপনার মডিউল নোড নির্দিষ্ট বৈশিষ্ট্য বা মডিউল ব্যবহার না করা পর্যন্ত, আমি আপনাকে module.exports স্ট্যান্ডার্ডের অংশ নয় এমন মডিউল. exports পরিবর্তে exports ব্যবহার করে উত্সাহিত করি এবং তারপরে বেশিরভাগ বাস্তবায়নের দ্বারা সমর্থিত নয়।

আরেকটি নোডজেএস স্পেসিফিকেশনটি হল যখন আপনি এই প্রোডাক্টে জেড ওয়াটসন দ্বারা সরবরাহিত শেষ উদাহরণের মতো এটিতে কেবল বৈশিষ্ট্য এবং পদ্ধতি যোগ করার পরিবর্তে exports করার জন্য একটি নতুন বস্তুর একটি রেফারেন্স বরাদ্দ করেন। আমি ব্যক্তিগতভাবে এই অনুশীলনের নিরুৎসাহিত করব কারণ এটি কমনজেজ মডিউল প্রক্রিয়াটির বৃত্তাকার রেফারেন্স সমর্থনটি ভেঙ্গে দেয় । এটি সমস্ত বাস্তবায়ন দ্বারা সমর্থিত নয় এবং জেড উদাহরণটি আরও একটি সার্বজনীন মডিউল সরবরাহ করার জন্য এই ভাবে (বা অনুরূপ একটি) লেখা উচিত:

(Sayhello.js):

exports.run = function() {
    console.log("Hello World!");
}

(App.js):

var sayHello = require('./sayhello');
sayHello.run(); // "Hello World!"

অথবা ES6 বৈশিষ্ট্য ব্যবহার করে

(Sayhello.js):

Object.assign(exports, {
    // Put all your public API here
    sayhello() {
        console.log("Hello World!");
    }
});

(App.js):

const { sayHello } = require('./sayhello');
sayHello(); // "Hello World!"

পিএস: অ্যাপেলেসারেটরটি কমন্স জেড মডিউলগুলি প্রয়োগ করে, তবে বৃত্তাকার রেফারেন্স সমর্থন ছাড়াই এটি দেখে মনে হচ্ছে (দেখুন: অ্যাপসেলেলার এবং কমনজেস মডিউল (ক্যাশিং এবং বৃত্তাকার রেফারেন্স) )


একাধিক ফাইলের উপর আপনার প্রোগ্রাম কোড বিভাজন যখন, module.exports একটি মডিউল ভোক্তাদের ভেরিয়েবল এবং ফাংশন প্রকাশ করতে ব্যবহৃত হয়। আপনার সোর্স ফাইলে require() কলটি মডিউল থেকে লোড হওয়া সংশ্লিষ্ট মডিউল. module.exports দ্বারা প্রতিস্থাপিত হয়।

মডিউল লেখা যখন মনে রাখবেন

  • মডিউল লোড ক্যাশে হয়, শুধুমাত্র প্রাথমিক কল জাভাস্ক্রিপ্ট মূল্যায়ন।
  • একটি মডিউল ভিতরে স্থানীয় ভেরিয়েবল এবং ফাংশন ব্যবহার করা সম্ভব, সবকিছুই এক্সপোর্ট করা প্রয়োজন।
  • module.exports বস্তু exports module.exports হিসাবে পাওয়া যায়। কিন্তু একটি একক ফাংশন ফিরে যখন, সবসময় module.exports ব্যবহার module.exports

মতে: "মডিউল অংশ 2 - মডিউল লেখা"


এটি ইতিমধ্যে উত্তর দেওয়া হয়েছে কিন্তু আমি কিছু ব্যাখ্যা যোগ করতে চেয়েছিলাম ...

আপনি আপনার অ্যাপ্লিকেশনটিতে কোড আমদানি করতে exports এবং module.exports exports উভয়ই ব্যবহার করতে পারেন:

var mycode = require('./path/to/mycode');

আপনি দেখতে পাবেন এমন মৌলিক ব্যবহার ক্ষেত্রে (যেমন এক্সপ্রেসজেএস উদাহরণ কোড) আপনি যে কোন .js ফাইলের মধ্যে exports বস্তুর বৈশিষ্ট্যাবলী সেট করেন যা আপনি তারপর require() আমদানি করেন require()

সুতরাং একটি সহজ গণনা উদাহরণে, আপনি থাকতে পারে:

(Counter.js):

var count = 1;

exports.increment = function() {
    count++;
};

exports.getCount = function() {
    return count;
};

... তারপর আপনার অ্যাপ্লিকেশন (web.js, অথবা অন্য কোন। জেএস ফাইল):

var counting = require('./counter.js');

console.log(counting.getCount()); // 1
counting.increment();
console.log(counting.getCount()); // 2

সহজ শর্তে, আপনি প্রয়োজনীয় ফাইলগুলিকে একটি একক অবজেক্ট ফিরিয়ে দেওয়ার ফাংশন হিসাবে মনে করতে পারেন এবং আপনি exports সেট করে ফেরত আসা বস্তুর বৈশিষ্ট্যাবলী (স্ট্রিং, সংখ্যা, অ্যারে, ফাংশন, কিছু) যুক্ত করতে পারেন।

কখনও কখনও আপনি একটি require() কল থেকে প্রত্যাশিত বস্তুটি কেবল বৈশিষ্ট্যগুলির সাথে একটি বস্তুর পরিবর্তে কল করতে পারেন এমন একটি ফাংশন হতে চান। এই ক্ষেত্রে আপনাকে module.exports সেট করতে হবে, যেমন:

(Sayhello.js):

module.exports = exports = function() {
    console.log("Hello World!");
};

(App.js):

var sayHello = require('./sayhello.js');
sayHello(); // "Hello World!"

রপ্তানি এবং module.exports মধ্যে পার্থক্য এখানে এই উত্তর ভাল ব্যাখ্যা করা হয়।


যদি আপনি exports এবং / অথবা modules.exports একটি নতুন বস্তুর একটি রেফারেন্স বরাদ্দ করেন তবে কয়েকটি বিষয় আপনাকে অবশ্যই যত্ন নিতে হবে। exports :

1. মূল exports বা module.exports exports সংযুক্ত পূর্বে সমস্ত বৈশিষ্ট্য / পদ্ধতি অবশ্যই হারিয়ে গেছে কারণ এক্সপোর্ট হওয়া বস্তুটি এখন অন্য একটি নতুন উল্লেখ করবে

এটি একটি সুস্পষ্ট, কিন্তু যদি আপনি একটি বিদ্যমান মডিউল প্রারম্ভে একটি এক্সপোর্ট পদ্ধতি যোগ করেন তবে নিশ্চিত করুন যে স্থানীয় রপ্তানি হওয়া বস্তুটি অন্য বস্তুর শেষে উল্লেখ করছে না

exports.method1 = function () {}; // exposed to the original exported object
exports.method2 = function () {}; // exposed to the original exported object

module.exports.method3 = function () {}; // exposed with method1 & method2

var otherAPI = {
    // some properties and/or methods
}

exports = otherAPI; // replace the original API (works also with module.exports)

2. exports বা module.exports exports একটি নতুন মান উল্লেখ করে, তারা একই বস্তুর আর কোন উল্লেখ না

exports = function AConstructor() {}; // override the original exported object
exports.method2 = function () {}; // exposed to the new exported object

// method added to the original exports object which not exposed any more
module.exports.method3 = function () {}; 

3. চতুর ফলাফল। আপনি যদি exports এবং module.exports exports উভয়ের রেফারেন্স পরিবর্তন করেন, তাহলে কোন API টি প্রকাশ করা হয় তা বোঝা কঠিন (এটি module.exports জিতেছে)

// override the original exported object
module.exports = function AConstructor() {};

// try to override the original exported object
// but module.exports will be exposed instead
exports = function AnotherConstructor() {}; 

module.exports এমন বস্তু যা প্রকৃতপক্ষে একটি require কলের ফলাফল হিসাবে প্রত্যাবর্তিত হয়।

exports পরিবর্তনশীল প্রাথমিকভাবে একই বস্তুতে সেট করা হয় (অর্থাৎ এটি একটি শর্টথ্যান্ড "ওরফে"), তাই মডিউল কোডে আপনি সাধারণত এটির মতো কিছু লিখবেন:

var myFunc1 = function() { ... };
var myFunc2 = function() { ... };
exports.myFunc1 = myFunc1;
exports.myFunc2 = myFunc2;

অভ্যন্তরীণভাবে myFunc1 ফাংশনগুলি আমার myFunc1 এবং myFunc2 এক্সপোর্ট (বা "এক্সপোজ") করতে।

এবং কলিং কোডে আপনি ব্যবহার করবেন:

var m = require('./mymodule');
m.myFunc1();

যেখানে শেষ লাইন দেখায় কিভাবে require ফলাফল (সাধারণত) শুধুমাত্র একটি সাধারণ বস্তু যার বৈশিষ্ট্যগুলি অ্যাক্সেস করা যেতে পারে।

NB: যদি আপনি exports ওভাররাইট করেন তবে এটি আর module.exports . module.exports পড়ুন। সুতরাং আপনি exports করতে একটি নতুন বস্তু (বা একটি ফাংশন রেফারেন্স) বরাদ্দ করতে ইচ্ছুক হলে আপনি যে নতুন বস্তু module.exports বরাদ্দ করা উচিত

এটি উল্লেখযোগ্য যে exports যোগ করা নামটি আপনার যে মান যোগ করা হচ্ছে তার জন্য মডিউল অভ্যন্তরীণভাবে স্কপড নাম হিসাবে একই হতে হবে না, তাই আপনি এটি করতে পারেন:

var myVeryLongInternalName = function() { ... };
exports.shortName = myVeryLongInternalName;
// add other objects, functions, as required

অনুসরণ করে:

var m = require('./mymodule');
m.shortName(); // invokes module.myVeryLongInternalName






node.js