কমনজে মডিউল সিস্টেমে "মডিউল.এক্সপোর্ট" এবং "রফতানি" এর মধ্যে পার্থক্য


276

এই পৃষ্ঠায় ( http://docs.nodejitsu.com/articles/getting-st সূত্র / কি-is-require ), এতে উল্লেখ করা হয়েছে যে "আপনি যদি কোনও ক্রিয়াকলাপ বা কোনও নতুন অবজেক্টে রফতানি অবজেক্ট সেট করতে চান, আপনাকে অবশ্যই মডিউল.এক্সপোর্ট অবজেক্টটি ব্যবহার করুন।

আমার প্রশ্ন কেন।

// right
module.exports = function () {
  console.log("hello world")
}
// wrong
exports = function () {
  console.log("hello world")
}

আমি ফলাফলটি কনসোল.লগ করেছি ( result=require(example.js)) এবং প্রথমটি [Function]দ্বিতীয়টি হ'ল {}

আপনি দয়া করে এর পিছনে কারণ ব্যাখ্যা করতে পারেন? আমি এখানে পোস্টটি পড়েছি: মডিউল.এক্সপোর্টগুলি বনাম রফতানি নোড.জেএসে । এটি সহায়ক, তবে কেন এটি সেভাবে ডিজাইন করা হয়েছে তার কারণ ব্যাখ্যা করে না। রফতানির রেফারেন্স সরাসরি ফিরিয়ে দেওয়া হলে কি সমস্যা হবে?


11
সর্বদা ব্যবহার module.exports
গ্যাব্রিয়েল লালামাস

1
আমি মনে করি উপরে উল্লিখিত পরামর্শ অনুসরণ করা এই সমস্যা এড়াতে দেয়।
ভিটালি কোর্সাকভ

@ গ্যাব্রিয়েল্লামাস তাই কেন অনেকগুলি প্যাকেজ কেবলমাত্র ব্যবহার করে exports, উদাহরণস্বরূপ github.com/tj/consolidate.js/blob/master/lib/consolidate.js ?
কোডিবাগস্টাইন

3
@Imray আপনি সবসময় ব্যবহার করেন তাহলে module.exports, আপনি কখনো ভুল হতে পাবেন, কিন্তু আপনি ব্যবহার করতে পারেন exportsযদি আপনি ডিফল্ট রপ্তানি বস্তু, যে, যদি কেবল আপনি ভালো বৈশিষ্ট্য সংযুক্ত প্রতিস্থাপন করছি না: var foo = require('foo').foo। এই fooসম্পত্তিটি এই জাতীয়ভাবে রফতানি করা যায়: exports.foo = ...এবং অবশ্যই এটির সাথেও module.exports। এটি একটি ব্যক্তিগত পছন্দ তবে আমি বর্তমানে module.exportsএবং exportsযথাযথভাবে ব্যবহার করছি ।
গ্যাব্রিয়েল লালামাস

আমি রফতানিগুলি পছন্দ করি mymyFunc = ফাংশন () {} তাই আমাকে ফাইলের নীচে রফতানির একটি তালিকা বজায় রাখতে হবে না। আপনি ES6 এ ঘোষণা করার সময় রফতানির সাধারণ অনুশীলনের খুব কাছাকাছি অনুভূত হয়।
SacWebDeveloper

উত্তর:


624

moduleএকটি exportsসম্পত্তি সহ একটি সরল জাভাস্ক্রিপ্ট অবজেক্ট । exportsএটি একটি সাধারণ জাভাস্ক্রিপ্ট পরিবর্তনশীল যা সেট হয়ে যায় module.exports। আপনার ফাইলের শেষে, Node.js মূলত 'প্রত্যাবর্তন' হবে module.exportsথেকে requireফাংশন। নোডে জেএস ফাইল দেখার সহজ সরল উপায় এটি হতে পারে:

var module = { exports: {} };
var exports = module.exports;

// your code

return module.exports;

আপনি যদি কোনও সম্পত্তি সেট করেন exports, যেমন exports.a = 9;, module.exports.aসেটিও সেট করে দেয় কারণ জাভাস্ক্রিপ্টে রেফারেন্স হিসাবে অবজেক্টগুলি পাস করা হয়েছে যার অর্থ আপনি যদি একই বস্তুতে একাধিক ভেরিয়েবল সেট করেন তবে সেগুলি সমস্ত একই জিনিস; সুতরাং exportsএবং module.exportsএকই জিনিস হয়।
কিন্তু আপনি যদি সেট exportsনতুন কিছু, এটা কোনো সেট করা হবে module.exports, তাই exportsএবং module.exportsআর একই বস্তুর হয়।


11
ঠিক আছে, এটি কেবল রেফারেন্সের ধরণের মূল বিষয়গুলি।
ভিটালি কোর্সাকভ

18
কেন !? কেন এটি কেবল এখানে পড়তে পারে। এটি প্রতিটি মডিউলার জাভাস্ক্রিপ্টের জন্য ট্যাগলাইন হওয়া উচিত। ধন্যবাদ
লিমা_ফিল

8
সুন্দর করে ব্যাখ্যা করা হয়েছে!
আকাশ ভার্মা

3
দুর্দান্ত, সেরা উত্তর !!
জন

5
দুর্দান্ত ব্যাখ্যা। module.exportsএটির জন্য ডকুমেন্টেশনটি এটিও বর্ণনা করে: নোডজস.আর.জি.পি.আই
ব্রায়ান মোরার্টি

52

রিনির উত্তরটি ভালভাবে ব্যাখ্যা করা হয়েছে। একটি উদাহরণ সহ উত্তরের সাথে যুক্ত করুন:

নোড আপনার ফাইলে অনেক কিছু করে এবং একটি গুরুত্বপূর্ণ আপনার ফাইলকে মোড়ানো। নোডেজের ভিতরে সোর্স কোড "মডিউল.এক্সপোর্টস" ফিরিয়ে দেওয়া হয়েছে। একটি পদক্ষেপ পিছনে নিতে এবং মোড়কে বুঝতে দেয়। ধরুন আপনার আছে

greet.js

var greet = function () {
   console.log('Hello World');
};

module.exports = greet;

উপরের কোডটি নোডেজ উত্স কোডের মধ্যে আইআইএফই (তাত্ক্ষণিকভাবে অনুরোধ করা ফাংশন এক্সপ্রেশন) হিসাবে আবৃত রয়েছে:

(function (exports, require, module, __filename, __dirname) { //add by node

      var greet = function () {
         console.log('Hello World');
      };

      module.exports = greet;

}).apply();                                                  //add by node

return module.exports;                                      //add by node

এবং উপরের ফাংশনটি (। অ্যাপ্লাই ()) এবং প্রত্যাবর্তিত মডিউল.এক্সপোর্টগুলি অন্তর্ভুক্ত। এই সময়ে মডিউল.এপোর্টস এবং রফতানি একই রেফারেন্সকে নির্দেশ করে।

এখন, কল্পনা করুন আপনি গ্রিটি.জেসকে আবার লিখুন

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

আউটপুট হবে

[Function]
{}

কারণটি হ'ল: মডিউল.এক্সপোর্টগুলি একটি খালি অবজেক্ট। আমরা মডিউল.এক্সপোর্টগুলিতে কিছু সেট করি নি বরং এক্সপোর্ট = ফাংশন () ..... নতুন গ্রিটি.জেজে সেট করি। সুতরাং, মডিউল.এক্সপোর্টগুলি খালি।

প্রযুক্তিগতভাবে রফতানি এবং মডিউল.এক্সপোর্টগুলি একই রেফারেন্সের দিকে নির্দেশ করা উচিত (এটি সঠিক!) তবে আমরা রফতানিতে ফাংশন () .... নির্ধারণের সময় "=" ব্যবহার করি যা মেমরিতে অন্য একটি অবজেক্ট তৈরি করে। সুতরাং, মডিউল.এক্সপোর্ট এবং রফতানি বিভিন্ন ফলাফল দেয়। যখন রফতানির বিষয়টি আসে আমরা এটিকে ওভাররাইড করতে পারি না।

এখন, কল্পনা করুন যে আপনি পুনরায় লিখেছেন (এটিকে মিউটেশন বলা হয়) ग्रीল.জেএস (রেনি উত্তর উল্লেখ করে) হিসাবে

exports.a = function() {
    console.log("Hello");
}

console.log(exports);
console.log(module.exports);

আউটপুট হবে

{ a: [Function] }
{ a: [Function] }

আপনি দেখতে পারেন যে মডিউল.এপোর্টপোর্ট এবং রফতানি একই ফাংশন যা একই রেফারেন্সের দিকে ইঙ্গিত করছে। আপনি যদি রফতানিতে কোনও সম্পত্তি সেট করেন তবে এটি মডিউল.এক্সপোর্টগুলিতে সেট করা হবে কারণ জেএসে, অবজেক্টগুলি রেফারেন্স দ্বারা পাস হয়।

উপসংহারটি সবসময় বিভ্রান্তি এড়াতে মডিউল.এক্সপোর্টগুলি ব্যবহার করা হয়। আশাকরি এটা সাহায্য করবে. শুভ কোডিং :)


