নোড.জেএসে রফতানি বনাম মডিউল.এক্সপোর্টগুলি


725

আমি নোড.জেএস মডিউলে নিম্নলিখিত চুক্তিটি পেয়েছি:

module.exports = exports = nano = function database_module(cfg) {...}

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





8
এটি সব রেফারেন্স সম্পর্কে। স্থানীয় ভেরিয়েবল অবজেক্টের মতো রফতানি সম্পর্কে ভাবুন যা মডিউল.এক্সপোর্টগুলিতে নির্দেশ করে। আপনি যদি রফতানির মানটি ওভাররাইট করে থাকেন তবে আপনি মডিউল.এক্সপোর্টগুলি এবং মডিউল.এক্সপোর্টগুলি উল্লেখটি হ'ল যা আপনি সর্বজনীন ইন্টারফেস হিসাবে প্রকাশ করেন।
গ্যাব্রিয়েল লালামাস

14
দ্রুত সংক্ষিপ্তসার: উভয় exportsএবং module.exportsএকই অবজেক্টের দিকে নির্দেশ করুন, যদি না আপনি কোনওটিকে পুনরায় নিয়োগ দেন। এবং শেষ পর্যন্ত module.exportsফিরে আসে। সুতরাং আপনি যদি exportsকোনও ফাংশনে পুনর্নির্দিষ্ট হন তবে কোনও ফাংশন প্রত্যাশা করবেন না কারণ এটি ফেরত দেওয়া হবে না। তবে আপনি যদি এইভাবে ফাংশন নির্ধারণ করে থাকেন exports.func = function...তবে ফলস্বরূপ জিনিসটির মান হিসাবে ফাংশন সহ চমত্কার সম্পত্তি থাকবে। কারণ আপনি যে বস্তুটির exportsদিকে ইশারা করছিলেন সেটিতে সম্পত্তি যুক্ত করেছেন ..
মুহাম্মদ উমার

উত্তর:


426

সেটিংটি যখন ফাংশনটিকে ফাংশনের মতো কল করার module.exportsঅনুমতি দেয় database_moduleতখন required। কেবল সেটিংটি exportsফাংশনটি রফতানি করার অনুমতি দেয় না কারণ নোড বস্তুর module.exportsউল্লেখগুলি রফতানি করে । নিম্নলিখিত কোডটি ব্যবহারকারীকে ফাংশনটিতে কল করতে দেয় না।

module.js

নিম্নলিখিতগুলি কাজ করবে না।

exports = nano = function database_module(cfg) {return;}

module.exportsসেট করা থাকলে নিম্নলিখিতটি কাজ করবে ।

module.exports = exports = nano = function database_module(cfg) {return;}

কনসোল

var func = require('./module.js');
// the following line will **work** with module.exports
func();

মূলত নোড.জেএসexports বর্তমানে বস্তুটি রেফারেন্স করে না তবে মূলত যা উল্লেখ করে তার বৈশিষ্ট্যগুলি রফতানি করে exports। যদিও নোড.জেএস বস্তুর module.exportsউল্লেখগুলি রফতানি করে না , আপনাকে এটি কোনও ফাংশনের মতো কল করতে দেয়।


দ্বিতীয়তম গুরুত্বপূর্ণ কারণ

তারা উভয় সেট করে module.exportsএবং পূর্ববর্তী রফতানি হওয়া অবজেক্টটি উল্লেখ করে না exportsতা নিশ্চিত করে exports। উভয় সেট করে আপনি exportsশর্টহ্যান্ড হিসাবে ব্যবহার করেন এবং পরে রাস্তায় নেমে সম্ভাব্য বাগগুলি এড়িয়ে যান।

exports.prop = true পরিবর্তে module.exports.prop = trueঅক্ষর সংরক্ষণ করে এবং বিভ্রান্তি এড়ানো ব্যবহার করা Using


8
@ জাজেস্টারগার্ড: এটি কেবলমাত্র লাইব্রেরির নাম হতে পারে যা ওপির উদাহরণ থেকে নেওয়া হয়েছিল। মডিউলটিতে এটি লেখককে nano.version = '3.3'পরিবর্তে এমন কিছু লেখার অনুমতি দেয় module.exports.version = '3.3'যা কিছুটা আরও পরিষ্কারভাবে পড়ে reads (দ্রষ্টব্য এটি nanoএকটি স্থানীয় পরিবর্তনশীল, মডিউল রফতানি সেট হওয়ার সামান্য আগে ঘোষণা করা হয়েছে ))
josh3736

3
@ লাইম - ধন্যবাদ - আমি আনন্দিত যে এটি মূলত অপ্রাসঙ্গিক কারণ এটি যদি না হয় তবে এটির অর্থ আমি সমস্ত কিছু ভুল বুঝতাম। : - | :)
অস্টগার্ড

আরে চুন, এটি একটি পুরানো উত্তর তবে আমি আশা করি আপনি কিছু স্পষ্ট করতে পারেন। যদি আমি সেট করে রাখি module.exportsতবে না exports , আমার কোডটি কি এখনও কাজ করে? কোন সাহায্যের জন্য ধন্যবাদ!
আসাদ সাইদুদ্দীন

1
@ আসাদ হ্যাঁ ফাংশনটি সঠিকভাবে রফতানি হবে যদি আপনি সেট করেনmodule.exports
লাইম

