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


120

নোড.জেএস ম্যানুয়াল অনুসারে:

আপনি যদি চান যে আপনার মডিউলটির রফতানির মূলটি কোনও ফাংশন (যেমন কনস্ট্রাক্টর) হতে পারে বা আপনি যদি একবারে একটি সম্পত্তি তৈরির পরিবর্তে কোনও অ্যাসাইনমেন্টে একটি সম্পূর্ণ অবজেক্ট রপ্তানি করতে চান তবে রফতানির পরিবর্তে মডিউল.এক্সপোর্টগুলিতে এটি অর্পণ করুন If ।

প্রদত্ত উদাহরণটি হ'ল:

// file: square.js
module.exports = function(width) {
  return {
    area: function() {
      return width * width;
    }
  };
}

এবং এটির মতো ব্যবহৃত:

var square = require('./square.js');
var mySquare = square(2);
console.log('The area of my square is ' + mySquare.area());

আমার প্রশ্ন: উদাহরণটি কেন বস্তু হিসাবে বর্গ ব্যবহার করে না? নিম্নলিখিতটি কি বৈধ এবং এটি উদাহরণটিকে আরও "অবজেক্ট ওরিয়েন্টেড" করে তোলে?

var Square = require('./square.js');
var mySquare = new Square(2);
console.log('The area of my square is ' + mySquare.area());

1
আপনার উদাহরণটি একটি সিনট্যাক্স ত্রুটি। পুনঃনামকরনের পর squareথেকে আর বিদ্যমান নেই। Squarenew square()
সুকিমা

3
দুঃখিত, এটি একটি টাইপ ছিল। ঠিক কর. আমার উদ্দেশ্যটি ছিল আপত্তি / ফাংশন নামটি বড় হাতের অক্ষর দিয়ে শুরু হবে এবং ছোট নাম দিয়ে শুরু হবে instance
নরেশ

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

উত্তর:


173

কমনজেএস মডিউলগুলি রফতানি করা বৈশিষ্ট্যগুলি সংজ্ঞায়িত করার দুটি উপায়ের অনুমতি দেয়। উভয় ক্ষেত্রেই আপনি কোনও অবজেক্ট / ফাংশন ফিরিয়ে দিচ্ছেন। কারণ ফাংশনগুলি জাভাস্ক্রিপ্টে প্রথম শ্রেণির নাগরিক তারা ঠিক অবজেক্টের মতো কাজ করতে পারে (প্রযুক্তিগতভাবে তারা বস্তু)। এটি বলেছিল newকীওয়ার্ডগুলি ব্যবহার সম্পর্কে আপনার প্রশ্নের একটি সহজ উত্তর রয়েছে: হ্যাঁ। আমি বর্ণনা করব ...

মডিউল রফতানি

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

মডিউলটি কীভাবে সংজ্ঞায়িত করা হয় তার সিউডো কোড উদাহরণ:

var theModule = {
  exports: {}
};

(function(module, exports, require) {

  // Your module code goes here

})(theModule, theModule.exports, theRequireFunction);

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

নির্মাণকারীদের সাথে প্রয়োজনীয়

সরাসরি আপনাকে একটি ফাংশন সংযুক্ত করতে পারেন যেহেতু module.exportsআপনি মূলত একটি ফাংশন আসতে পারেন এবং কোন ফাংশন মত এটি একটি যেমন পরিচালিত হতে পারে কন্সট্রাকটর italics মধ্যে যে (যেহেতু একটি ফাংশন এবং JavaScript একটি কন্সট্রাকটর মধ্যে একমাত্র পার্থক্য কিভাবে আপনি এটি ব্যবহার করতে মনস্থ হয়। টেকনিক্যালি এখানে কোন পার্থক্য নেই.)

সুতরাং নিম্নলিখিতটি পুরোপুরি ভাল কোড এবং আমি ব্যক্তিগতভাবে এটি উত্সাহিত করেছি:

// My module
function MyObject(bar) {
  this.bar = bar;
}

MyObject.prototype.foo = function foo() {
  console.log(this.bar);
};

module.exports = MyObject;

// In another module:
var MyObjectOrSomeCleverName = require("./my_object.js");
var my_obj_instance = new MyObjectOrSomeCleverName("foobar");
my_obj_instance.foo(); // => "foobar"

অ-নির্মাণকারীদের জন্য প্রয়োজনীয় for

একই জিনিসটি অ-নির্মাণকারী যেমন ফাংশনগুলির জন্য যায়:

// My Module
exports.someFunction = function someFunction(msg) {
  console.log(msg);
}

// In another module
var MyModule = require("./my_module.js");
MyModule.someFunction("foobar"); // => "foobar"

2
আমি কি সংক্ষেপে ('./ my-object.js') ("foobar") প্রয়োজন? অথবা কোনও আলাদা ব্যবহারের ক্ষেত্রে প্রয়োজনীয় ('মডিউল') (প্যারাম) সিনট্যাক্স রয়েছে?
হাম্পাস আহলগ্রেন

1
আপনাকে কিছুতেই থামছে না, এটি কেবল জাভাস্ক্রিপ্ট। হ্যাঁ আপনি সংক্ষিপ্ত বাক্য গঠন ব্যবহার করতে পারেন।
সুকিমা