এটিও একটি সুন্দর অন্তর্দৃষ্টিপূর্ণ উত্তর এবং @ গোটো-বাস-স্টপের উত্তরটি পরিপূরক। :)
বরুণ

23

এছাড়াও, একটি জিনিস যা বুঝতে সাহায্য করতে পারে:

math.js

this.add = function (a, b) {
    return a + b;
};

client.js

var math = require('./math');
console.log(math.add(2,2); // 4;

দুর্দান্ত, এক্ষেত্রে:

console.log(this === module.exports); // true
console.log(this === exports); // true
console.log(module.exports === exports); // true

সুতরাং, ডিফল্টরূপে, "এটি" আসলে মডিউল.এপোর্টপোর্টের সমান।

তবে, আপনি যদি নিজের প্রয়োগ পরিবর্তন করেন:

math.js

var add = function (a, b) {
    return a + b;
};

module.exports = {
    add: add
};

এই ক্ষেত্রে, এটি ঠিকঠাক কাজ করবে, তবে, "এটি" আর মডিউল.এক্সপোর্টগুলির সমান নয়, কারণ একটি নতুন অবজেক্ট তৈরি হয়েছিল।

console.log(this === module.exports); // false
console.log(this === exports); // true
console.log(module.exports === exports); // false

এবং এখন, প্রয়োজনীয়তা দ্বারা কী ফিরে আসবে তা মডিউল.এক্সপোর্টগুলির ভিতরে সংজ্ঞায়িত করা হয়েছিল, এটি বা রফতানি নয়।

এটি করার আরেকটি উপায় হ'ল:

math.js

module.exports.add = function (a, b) {
    return a + b;
};

বা:

math.js

exports.add = function (a, b) {
    return a + b;
};

15

এর মধ্যে সম্পর্কের বিষয়ে রিনির উত্তর exportsএবং module.exportsএটি পুরোপুরি স্পষ্ট, এটি সমস্ত জাভাস্ক্রিপ্ট রেফারেন্স সম্পর্কে। কেবল এটি যোগ করতে চান:

আমরা এটি অনেক নোড মডিউলগুলিতে দেখতে পাই:

var app = exports = module.exports = {};

এটি নিশ্চিত করবে যে আমরা যদি মডিউল.এক্সপোর্টগুলি পরিবর্তন করে ফেলেছি, তবুও আমরা এই দুটি ভেরিয়েবলকে একই বস্তুতে নির্দেশ করে রফতানি ব্যবহার করতে পারি।


আমি এই ব্যাখ্যা দিয়ে বিভ্রান্ত হয়ে পড়েছি, দয়া করে বিস্তারিত বলার জন্য?
গাইফ্রোকজ

6
@ গুয়্যফ্রোকজ আমি নিশ্চিত না যে এটি আপনার বিভ্রান্তির সাথে কথা বলে কিনা, তবে module.exportsএবং exportsকেবল একই পৃথক ভেরিয়েবল, একই বস্তুর রেফারেন্সের জন্য সূচনা করা। আপনি যদি একটি ভেরিয়েবলের উল্লেখ উল্লেখ পরিবর্তন করেন তবে দুটি ভেরিয়েবল আর একই জিনিসটিকে উল্লেখ করে না। উপরের কোডের লাইনটি নিশ্চিত করে যে উভয় ভেরিয়েবল একই নতুন অবজেক্টে আরম্ভ করা হবে।
অ্যান্ড্রু পামার

প্রকৃত ব্যবহারের কেস যা প্রত্যেকে @fengshuo এ বাদ দিয়েছে। ধন্যবাদ!
আকাশ ভার্মা

0

myTest.js

module.exports.get = function () {};

exports.put = function () {};

console.log(module.exports)
// output: { get: [Function], put: [Function] }

exportsএবং module.exportsএকই জিনিস এবং একই জিনিস একটি রেফারেন্স। আপনি আপনার সুবিধার্থে উভয় উপায়ে সম্পত্তি যুক্ত করতে পারেন।

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