@ লিয়াম মূল্যবান উত্তরের জন্য ধন্যবাদ। আরও কয়েকটি প্রশ্ন - সার্ভার.জেএস এন্ট্রি করার সময়, মডিউল.এক্সপোর্ট এবং রফতানির মান কী হবে বলে আশা করা যায়? মডিউল.এক্সপোর্টগুলি শূন্য হয়ে যাবে এবং রফতানি একটি খালি বস্তুতে সেট করা হবে বলে আশা করা হচ্ছে? এই উত্তরাধিকারটি নাকি রফতানি এবং মডিউল.এক্সপোর্টগুলিকে দুটি পৃথক বস্তুর কাছে দেখানোর জন্য কোনও বৈধ ব্যবহারের কেস আছে?
সুশীল

504

যদিও প্রশ্নের উত্তর অনেক আগেই দেওয়া হয়েছে এবং গৃহীত হয়েছে, আমি কেবল আমার 2 সেন্ট ভাগ করতে চাই:

আপনি কল্পনা করতে পারেন যে আপনার ফাইলের একেবারে শুরুতে এমন কিছু রয়েছে (কেবল ব্যাখ্যা করার জন্য):

var module = new Module(...);
var exports = module.exports;

এখানে চিত্র বর্ণনা লিখুন

সুতরাং আপনি যা কিছু করেন তা মনে রাখবেন module.exportsএবং exportsযখন আপনি অন্য কোথাও থেকে সেই মডিউলটি প্রয়োজন তখন আপনার মডিউল থেকে ফিরে আসবে না।

সুতরাং আপনি যখন এই জাতীয় কিছু করেন:

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

আপনি 2 ফাংশন যুক্ত করছেন aএবং bযে module.exportsপয়েন্টের উপর খুব বেশি পয়েন্টও যুক্ত করেছেন তাই typeofপ্রত্যাবর্তনের ফলাফলটি হ'ল object:{ a: [Function], b: [Function] }

অবশ্যই, আপনি যদি module.exportsএই উদাহরণের পরিবর্তে ব্যবহার করে থাকেন তবে আপনি একই ফলাফল পাবেন exports

এটি এমন ক্ষেত্রে যেখানে আপনি module.exportsরফতানি মানের একটি ধারকের মতো আচরণ করতে চান । অন্যদিকে, আপনি যদি কেবল নির্মাণকারী ফাংশনটি রফতানি করতে চান তবে ব্যবহারের বিষয়ে আপনার কিছু জানা উচিত module.exportsবা exports((আবার মনে রাখবেন যে module.exportsযখন আপনার কিছু প্রয়োজন হবে তখন ফিরে আসবে না export))।

module.exports = function Something() {
    console.log('bla bla');
}

এখন typeofরিটার্নিং ফলাফল হ'ল 'function'এবং আপনার এটির প্রয়োজন হতে পারে এবং তাৎক্ষণিকভাবে অনুরোধ করা যেতে পারে:
var x = require('./file1.js')();কারণ আপনি কোনও ফাংশন হতে রিটার্নিং ফলাফলকে ওভাররাইট করে।

তবে exportsআপনি ব্যবহার করে এমন কিছু ব্যবহার করতে পারবেন না:

exports = function Something() {
    console.log('bla bla');
}
var x = require('./file1.js')(); //Error: require is not a function

সঙ্গে যেহেতু exports, রেফারেন্স নির্দেশ করে না বস্তুর যেখানে আর module.exportsপয়েন্ট, তাই না মধ্যে একটি সম্পর্ক নেই exportsএবং module.exportsআর। এই ক্ষেত্রে module.exportsএখনও খালি অবজেক্টের দিকে নির্দেশ করে {}যা ফিরে আসবে।

অন্য বিষয় থেকে গৃহীত উত্তরের ক্ষেত্রেও সহায়তা করা উচিত: জাভাস্ক্রিপ্ট কি রেফারেন্স দিয়ে পাস করবে?


2
চমৎকার ব্যাখ্যা কিন্তু আমি এখনও বুঝতে পারি না আপনি কীভাবে module.exportsকোনও মডিউল থেকে পুরোপুরি বাদ দিতে পারেন , উদাহরণস্বরূপ এই npmপ্যাকেজটিতে: github.com/tj/consolidate.js/blob/master/lib/consolidate.js
কোডি বাগস্টিন

4
@ ইম্রের ব্যাখ্যাটি এখানে: জাভাস্ক্রিপ্ট কি রেফারেন্স দিয়ে পাস করবে? exports.a = function(){}; works, exports = function(){} doesn't work
সিআরপো

29
oooo অবশেষে এই উত্তর এটি ব্যাখ্যা করে। মূলত রফতানি বলতে কোনও অবজেক্টকে বোঝায় যেখানে আপনি বৈশিষ্ট্যগুলি যুক্ত করতে পারেন তবে আপনি যদি এটি পুনরায় কার্য সম্পাদন করার জন্য পুনরায় নিযুক্ত করেন তবে আপনি আর সেই মূল বস্তুর সাথে কোনও সম্পত্তি যুক্ত করবেন না। এখন রফতানি ফাংশনকে উল্লেখ করুন যখন মডিউল.এক্সপোর্টগুলি এখনও সেই বস্তুর দিকে নির্দেশ করছে এবং যেহেতু এটি ফিরে এসেছে returned আপনি বলতে পারেন রফতানি মূলত আবর্জনা সংগ্রহ করা হয়েছে।
মুহাম্মদ উমার

5
তাহলে, ব্যবহার করার exportsকী লাভ? কেন এটি সর্বদা ব্যবহার করা হয় না module.exportsযদি এটি কেবলমাত্র একটি পরিবর্তনশীল পুনরায় নিয়োগ হয়? আমার কাছে বিভ্রান্তি লাগছে।
jedd.ahyoung

