मॉड्यूल .exports बनाम निर्यात डिफ़ॉल्ट Node.js और ES6 में


317

Node's module.exportsऔर ES6 के बीच क्या अंतर है export default? जब मैं export defaultNode.js 6.2.2 में कोशिश करता हूं तो मुझे यह पता लगाने की कोशिश की जाती है कि मुझे "__ एक निर्माता नहीं है" त्रुटि क्यों है ।

क्या काम करता है

'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

मुद्दा साथ है

  • ईएस 6 मॉड्यूल कॉमनजस में कैसे उत्सर्जित होते हैं
  • आप मॉड्यूल को कैसे आयात करते हैं

कॉमन जेएस को ईएस 6

इसे लिखते समय, कोई भी वातावरण मूल रूप से ES6 मॉड्यूल का समर्थन नहीं करता है। Node.js में उनका उपयोग करते समय आपको मॉड्यूल को कॉमनजस में बदलने के लिए बैबेल जैसे कुछ का उपयोग करने की आवश्यकता होती है। लेकिन वास्तव में ऐसा कैसे होता है?

बहुत से लोग पर विचार 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

मॉड्यूल आयात करें

हम मॉड्यूल को दो तरीकों से आयात कर सकते हैं: या तो कॉमनजेस का उपयोग कर रहे हैं या ईएस 6 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
@Bergi: मैंने tbh (मुझ पर शर्म की बात नहीं खोजा :()। निश्चित रूप से एक ही समस्या के बारे में सवाल हैं, लेकिन एक अलग तरीके से पूछा गया है। मुझे बताएं कि क्या आपको कुछ लगता है जो फिट बैठता है!
फेलिक्स क्लिंग

1
ठीक है, इनको खोजने में कुछ समय लगा, लेकिन अब आप अपनी नई अधिग्रहीत शक्तियों का उपयोग कर सकते हैं और एक का चयन कर सकते हैं कि कॉमनजस के लिए "आवश्यक" ईएस 6 "निर्यात डिफ़ॉल्ट" का सही उपयोग कैसे करें? और आवश्यकता नहीं हो सकती () बेबल में डिफ़ॉल्ट निर्यात मूल्य 6.x एक ठग लक्ष्य के रूप में :-)
बर्गी

1
कितनी विडंबना है कि अब मैं यह कर सकता हूं: डी
फेलिक्स क्लिंग

1
@djKianoosh: अपने लिए देखें । असाइनमेंट के बाद module.exports, exportsऔर module.exportsअलग-अलग मान हैं, इसलिए असाइनमेंट exports.defaultsका कोई प्रभाव नहीं है (क्योंकि module.exportsजो निर्यात किया जाता है)। दूसरे शब्दों में, यह बिल्कुल वैसा ही है जैसे कि आपने केवल किया module.exports = { ... }
फेलिक्स क्लिंग

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; इस काम के लिए अभी डॉ । के SlimShadyसाथ बाबेल का उपयोग करके आवश्यक फ़ाइल को संकलित या आयात किया जाना चाहिए 'use strict'

मैं babel-cliउस परियोजना में 6.18.0 का उपयोग कर रहा हूं जहां मुझे शुरू में इस त्रुटि का सामना करना पड़ा था।

बगैर '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
@ जिमी ऐसा इसलिए है क्योंकि यह पूरी साइट पर चौथा-सबसे-डाउन-डाउन जवाब है।
पिपरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.