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


317

নোড module.exportsএবং ইএস 6 এর মধ্যে পার্থক্য কী export default? আমি export defaultনোড.জেএস 6.২.২ এ চেষ্টা করার পরে কেন আমি "__ কন্সট্রাক্টর নয়" ত্রুটি পেয়েছি তা জানার চেষ্টা করছি ।

কি কাজ

'use strict'
class SlimShady {
  constructor(options) {
    this._options = options
  }

  sayName() {
    return 'My name is Slim Shady.'
  }
}

// This works
module.exports = SlimShady

কি কাজ করে না

'use strict'
class SlimShady {
  constructor(options) {
    this._options = options
  }

  sayName() {
    return 'My name is Slim Shady.'
  }
}

// This will cause the "SlimShady is not a constructor" error
// if in another file I try `let marshall = new SlimShady()`
export default SlimShady

উত্তর:


401

বিষয়টি নিয়েই রয়েছে

  • কীভাবে ES6 মডিউলগুলি কমনজেএসে অনুকরণ করা হয়
  • আপনি মডিউলটি কীভাবে আমদানি করবেন

ES6 থেকে কমনজেএস

এটি লেখার সময় কোনও পরিবেশ স্থানীয়ভাবে ES6 মডিউল সমর্থন করে না। নোড.জেজে এগুলি ব্যবহার করার সময় মডিউলগুলি কমনজেএসে রূপান্তর করতে আপনাকে বাবেলের মতো কিছু ব্যবহার করতে হবে। তবে কীভাবে তা ঘটে?

অনেকে module.exports = ...সমান export default ...এবং exports.foo ...সমতুল্য বলে মনে করেন export const foo = ...। এটি যদিও একেবারেই সত্য নয় বা বাবেল এটি কী করে তা অন্তত নয়।

ES6 defaultরফতানিগুলি আসলে "রক্ষিত" নাম বাদে রফতানিরও নামকরণ করাdefault হয় এবং এর জন্য বিশেষ সিনট্যাক্স সমর্থন রয়েছে। বাবেল নামের এবং ডিফল্ট রফতানিগুলি কীভাবে সংকলন করে তা একবার দেখে নেওয়া যাক:

// input
export const foo = 42;
export default 21;

// output
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
var foo = exports.foo = 42;
exports.default = 21; 

এখানে আমরা দেখতে পাচ্ছি যে ডিফল্ট রফতানিটি exportsঠিক যেমন বস্তুর একটি সম্পত্তি হয়ে যায় foo

মডিউলটি আমদানি করুন

আমরা মডিউলটি দুটি উপায়ে আমদানি করতে পারি: হয় প্রচলিত জেএস ব্যবহার করে বা ES6 importসিনট্যাক্স ব্যবহার করে ।

আপনার সমস্যা: আমি বিশ্বাস করি আপনি এমন কিছু করছেন:

var bar = require('./input');
new bar();

barএটি ডিফল্ট রফতানির জন্য নির্ধারিত মূল্য আশা করে । তবে আমরা উপরের উদাহরণে দেখতে পাচ্ছি, defaultসম্পত্তিটিতে ডিফল্ট রফতানি বরাদ্দ করা হয় !

সুতরাং ডিফল্ট রফতানি অ্যাক্সেস করতে আমাদের আসলে করতে হবে

var bar = require('./input').default;

যদি আমরা ES6 মডিউল সিনট্যাক্স ব্যবহার করি, যথা

import bar from './input';
console.log(bar);

বাবেল এটিকে রূপান্তর করবে

'use strict';

var _input = require('./input');

var _input2 = _interopRequireDefault(_input);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

console.log(_input2.default);

আপনি দেখতে পাচ্ছেন যে প্রতিটি অ্যাক্সেস অ্যাক্সেসে barরূপান্তরিত হয়েছে .default


আমাদের কি এর জন্য একটি নকল নেই?
বার্গি