1
@ jedd.ahyoung এর exports.somethingপরিবর্তে লিখতে কম কষ্টকরmodule.exports.something
Srle

209

মূলত জবাবটি মডিউলের মাধ্যমে যখন মডিউলের প্রয়োজন হয় তখন উত্তরটি সত্যই ঘটে থাকে require। ধরে নেওয়া এই প্রথমবারের জন্য মডিউলটির প্রয়োজন।

উদাহরণ স্বরূপ:

var x = require('file1.js');

file1.js এর সামগ্রী:

module.exports = '123';

উপরের বিবৃতিটি কার্যকর করা হলে একটি Moduleবস্তু তৈরি হয় is এর কনস্ট্রাক্টর ফাংশনটি হ'ল:

function Module(id, parent) {
    this.id = id;
    this.exports = {};
    this.parent = parent;
    if (parent && parent.children) {
        parent.children.push(this);
    }

    this.filename = null;
    this.loaded = false;
    this.children = [];
}

আপনি দেখতে পাবেন যে প্রতিটি মডিউল অবজেক্টের নামের সাথে একটি সম্পত্তি রয়েছে exports। শেষ পর্যন্ত এর অংশ হিসাবে এটিই ফিরে আসে require

প্রয়োজনীয়তার পরবর্তী পদক্ষেপটি হ'ল ফাইল 1.js এর বিষয়বস্তু নীচের মতো একটি বেনামি ফাংশনে আবদ্ধ করা:

(function (exports, require, module, __filename, __dirname) { 
    //contents from file1.js
    module.exports = '123;
});

এবং এই বেনামে ফাংশনটি নিম্নলিখিত উপায়ে চাওয়া হয়, moduleএখানে Moduleপূর্বে তৈরি করা অবজেক্টটিকে বোঝায় ।

(function (exports, require, module, __filename, __dirname) { 
    //contents from file1.js
    module.exports = '123;
}) (module.exports,require, module, "path_to_file1.js","directory of the file1.js");

যেমন আমরা ফাংশনটির ভিতরে দেখতে পাচ্ছি, exportsআনুষ্ঠানিক যুক্তি বলতে বোঝায় module.exports। মূলত এটি মডিউল প্রোগ্রামারকে সরবরাহ করা একটি সুবিধা।

তবে এই সুবিধাটি যত্ন সহকারে অনুশীলন করা প্রয়োজন। যে কোনও ক্ষেত্রে যদি রফতানিতে কোনও নতুন অবজেক্ট বরাদ্দ করার চেষ্টা করা হয় তা নিশ্চিত করুন যে আমরা এটি এভাবে করি।

exports = module.exports = {};

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

exports = {};

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


8
আমাকে এখানে হারিয়েছেনexports = module.exports = {};
জায়ান্ট এল্ক

2
আমি মনে করি এটি সর্বোত্তম উত্তর হওয়া উচিত, এটি ব্যাখ্যা করে কেন func()@ উইলিয়ামের উত্তরটি ব্যর্থ হয়!
ঘুঘু

2
আমি exports = module.exports = app;কোডের শেষ লাইনে যুক্ত করার কোনও সুবিধা দেখছি না । দেখে মনে হচ্ছে এটি module.exportsরফতানি হয়ে যাবে এবং আমরা কখনই ব্যবহার করব না exports, কারণ এটি আবার কোডের শেষ লাইনে। সুতরাং, কেন আমরা কেবল যুক্ত করব নাmodule.exports = app;
lvarayut

79

প্রাথমিকভাবে, module.exports=exportsএবং requireফাংশন আয় বস্তুর module.exportsবোঝায়।

যদি আমরা অবজেক্টটিতে সম্পত্তি যুক্ত করি , বলুন exports.a=1, তারপরে মডিউল.এক্সপোর্ট এবং রফতানিগুলি এখনও একই অবজেক্টকে বোঝায়। সুতরাং আমরা যদি কল করতে পারি এবং মডিউলটিকে একটি ভেরিয়েবলের জন্য বরাদ্দ করি, তবে ভেরিয়েবলটির একটি সম্পত্তি থাকে এবং এর মান 1 হয়;

উদাহরণস্বরূপ, আমরা যদি সেগুলির মধ্যে একটিটিকে ওভাররাইড করি exports=function(){}তবে এখন সেগুলি আলাদা : রফতানি একটি নতুন অবজেক্ট এবং মডিউলকে বোঝায় ex রফতানিগুলি মূল বস্তুকে বোঝায়। এবং যদি আমাদের ফাইলের প্রয়োজন হয় তবে এটি নতুন অবজেক্টটি ফিরিয়ে দেবে না, যেহেতু মডিউল.এক্সপোর্টগুলি নতুন অবজেক্টকে বোঝায় না।

আমার জন্য, আমি নতুন সম্পত্তি যুক্ত করে রাখব, বা তাদের দুটিকেই একটি নতুন অবজেক্টে ওভাররাইড করব। শুধু ওভাররাইড করা ঠিক নয়। এবং মনে রাখবেন যে module.exportsআসল বস।


1
হ্যাঁ, এটি আসলে আসল উত্তর। এটি সংক্ষিপ্ত এবং স্পষ্ট অন্যেরা সঠিক হতে পারে তবে অভিনব পদগুলিতে পূর্ণ এবং এই প্রশ্নের উত্তরের জন্য ঠিক মনোযোগ দেয় না।
খোোয়া

