नोड 4 में ईएस 6 वर्ग को ठीक से कैसे निर्यात करें?


115

मैंने एक मॉड्यूल में एक वर्ग को परिभाषित किया:

"use strict";

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

var AspectType = class AspectType {
    // ...    
};

module.export.AspectType = AspectType;

लेकिन मुझे निम्नलिखित त्रुटि संदेश मिलता है:

TypeError: Cannot set property 'AspectType' of undefined
    at Object.<anonymous> (...\AspectType.js:30:26)
    at Module._compile (module.js:434:26)
    ....

मुझे इस वर्ग को कैसे निर्यात करना चाहिए और किसी अन्य मॉड्यूल में इसका उपयोग करना चाहिए? मैंने अन्य SO प्रश्न देखे हैं, लेकिन मुझे अन्य त्रुटि संदेश मिलते हैं जब मैं उनके समाधान को लागू करने का प्रयास करता हूं।


2
ES6 में आपको 'use strict'किसी मॉड्यूल या वर्ग की आवश्यकता नहीं होती है; इसका डिफ़ॉल्ट व्यवहार है। संदर्भ। 10.2.1 सख्त मोड कोड
जेसन लीच

जवाबों:


117

यदि आप Node 4 में ES6 का उपयोग कर रहे हैं, तो आप transpiler के बिना ES6 मॉड्यूल सिंटैक्स का उपयोग नहीं कर सकते हैं, लेकिन CommonJS मॉड्यूल (नोड के मानक मॉड्यूल) समान काम करते हैं।

module.export.AspectType

होना चाहिए

module.exports.AspectType

इसलिए त्रुटि संदेश "अपरिभाषित की संपत्ति 'पहलू टाइप नहीं कर सकता" क्योंकि module.export === undefined

के लिए भी

var AspectType = class AspectType {
    // ...    
};

क्या आप सिर्फ लिख सकते हैं

class AspectType {
    // ...    
}

और अनिवार्य रूप से समान व्यवहार प्राप्त करें।


27
OMG के exportबजाय exports, मुझे यह कैसे याद आया?
जेरेम वर्स्ट्रीनेज

1
अंत में मैंने डाला module.exports = ClassNameऔर यह ठीक काम करता है
डेविड वेलबोर्न

113
// person.js
'use strict';

module.exports = class Person {
   constructor(firstName, lastName) {
       this.firstName = firstName;
       this.lastName = lastName;
   }

   display() {
       console.log(this.firstName + " " + this.lastName);
   }
}

 

// index.js
'use strict';

var Person = require('./person.js');

var someone = new Person("First name", "Last name");
someone.display();

2
@sitrakay आपको वास्तव में यह स्पष्टीकरण देना चाहिए कि यह प्रश्न कैसे ठीक करता है।
एलेक्सिस टायलर

यह त्रुटि देता है: अनकैप्ड टाइपर्रर: केवल 'ऑब्जेक्ट' के 'प्रॉपर्टी' को पढ़ने के लिए असाइन नहीं किया जा सकता '# <ऑब्जेक्ट>' यह कैसे होता है?
हेनन

मुझे लगता है कि निर्यात असाइनमेंट के अंदर पूरी कक्षा की परिभाषा एक विरोधी पैटर्न है जब अंत में एक ही लाइन को एक ही काम करना चाहिए।
user1944491

44

ECMAScript 2015 के साथ आप इस तरह कई वर्गों का निर्यात और आयात कर सकते हैं

class Person
{
    constructor()
    {
        this.type = "Person";
    }
}

class Animal{
    constructor()
    {
        this.type = "Animal";
    }
}

module.exports = {
    Person,
    Animal
};

फिर आप उनका उपयोग कहां करते हैं:

const { Animal, Person } = require("classes");

const animal = new Animal();
const person = new Person();

नाम टकराव के मामले में, या आप अन्य नामों को पसंद करते हैं जिन्हें आप इस तरह से उनका नाम बदल सकते हैं:

const { Animal : OtherAnimal, Person : OtherPerson} = require("./classes");

const animal = new OtherAnimal();
const person = new OtherPerson();

1
गलत। कारण: यदि आप नोड 4 में ईएस 6 का उपयोग कर रहे हैं, तो आप ट्रांसपॉयलर के बिना ईएस 6 मॉड्यूल सिंटैक्स का उपयोग नहीं कर सकते हैं, लेकिन कॉमनजेएस मॉड्यूल (नोड के मानक मॉड्यूल) काम करते हैं। (उपरोक्तानुसार)
एरोनएचएस

इसके अलावा, आपको एक ही फ़ाइल में दो वर्गों की घोषणा नहीं करनी चाहिए
ariel

जब तक निजी कक्षाएं निर्यात नहीं की जाती हैं, तब तक "निजी-समान" कक्षाएं (एकल सार्वजनिक वर्ग की सहायता) करना ठीक है। यह भी स्वीकार्य है अगर आपने अभी तक उन्हें दो फाइलों में वापस नहीं लिया है। ऐसा करते समय, अपने परीक्षणों को अलग-अलग फ़ाइलों में विभाजित करना न भूलें। या सिर्फ वही करें जो आपको अपनी स्थिति के लिए चाहिए।
TamusJRoyce

@AaronHS क्या सटीक अंतर है जिसका आप उल्लेख कर रहे हैं? यह "उपरोक्त" उत्तर में भी स्पष्ट नहीं है।
user1944491

16

उपयोग

// aspect-type.js
class AspectType {

}

export default AspectType;

फिर इसे आयात करने के लिए

// some-other-file.js
import AspectType from './aspect-type';

अधिक जानकारी के लिए http://babeljs.io/docs/learn-es2015/#modules पढ़ें


1
मुझे एक मिलता है SyntaxError: Unexpected reserved word, क्या आप एक पूर्ण कोड उदाहरण प्रदान कर सकते हैं?
जेरेमे वर्स्ट्रीनेज

9
निर्यात और आयात V8 में लागू नहीं किया गया है जो नोड उपयोग करता है। आपको फिर भी उपयोग करने की आवश्यकता होगीmodule.exports
इवान लुकास

2
... या ट्रांसपाइल (यानी कोलाहल), वास्तव में। NodeJS में सबसे अधिक ES6 विशेषताएं हैं .. ( / अभी भी सही है, मई 2017 को छोड़कर )। importexport
फ्रैंक नॉके

12

वर्ग अभिव्यक्ति का उपयोग सादगी के लिए किया जा सकता है।

 // Foo.js
'use strict';

// export default class Foo {}
module.exports = class Foo {}

-

// main.js
'use strict';

const Foo = require('./Foo.js');

let Bar = new class extends Foo {
  constructor() {
    super();
    this.name = 'bar';
  }
}

console.log(Bar.name);

4
बस एक चेतावनी, नोड में यह मॉड्यूल लोडिंग ऑर्डर के अधीन है। इसलिए इसके इस्तेमाल से सावधान रहें। यदि आप इन फ़ाइलों के नामों को स्विच करते हैं तो उदाहरण के आसपास काम नहीं करेगा।
डस्टिन

12

मैं बस इसे इस तरह से लिखता हूं

AspectType फ़ाइल में:

class AspectType {
  //blah blah
}
module.exports = AspectType;

और इसे इस तरह आयात करें:

const AspectType = require('./AspectType');
var aspectType = new AspectType;

10

अन्य जवाबों में से कई करीब आते हैं, लेकिन ईमानदारी से, मुझे लगता है कि आप सबसे अच्छे, सरलतम वाक्यविन्यास के साथ जा रहे हैं। ओपी ने ES6 / ES2015 में एक वर्ग के निर्यात के साधन का अनुरोध किया। मुझे नहीं लगता कि आप इससे ज्यादा क्लीनर पा सकते हैं:

'use strict';

export default class ClassName {
  constructor () {
  }
}