3
মডিউলটি কীভাবে সংজ্ঞায়িত করা যায় তার সিউডো কোড উদাহরণটি নোড.জেএস মডিউল সিস্টেম সম্পর্কে আমার বোঝার সম্পূর্ণ পরিস্কার করেছে। ধন্যবাদ!
নিতাক্স

130

আমার মতে, নোড.জেএস এর কয়েকটি উদাহরণ বেশ স্বীকৃত।

আপনি বাস্তব বিশ্বে এরকম আরও কিছু দেখার আশা করতে পারেন

// square.js
function Square(width) {

  if (!(this instanceof Square)) {
    return new Square(width);
  }

  this.width = width;
};

Square.prototype.area = function area() {
  return Math.pow(this.width, 2);
};

module.exports = Square;

ব্যবহার

var Square = require("./square");

// you can use `new` keyword
var s = new Square(5);
s.area(); // 25

// or you can skip it!
var s2 = Square(10);
s2.area(); // 100

ES6 জনগণের জন্য

class Square {
  constructor(width) {
    this.width = width;
  }
  area() {
    return Math.pow(this.width, 2);
  }
}

export default Square;

এটি ES6 এ ব্যবহার করা

import Square from "./square";
// ...

কোনও ক্লাস ব্যবহার করার সময়, আপনাকে অবশ্যইnew এটি ইনস্টিটিউট করার জন্য কীওয়ার্ডটি ব্যবহার করতে হবে। বাকি সব একই থাকে।


3
অস্বাভাবিক সংক্ষিপ্ত কাঠামো!
ক্রিস্টোফ মারোইস

1
সুতরাং এটি আপনার <ES6 উদাহরণে মনে হচ্ছে এটি ব্যবহার newএবং না ব্যবহারের মধ্যে কোনও পার্থক্য নেই । তবে, কেবল এটির কারণেই আপনার সেই চেক আছে this instanceof square? যদি তা হয় তবে সেই প্রক্রিয়াটি ঠিক কী করছে?
আরিচার্ডস

1
আমি যে প্রশ্নগুলি দেখেছিলাম এবং সন্ধান করেছি, যদি তা অন্যদের জন্য সহায়ক হয়: কোথায় importএবং exportসংজ্ঞায়িত হয়? এগুলি ECMAScript 6 (ES6) এর সংরক্ষিত কীওয়ার্ডগুলি। ES6 এর পূর্বে মডিউলগুলি পরিচালনা করতে একজনকে লাইব্রেরি ব্যবহার করতে হয়েছিল। কমনজেএস লাইব্রেরির মডিউলগুলির পরে নোডের মডিউলিং মডেল করা হয়েছে। কি defaultমধ্যে export default Square? এটি যখন কেবল 'ফাইল' আমদানি করে তখন কী ফাইল আমদানি করতে হয় তা নির্দিষ্ট করে that : যতদিন তাদের অস্তিত্ব, আমি এই পৃষ্ঠাগুলি সহায়ক বলে চিহ্নিত করেছেন জন্য spring.io/understanding/javascript-modules এবং exploringjs.com/es6/ch_modules.html
arichards

1

এই প্রশ্নটি কীভাবে require()কাজ করে তার সাথে আসলে কোনও সম্পর্ক নেই । মূলত, module.exportsআপনি আপনার মডিউলে যা সেট করেছেন তার require()কল থেকে তা ফিরে আসবে ।

এটি সমান হবে:

var square = function(width) {
  return {
    area: function() {
      return width * width;
    }
  };
}

newকল করার সময় কীওয়ার্ডের দরকার নেই square। আপনি নিজে থেকে ফাংশন উদাহরণটি ফিরিয়ে দিচ্ছেন না square, আপনি শেষে একটি নতুন অবজেক্ট ফিরিয়ে দিচ্ছেন। অতএব, আপনি কেবল এই ফাংশনটি সরাসরি কল করতে পারেন।

চারপাশে আরও জটিল যুক্তিগুলির জন্য, এটি দেখুন new: জাভাস্ক্রিপ্টের "নতুন" কীওয়ার্ডটি ক্ষতিকারক হিসাবে বিবেচিত?


3
নতুন কীওয়ার্ডটি ব্যবহার করে কোনও ভুল নেই। আমি এর চারপাশের সমস্ত এফইউডি ঘৃণা করি।
সুকিমা

1
@ সুকিমা রাজি। :-D আমি উল্লেখ করছি যে কেন এটি এক্ষেত্রে গুরুত্বপূর্ণ নয় এবং অন্য প্রশ্নটির সাথে লিঙ্ক newকরেছিলাম যাতে অন্যরাও সেখানে যুদ্ধে অংশ নিতে পারে।
ব্র্যাড

0

উদাহরণ কোডটি হ'ল:

মূলত

square(width,function (data)
{
   console.log(data.squareVal);
});

নিম্নলিখিত ব্যবহার করে কাজ করতে পারে

exports.square = function(width,callback)
{
     var aa = new Object();
     callback(aa.squareVal = width * width);    
}

0

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

উদাহরণস্বরূপ আমরা ওয়েব ব্রাউজারের পরিবেশে জেএস ব্যবহার করে তৈরি করেছিলাম এমনভাবে আপনি একটি নতুন ফাংশন তৈরি করছেন।

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

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