এটি এখন পর্যন্ত পরিষ্কার উত্তর! আপনি যদি এটি বুকমার্ক করতে চান তবে এটি সুনির্দিষ্ট লিঙ্ক: stackoverflow.com/questions/7137397/…
lambdarookie

56

exportsএবং module.exportsযদি না আপনি reassign একই exportsআপনার মডিউল মধ্যে।

এটি সম্পর্কে চিন্তা করার সবচেয়ে সহজ উপায়টি হ'ল এই লাইনটি প্রতিটি মডিউলের শীর্ষে রয়েছে licit

var exports = module.exports = {};

যদি, আপনার মডিউলটির মধ্যে, আপনি পুনরায় নিয়োগ করেন exports, তবে আপনি এটি আপনার মডিউলের মধ্যে পুনরায় নিয়োগ করুন এবং এটি আর সমান হয় না module.exports। এই কারণেই, যদি আপনি কোনও ফাংশন রফতানি করতে চান তবে আপনাকে অবশ্যই:

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

আপনি কেবল আপনার নির্ধারিত তাহলে function() { ... }করতে exports, আপনি পুনরায় নির্ধারণের হবে exportsথেকে আর বিন্দুmodule.exports

আপনি যদি module.exportsপ্রতিটি সময় দ্বারা আপনার ফাংশনটি উল্লেখ করতে না চান তবে আপনি এটি করতে পারেন:

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

লক্ষ্য করুন যে module.exportsবাম সবচেয়ে যুক্তি।

বৈশিষ্ট্যগুলি সংযুক্ত করা exportsএকই নয় কারণ আপনি এটি পুনরায় অর্পণ করছেন না। এই কারণেই এটি কাজ করে

exports.foo = function() { ... }

9
সমস্ত উত্তরগুলির মধ্যে এটি বোঝা সহজ ছিল!
আদর্শ কোঁচাডি

2
দুর্দান্ত এবং সোজা
ফিবোোনো

1
এই বৈশিষ্ট্যটি বোঝার সহজ এবং সহজ উপায়।
ফিলিপকানাটো

27

জাভাস্ক্রিপ্ট একটি রেফারেন্সের অনুলিপি দ্বারা অবজেক্টগুলিকে পাস করে

জাভাস্ক্রিপ্টে রেফারেন্স দ্বারা অবজেক্টগুলি যেভাবে পাস করা হয় তার সাথে এটি করা একটি সূক্ষ্ম পার্থক্য।

exportsএবং module.exportsউভয় একই বস্তুর দিকে নির্দেশ করে। exportsএকটি পরিবর্তনশীল এবংmodule.exports মডিউল অবজেক্টের একটি বৈশিষ্ট্য।

বলুন আমি এই জাতীয় কিছু লিখি:

exports = {a:1};
module.exports = {b:12};

exports এবং module.exports এখন বিভিন্ন অবজেক্টের দিকে নির্দেশ করুন। রফতানিকে সংশোধন করা আর মডিউল.এক্সপোর্টগুলিকে পরিবর্তন করে না।

আমদানি ফাংশনটি যখন module.exportsতা পরিদর্শন করে{b:12}


6
সেরা উত্তর ইমো!
মিঃ এজে

1
"জাভাস্ক্রিপ্ট রেফারেন্স দিয়ে যায়" - নং
xehpuk

13

আমি কেবল কিছু পরীক্ষা করেছি, এটি দেখা যাচ্ছে যে নোডেজের মডিউল কোডের মধ্যে এটির মতো কিছু হওয়া উচিত:

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

তাই:

1:

exports = function(){}; // this will not work! as it make the exports to some other pointer
module.exports = function(){}; // it works! cause finally nodejs make the module.exports to export.

2:

exports.abc = function(){}; // works!
exports.efg = function(){}; // works!

3: তবে, এই ক্ষেত্রে

module.exports = function(){}; // from now on we have to using module.exports to attach more stuff to exports.
module.exports.a = 'value a'; // works
exports.b = 'value b'; // the b will nerver be seen cause of the first line of code we have do it before (or later)

Lyman, তাই module.exports'রিয়েল-চুক্তি' সাজানোর যে নোডের যায় বন্ধ কিন্তু কিছু সময়ে আপনি সব যোগ করতে হবে আপনার exportsজন্য module.exportsযদি না আপনি একটি ব্যবহার করছেন exports.namespace(উপরে ক্ষেত্রে 2), সেই ক্ষেত্রে মত মনে করা হয়, যা নোড অবজেক্টের extends(module.exports, exports);সমস্ত 'নেমস্পেস' যুক্ত exportsকরেছিল module.exports? অন্য কথায়, আপনি যদি ব্যবহার করছেন exportsতবে আপনি সম্ভবত এটিতে বৈশিষ্ট্য নির্ধারণ করতে চান?
কোডি

11

এখানে একটি ভাল বর্ণনাতে নোড মডিউল সম্পর্কে লেখা ক্রিয়াটি Node.js থেকে বই ম্যানিং প্রকাশনার।
আপনার অ্যাপ্লিকেশনটিতে শেষ পর্যন্ত যা রফতানি হয় তা হ'ল মডিউল.এক্সপোর্টগুলি।
রফতানি
কেবলমাত্র বিশ্বব্যাপী রেফারেন্স হিসাবে সেট করা হয় যার প্রত্যাশাটি আর কাজ করবে না - এটি উল্লেখ করে না মডিউল.এক্সপোর্টগুলির , যা প্রাথমিকভাবে একটি খালি বস্তু হিসাবে সংজ্ঞায়িত করা হয় যা আপনি বৈশিষ্ট্যগুলি যুক্ত করতে পারেন। সুতরাং exports.myFunc জন্য শুধু সাঁটে লেখার হয় module.exports.myFunc

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