3
@ বার্গি: আমি টিবিএইচ অনুসন্ধান করিনি (আমার জন্য লজ্জা :() the একই সমস্যাটি সম্পর্কে অবশ্যই প্রশ্ন রয়েছে, তবে অন্যভাবে জিজ্ঞাসা করা হয়েছে you আপনি যদি উপযুক্ত কিছু খুঁজে পান তবে আমাকে জানতে দিন!
ফেলিক্স ক্লিং ২

1
ঠিক আছে, এটিগুলি খুঁজে পেতে কিছুটা সময় নিয়েছে, তবে আপনি এখন আপনার নতুন অর্জিত ক্ষমতা ব্যবহার করতে পারেন এবং সাধারণ জেএস "প্রয়োজনীয়" এর সাথে সঠিকভাবে ES6 "রফতানি ডিফল্ট" কীভাবে ব্যবহার করবেন তার একটি বেছে নিতে পারেন? এবং দ্বিগুণ লক্ষ্য হিসাবে বাবেল x.x এর () ডিফল্ট রফতানি মূল্য প্রয়োজন হতে পারে না :-)
বার্গি ২

1
আমি এখন এটি করতে পারি যে
কৌতুকপূর্ণ

1
@ ডিজেকিয়ানুশ: নিজের জন্য দেখুন । এ অ্যাসাইনমেন্ট পর module.exports, exportsএবং module.exportsতাই নিয়োগ, বিভিন্ন মান exports.defaults(কারণ কোনো প্রভাব নেই module.exportsকি রপ্তানি পরার)। অন্য কথায়, এটি হুবহু একই রকম যদি আপনি কেবল করেন module.exports = { ... }
ফেলিক্স ক্লিং 21

1

এক্সপোর্ট ডিফল্ট এবং এক্সপোর্ট কনস্ট্রেশনাল ফু ব্যবহার করতে আপনাকে আপনার প্রকল্পে সঠিকভাবে কনফিগার করতে হবে

npm install --save-dev @babel/plugin-proposal-export-default-from

তারপরে .babelrc এ কনফিগারেশন নীচে যুক্ত করুন

"plugins": [ 
       "@babel/plugin-proposal-export-default-from"
      ]

1

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

module.exports = new DAO()
module.exports.initDAO = initDAO // append other functions a named export

// now you have
let DAO = require('_/helpers/DAO');
// DAO by default is exported class or function
DAO.initDAO()

-61

tl; dr এখনই এটি কাজ করার জন্য SlimShadyবাবেল ব্যবহার করে প্রয়োজনীয় ফাইল বা ফাইল আমদানি করতে হবে 'use strict'

আমি babel-cliসেই প্রকল্পে .1.১৮.০ ব্যবহার করছি যেখানে প্রথমদিকে আমি এই ত্রুটির মুখোমুখি হয়েছিলাম।

ব্যড 'use strict'নিউজ বিয়ার্স ছাড়া হয়

var SlimShady = require('./slim-shady');
var marshall = new SlimShady();  // uh, oh...

দয়া করে 'কঠোর ব্যবহার করুন'

'use strict'
import SlimShady from './slim-shady'
var marshall = new SlimShady()  // all good in the hood

13
এর কোন মানে নেই. importঘোষণাগুলি ব্যবহার করে এমন প্রতিটি উত্স একটি মডিউল এবং সেগুলি ইতিমধ্যে কঠোর। আসল পার্থক্য হ'ল বনাম আমদানি প্রয়োজন।
বার্গি

1
কী বোঝাতে পারে তার importপরিবর্তে requireএবং export defaultপরিবর্তে ব্যবহার করা হচ্ছে exports.default
কোরি অ্যালিক্স


104
এটি সর্বাধিক স্বল্প উত্তর হতে হবে যা আমি স্ট্যাকওভারফ্লোতে দেখেছি
জিমি

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