2
गलत। कारण: यदि आप नोड 4 में ईएस 6 का उपयोग कर रहे हैं, तो आप ट्रांसपॉयलर के बिना ईएस 6 मॉड्यूल सिंटैक्स का उपयोग नहीं कर सकते हैं, लेकिन कॉमनजेएस मॉड्यूल (नोड के मानक मॉड्यूल) काम करते हैं। (उपरोक्तानुसार)
एरॉनएचएस

3
कौन बिल्ली अभी भी नोड 4 का उपयोग कर रही है? मुझे लगता है कि यह 99% लोगों के लिए एक मान्य उत्तर है।
बक्से

यह शाब्दिक रूप से प्रश्न के शीर्षक में है।
एरोनएचएस

0

मुझे भी यही समस्या थी। मुझे जो मिला था, उसे मैंने अपनी रिजेक्टिंग ऑब्जेक्ट को उसी नाम से वर्ग नाम के रूप में कहा था। उदाहरण:

const AspectType = new AspectType();

इस तरह से यह खराब हो गया है ... उम्मीद है कि यह मदद करता है


0

कभी-कभी मुझे एक फ़ाइल में कई वर्गों की घोषणा करने की आवश्यकता होती है, या मैं बेस कक्षाओं को निर्यात करना चाहता हूं और अपने नामों को निर्यात करना चाहता हूं क्योंकि मेरे JetBrains संपादक बेहतर समझते हैं। मैं सिर्फ उपयोग करता हूं

global.MyClass = class MyClass { ... };

और कहीं और:

require('baseclasses.js');
class MySubclass extends MyClass() { ... }

1
यह ऐसा करने का एक बुरा तरीका है ... इसका परिणाम किसी न किसी दिन टकराव होगा
ब्रैड

हाँ अच्छी तरह से। स्वामित्व वाली परियोजनाओं में टकराव की कोई समस्या नहीं है। और यदि आप आवश्यकता / मॉड्यूल.exports के माध्यम से विशुद्ध रूप से आयात करते हैं, तो आप समस्या को मॉड्यूल-नामों में बदल रहे हैं।
जेलर जेलेमा

PHP को PHP में लिखने की कोशिश करना बंद करें: पी चुटकुले एक तरफ - जैसा कि बाकी सभी ने कहा है, यह सिर्फ रेखा के नीचे की समस्याओं के लिए खुद को स्थापित कर रहा है। ग्लोबल्स एक बहुत खराब हैं कोई बहुत अच्छा बहुत बुरा विचार नहीं है।
रॉबर्ट जुआन

1
वे उन लोगों के लिए हैं जो अपने स्वयं के कोड को ट्रैक करने में सक्षम नहीं हैं। मत भूलिए कि आवश्यकता में उपयोग किए गए फ़ाइल नाम भी ग्लोबल्स हैं। नो ग्लोबल्स हठधर्मिता की अपनी सीमाएं भी हैं।
जेलर जेलेमा

ठीक है, @TimHobbs, बच्चे जो कहते हैं .. सामान की तरह "वे सिर्फ अवधि, हैं।" यह वास्तविक तर्क के अभाव में आप लोगों से सुनने वाले तर्क हैं। तुम्हे पता हैं। यहां तक ​​कि NodeJs ग्लोबल्स का उपयोग करता है। जब आप अच्छी तरह से प्रलेखित ग्लोबल्स के साथ एक अच्छी तरह से परिभाषित रूपरेखा रखते हैं तो भी कोई समस्या नहीं है। यह सुनकर अच्छा लगा कि इस अध्ययन के सभी वर्षों के बाद, सह ने स्नातक की उपाधि प्राप्त की और 20 वर्षों तक अपने और अपने परिवार को खिलाया, यह सिर्फ "मैं वैसे भी क्या करना चाहता हूं"। मुझे तर्क दो या एक बच्चे की तरह काम करना बंद करो।
जेलेमर जेलेमा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.