module.exports = exports = db;

8

আমি কিছু পরীক্ষার মধ্য দিয়েছি এবং আমি মনে করি এটি সম্ভবত এই বিষয়টিতে কিছুটা আলোকপাত করতে পারে ...

app.js:

var ...
  , routes = require('./routes')
  ...;
...
console.log('@routes', routes);
...

এর সংস্করণ /routes/index.js:

exports = function fn(){}; // outputs "@routes {}"

exports.fn = function fn(){};  // outputs "@routes { fn: [Function: fn] }"

module.exports = function fn(){};  // outputs "@routes function fn(){}"

module.exports.fn = function fn(){};  // outputs "@routes { fn: [Function: fn] }"

এমনকি আমি নতুন ফাইল যুক্ত করেছি:

./routes/index.js:

module.exports = require('./not-index.js');
module.exports = require('./user.js');

./routes/not-index.js:

exports = function fn(){};

./routes/user.js:

exports = function user(){};

আমরা "@routes {}" আউটপুট পাই


./routes/index.js:

module.exports.fn = require('./not-index.js');
module.exports.user = require('./user.js');

./routes/not-index.js:

exports = function fn(){};

./routes/user.js:

exports = function user(){};

আমরা আউটপুট "@routes {fn: {}, ব্যবহারকারী: {}}" পাই


./routes/index.js:

module.exports.fn = require('./not-index.js');
module.exports.user = require('./user.js');

./routes/not-index.js:

exports.fn = function fn(){};

./routes/user.js:

exports.user = function user(){};

আমরা আউটপুট পেতে "@routes {ব্যবহারকারী: [ফাংশন: ব্যবহারকারী]}" যদি আমরা পরিবর্তন user.jsকরতে { ThisLoadedLast: [Function: ThisLoadedLast] }, আমরা আউটপুট পেতে "@routes {ThisLoadedLast: [ফাংশন: ThisLoadedLast]}"।


তবে আমরা যদি সংশোধন করি ./routes/index.js...

./routes/index.js:

module.exports.fn = require('./not-index.js');
module.exports.ThisLoadedLast = require('./user.js');

./routes/not-index.js:

exports.fn = function fn(){};

./routes/user.js:

exports.ThisLoadedLast = function ThisLoadedLast(){};

... আমরা "@routes {fn: {fn: [Function: fn]}, ThisLoadedLast: {ThisLoadeLast: [Function: ThisLoadedLast]}}" পেয়েছি

তাই আমি সর্বদা ব্যবহারের পরামর্শ দেব module.exports আপনার মডিউল সংজ্ঞাগুলিতে ।

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

- শুভ কোডিং


আমি মনে করি তারা অহেতুক জটিল এবং বিভ্রান্তিকর। এটি স্বচ্ছ এবং স্বজ্ঞাত হওয়া উচিত।
এনজিঙ্গো

আমি রাজী. এটি কিছুটা পরিস্থিতিতে নেমস্পেসিংয়ের জন্য কার্যকর হতে পারে তবে সাধারণত কোনও কিছুই তৈরি বা ভাঙতে চলে না।
কোডি

4

এটি দেখায় যে কীভাবে require()এটি তার সহজতম ফর্মটিতে কাজ করে, স্পষ্টত জাভা স্ক্রিপ্ট থেকে উদ্ধৃত

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

সলিউশন আরেকটি চলক সহ মডিউল সরবরাহ করে module, যা এমন একটি বস্তু যা একটি সম্পত্তি exports। এই সম্পত্তিটি প্রাথমিকভাবে প্রয়োজন অনুসারে তৈরি খালি বস্তুটিতে নির্দেশ করে তবে অন্য কিছু রফতানির জন্য অন্য মান দিয়ে ওভাররাইট করা যায়।

function require(name) {
  if (name in require.cache)
    return require.cache[name];
  var code = new Function("exports, module", readFile(name));
  var exports = {}, module = {exports: exports};
  code(exports, module);
  require.cache[name] = module.exports;
  return module.exports;
}
require.cache = Object.create(null);

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

4

এখানে ফলাফল

console.log("module:");
console.log(module);

console.log("exports:");
console.log(exports);

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

এখানে চিত্র বর্ণনা লিখুন

এছাড়াও:

if(module.exports === exports){
    console.log("YES");
}else{
    console.log("NO");
}

//YES

দ্রষ্টব্য: কমনজেএস স্পেসিফিকেশন জনসাধারণের সদস্যদের এক্সপোজ করার জন্য রফতানির পরিবর্তনশীল ব্যবহারের অনুমতি দেয়। সুতরাং, নামমাত্র রফতানির প্যাটার্নটি হ'ল একমাত্র যা কমনজেএস স্পেসিফিকেশনের সাথে সত্যই সামঞ্জস্যপূর্ণ। মডিউল.এক্সপোর্টগুলির ব্যবহার হ'ল নোড.জেএস দ্বারা সরবরাহিত মডিউল সংজ্ঞা নিদর্শনগুলির বিস্তৃত পরিসরকে সমর্থন করে extension


4
var a = {},md={};

// প্রথমত, রফতানি এবং মডিউল.একপোর্টগুলি একই খালি অবজেক্টটিকে নির্দেশ করে

exp = a;//exports =a;
md.exp = a;//module.exports = a;

exp.attr = "change";

console.log(md.exp);//{attr:"change"}

// আপনি যদি পয়েন্টের পরিবর্তে অন্য অবজেক্টের দিকে নির্দেশ করেন তবে এটি অন্য বস্তুর সম্পত্তি property Md.exp খালি অবজেক্ট হবে {}

var a ={},md={};
exp =a;
md.exp =a;

exp = function(){ console.log('Do nothing...'); };

console.log(md.exp); //{}

4

ডক্স থেকে

রফতান পরিবর্তনশীল একটি মডিউলের ফাইল-স্তরের স্কোপের মধ্যে উপলব্ধ এবং মডিউলটি মূল্যায়নের আগে মডিউল.এক্সপোর্টগুলির মান নির্ধারিত হয়।

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

এটি মডিউল.এক্সপোর্টগুলিতে কেবলমাত্র একটি পরিবর্তনশীল poin


4

উপরের প্রশ্নের উত্তর দিতে আমি এই লিঙ্কটি দরকারী বলে মনে করেছি।

http://timnew.me/blog/2012/04/20/exports-vs-module-exports-in-node-js/

অন্যান্য পোস্টগুলিতে যুক্ত করতে নোডের মডিউল সিস্টেমটি করে

var exports = module.exports 

আপনার কোড কার্যকর করার আগে। সুতরাং আপনি যখন = foo রফতানি করতে চান, আপনি সম্ভবত মডিউল.এক্সপোর্টগুলি = রফতানি = foo করতে চান তবে এক্সপোর্টগুলি ব্যবহার করুন f


গিট লিঙ্কটি নষ্ট হয়েছে
জেসি হটাবোগ

লিঙ্কটি এখন ঠিক করা হয়েছে।
পাউয়ে গোসিকি

3

"আপনি যদি চান যে আপনার মডিউলটির রফতানির মূলটি কোনও ফাংশন (যেমন কনস্ট্রাক্টর) হতে পারে বা আপনি যদি একবারে একটি সম্পত্তি তৈরির পরিবর্তে কোনও অ্যাসাইনমেন্টে একটি সম্পূর্ণ অবজেক্ট রপ্তানি করতে চান তবে পরিবর্তে এটি মডিউল.এক্সপোর্টগুলিতে বরাদ্দ করুন" রপ্তানির। " - http://nodejs.org/api/modules.html


3

module.exportsএবং exportsমডিউলটি মূল্যায়ন করার আগে উভয়ই একই বস্তুর দিকে নির্দেশ করে।

module.exports আপনার মডিউলটি requireস্টেটমেন্ট ব্যবহার করে অন্য মডিউলে ব্যবহৃত হবে এমন কোনও সম্পত্তি আপনি অবজেক্টে যুক্ত করবেন available exportsএকই জিনিস জন্য উপলব্ধ একটি শর্টকাট হয়। এই ক্ষেত্রে:

module.exports.add = (a, b) => a+b

লেখার সমতুল্য:

exports.add = (a, b) => a+b

সুতরাং এটি ঠিক আছে যতক্ষণ আপনি exportsভেরিয়েবলের জন্য কোনও নতুন মান বরাদ্দ করেন না । আপনি যখন এই জাতীয় কিছু করেন:

exports = (a, b) => a+b 

যেহেতু আপনি exportsএটিতে একটি নতুন মান নির্ধারণ করছেন তখন রফতানি হওয়া অবজেক্টের সাথে আর রেফারেন্স পাওয়া যায় না এবং এটি আপনার মডিউলটিতে স্থানীয় থাকবে।

আপনি যদি module.exportsপ্রাথমিকভাবে উপলব্ধ পণ্যটিতে নতুন বৈশিষ্ট্য যুক্ত করার পরিবর্তে কোনও নতুন মান নির্ধারণের পরিকল্পনা করছেন তবে আপনার সম্ভবত নীচের বর্ণিত হিসাবে করা বিবেচনা করা উচিত:

module.exports = exports = (a, b) => a+b

নোড.জেএস ওয়েবসাইটটির এটির খুব ভাল ব্যাখ্যা রয়েছে।


2

1. রপ্তানিগুলি -> সিঙ্গেলটন ইউটিলিটি হিসাবে ব্যবহার করুন
2. মডিউল-রফতানি -> পরিষেবা, মডেল ইত্যাদির মতো লজিকাল বিষয় হিসাবে ব্যবহার করুন


2

আসুন 2 টি উপায় সহ একটি মডিউল তৈরি করুন:

একমুখী

var aa = {
    a: () => {return 'a'},
    b: () => {return 'b'}
}

module.exports = aa;

দ্বিতীয় উপায়

exports.a = () => {return 'a';}
exports.b = () => {return 'b';}

এবং এইভাবে প্রয়োজনীয় () মডিউলকে সংহত করবে।

প্রথম উপায়:

function require(){
    module.exports = {};
    var exports = module.exports;

    var aa = {
        a: () => {return 'a'},
        b: () => {return 'b'}
    }
    module.exports = aa;

    return module.exports;
}

দ্বিতীয় উপায়

function require(){
    module.exports = {};
    var exports = module.exports;

    exports.a = () => {return 'a';}
    exports.b = () => {return 'b';}

    return module.exports;
}

2

কেন উভয় এখানে ব্যবহার করা হয়

আমি বিশ্বাস করি তারা শুধু স্পষ্ট হতে চান যে module.exports, exportsএবং nanoএকই ফাংশন বিন্দু - আপনি ফাইল মধ্যে ফাংশন কল করতে পারেন ভেরিয়েবল ব্যবহার করতে সক্ষম হবেন। nanoফাংশনটি কী করে তার কিছু প্রসঙ্গ সরবরাহ করে।

exportsরফতানি করা হবে না (কেবল module.exportsহবে), তাই পাশাপাশি ওভাররাইটিং কেন বিরক্ত করবেন?

ভারবোসিটি ট্রেড-অফ ভবিষ্যতের বাগগুলির ঝুঁকিকে সীমাবদ্ধ করে যেমন ফাইলের exportsপরিবর্তে ব্যবহার করা module.exports। এছাড়া উপলব্ধ শোধন করে module.exportsএবং exportsসত্য একই মান নির্দেশ রয়েছে।


module.exports বনাম exports

যতক্ষণ আপনি পুনরায় নিয়োগ না করেন module.exportsবা exports(এবং পরিবর্তে তারা উভয় উল্লেখ করা বস্তুর সাথে মান যোগ করেন), আপনার কোনও সমস্যা থাকবে না এবং exportsআরও সংক্ষিপ্ত হওয়ার জন্য নিরাপদে ব্যবহার করতে পারবেন ।

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

exportsআপনাকে module.exports = exportsঅন্য ফাইলগুলিতে এটি ব্যবহার করতে সক্ষম হতে শেষ দিকে সেট করতে হবে বলে একটি অ-অবজেক্টে সেট করা তেমন অর্থবোধ করে না ।

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

exports.msg = 'hi';
console.log(module.exports === exports); // true

exports = 'yo';
console.log(module.exports === exports); // false

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

module.exports = 'hello';
console.log(module.exports === exports); // false

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

কেন নিয়োগ module.exports একটি ফাংশন ?

আরও সংক্ষিপ্ত! দ্বিতীয় উদাহরণটি কত সংক্ষিপ্ত তুলনা করুন:

helloWorld1.js: module.exports.hello = () => console.log('hello world');

app1.js: let sayHello = require('./helloWorld1'); sayHello.hello; // hello world

helloWorld2.js: module.exports = () => console.log('hello world');

app2.js: let sayHello = require('./helloWorld2'); sayHello; // hello world


2

এখানে চিত্র বর্ণনা লিখুন

আপনার তৈরি প্রতিটি ফাইল একটি মডিউল। মডিউল একটি বস্তু। এটিতে সম্পত্তি বলা হয় exports : {}যা ডিফল্টরূপে খালি বস্তু।

আপনি ফাংশন / middlewares তৈরি এবং যেমন আপত্তি এটিকে খালি রপ্তানির যোগ করতে পারেন exports.findById() => { ... } তারপর requireআপনার অ্যাপ্লিকেশান এবং ব্যবহারের যে কোন জায়গায় ...

কন্ট্রোলার / user.js

exports.findById = () => {
    //  do something
}

প্রয়োজন routes.js ব্যবহার:

const {findyId} = './controllers/user'

2

পার্থক্যগুলি বুঝতে, আপনাকে প্রথমে বুঝতে হবে রানটাইমের সময় নোড.জেএস প্রতিটি মডিউলকে কী করে। নোড.জেএস প্রতিটি মডিউলের জন্য একটি মোড়ক ফাংশন তৈরি করে:

 (function(exports, require, module, __filename, __dirname) {

 })()

লক্ষ্য করুন প্রথম প্যারামটি exportsএকটি খালি অবজেক্ট এবং তৃতীয় পরম moduleঅনেকগুলি বৈশিষ্ট্যযুক্ত একটি বস্তু, এবং এর একটি বৈশিষ্ট্যের নাম দেওয়া হয়েছে exports। এটাই যা exportsথেকে আসে এবং কী module.exportsথেকে আসে। পূর্ববর্তীটি একটি পরিবর্তনশীল অবজেক্ট এবং পরেরটি হ'ল moduleবস্তুর সম্পত্তি ।

মডিউলটির মধ্যে, নোড.জেস স্বয়ংক্রিয়ভাবে শুরুতে এই জিনিসটি করে: module.exports = exportsএবং শেষ পর্যন্ত ফিরে আসে module.exports

সুতরাং আপনি দেখতে পাচ্ছেন যে আপনি যদি কিছু মান পুনরায় অর্পণ করেন তবে এর exportsকোনও প্রভাব পড়বে না module.exports। (কেবলমাত্র exportsঅন্য নতুন অবজেক্টের দিকে নির্দেশ করলেও module.exportsএখনও পুরনোটি ধরে রয়েছে exports)

let exports = {};
const module = {};
module.exports = exports;

exports = { a: 1 }
console.log(module.exports) // {}

তবে আপনি যদি এর বৈশিষ্ট্যগুলি আপডেট করেন তবে exportsএটি অবশ্যই কার্যকর হবে module.exports। কারণ তারা উভয়ই একই বস্তুর দিকে ইঙ্গিত করে।

let exports = {};
const module = {};
module.exports = exports;

exports.a = 1;
module.exports.b = 2;
console.log(module.exports) // { a: 1, b: 2 }

এছাড়াও লক্ষ করুন যে আপনি যদি অন্য কোনও মানটিকে পুনরায় নিযুক্ত করেন module.exportsতবে exportsআপডেটের জন্য এটি অর্থহীন বলে মনে হয় । উপরের প্রতিটি আপডেট exportsউপেক্ষা করা হয় কারণ module.exportsঅন্য কোনও অবজেক্টের দিকে নির্দেশ করে।

let exports = {};
const module = {};
module.exports = exports;

exports.a = 1;
module.exports = {
  hello: () => console.log('hello')
}
console.log(module.exports) // { hello: () => console.log('hello')}

0

নোডে জেএস মডিউল.জেএস ফাইলটি মডিউল চালানোর জন্য ব্যবহার করা হয় system প্রতিটি সময় নোড যখন কোনও ফাইল চালায় তখন এটি আপনার জেএস ফাইলের বিষয়বস্তু অনুসরণ করে অনুসরণ করে

'(function (exports, require, module, __filename, __dirname) {',+
     //your js file content
 '\n});'

আপনার জেএস সোর্স কোডের অভ্যন্তরে এই মোড়কের কারণে আপনি রফতানি, প্রয়োজনীয়, মডিউল ইত্যাদিতে অ্যাক্সেস করতে পারেন this এই পন্থাটি ব্যবহৃত হয় কারণ অন্য কোনও জেএস ফাইলটিতে কার্যকারিতা লেখার কোনও উপায় নেই।

তারপরে নোড সি ++ ব্যবহার করে এই মোড়ানো ফাংশনটি সম্পাদন করুন। এই মুহুর্তে এই ফাংশনে পাস হওয়া রফতানি বস্তু পূরণ করা হবে।

আপনি এই ফাংশনটির ভিতরে প্যারামিটার রফতানি এবং মডিউলটি দেখতে পাবেন। আসলে রফতানি হল মডিউল কনস্ট্রাক্টর ফাংশনের একজন সর্বজনীন সদস্য।

নিম্নলিখিত কোড তাকান

এই কোডটি বিজেজে অনুলিপি করুন

console.log("module is "+Object.prototype.toString.call(module));
console.log("object.keys "+Object.keys(module));
console.log(module.exports);
console.log(exports === module.exports);
console.log("exports is "+Object.prototype.toString.call(exports));
console.log('----------------------------------------------');
var foo = require('a.js');
console.log("object.keys of foo: "+Object.keys(foo));
console.log('name is '+ foo);
foo();

এই কোডটি a.js এ অনুলিপি করুন

exports.name = 'hello';
module.exports.name = 'hi';
module.exports.age = 23;
module.exports = function(){console.log('function to module exports')};
//exports = function(){console.log('function to export');}

এখন নোড ব্যবহার করে চালান

এই আউটপুট হয়

module is [object Object]
object.keys id,exports,parent,filename,loaded,children,paths
{}
true

রফতানি [অবজেক্ট অবজেক্ট]

অবজেক্ট.কিজ অফ ফু: নাম ফাংশন () so কনসোল.লগ ('ফাংশন থেকে মডিউল এক্সপোর্ট')} ফাংশন থেকে মডিউল রফতানি

এখন a.js তে মন্তব্য করা রেখাটি সরান এবং সেই রেখার উপরে লাইনটি মন্তব্য করুন এবং বি.জেএস এর শেষ লাইনটি সরান এবং চালান।

জাভাস্ক্রিপ্ট ওয়ার্ল্ডে আপনি যে পরামিতি হিসাবে পাস হয়েছে তা পুনরায় সাইন করতে পারবেন না তবে আপনি যখন ফাংশনের পাবলিক সদস্যকে অন্য ফাংশনটিতে প্যারামিটার হিসাবে সেট করতে পারেন তখন আপনি ফাংশনের পাবলিক সদস্য পরিবর্তন করতে পারবেন

মনে আছে

আপনি কীওয়ার্ডের প্রয়োজনের সময় কোনও ফাংশন পেতে চাইলে কেবলমাত্র মডিউল.এক্সপোর্টগুলি ব্যবহার করুন। উপরের উদাহরণে আমরা বর্ণ foo = প্রয়োজনীয় (a.js); আপনি দেখতে পারেন যে আমরা একটি ফাংশন হিসাবে foo কল করতে পারেন;

নোড ডকুমেন্টেশন এটিকে এভাবে ব্যাখ্যা করে "রফতানি বস্তুটি মডিউল সিস্টেম দ্বারা তৈরি করা হয় Sometimes


0
  1. উভয় module.exportsএবং exportsএকই নির্দেশ function database_module(cfg) {...}

    1| var a, b;
    2| a = b = function() { console.log("Old"); };
    3|     b = function() { console.log("New"); };
    4|
    5| a(); // "Old"
    6| b(); // "New"

    আপনি bলাইন 3 থেকে পরিবর্তন করতে পারেন a, আউটপুট বিপরীত। উপসংহারটি হ'ল:

    aএবং bস্বাধীন।

  2. সুতরাং module.exports = exports = nano = function database_module(cfg) {...}এর সমতুল্য:

    var f = function database_module(cfg) {...};
    module.exports = f;
    exports = f;

    ধরে নেওয়া হয়েছে উপরোক্তটি module.jsযা দ্বারা প্রয়োজনীয় foo.js। এর সুবিধাগুলি module.exports = exports = nano = function database_module(cfg) {...}এখন স্পষ্ট:

    • ইন foo.js, যেহেতু module.exportsহয় require('./module.js'):

      var output = require('./modules.js')();
    • ইন moduls.js: আপনি এর exportsপরিবর্তে ব্যবহার করতে পারেন module.exports

সুতরাং, উভয় exportsএবং module.exportsএকই জিনিস দিকে ইশারা করলে আপনি খুশি হবেন happy

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