নোড 4 এ কীভাবে সঠিকভাবে একটি ES6 শ্রেণি রফতানি করতে হবে?


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)
    ....

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


2
ES6 এ আপনার 'use strict'কোনও মডিউল বা শ্রেণিতে প্রয়োজন নেই; এটির ডিফল্ট আচরণ। সূত্র। 10.2.1 কঠোর মোড কোড
জেসন লিচ

উত্তর:


117

যদি আপনি নোড 4 এ ES6 ব্যবহার করে থাকেন তবে আপনি ট্রান্সপ্লেলার ছাড়া ইএস 6 মডিউল সিনট্যাক্স ব্যবহার করতে পারবেন না, তবে কমনজেএস মডিউলগুলি (নোডের মানক মডিউল) একই কাজ করে।

module.export.AspectType

হতে হবে

module.exports.AspectType

অতএব ত্রুটি বার্তা "সম্পত্তি অপরিজ্ঞাত 'AspectType' সেট করতে পারে না" কারণ module.export === undefined

এছাড়াও, জন্য

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

আপনি কি শুধু লিখতে পারেন

class AspectType {
    // ...    
}

এবং মূলত একই আচরণ পান।


27
ওএমজি এর 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
@ চিত্রকায় আপনাকে কীভাবে এটি সমস্যার সমাধান করে তার একটি ব্যাখ্যা যুক্ত করা উচিত।
অ্যালেক্সিস টাইলার

এটি ত্রুটিটি দেয়: আনকচড টাইপ এরিয়ার: কেবলমাত্র বস্তুর 'রফতানি' পড়ার জন্য বরাদ্দ করা যায় না '# <অবজেক্ট>' কীভাবে এটিকে এতটা আপভোট করা হয়?
হেনন

আমি মনে করি রফতানি বরাদ্দকরণের ভিতরে একটি সম্পূর্ণ শ্রেণীর সংজ্ঞা স্থাপন করা একটি বিরোধী প্যাটার্ন হয় যখন শেষে কোনও এক লাইনের একই জিনিস করা উচিত।
ব্যবহারকারী 1944491

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 মডিউল সিনট্যাক্স ব্যবহার করতে পারবেন না, তবে কমনজেএস মডিউলগুলি (নোডের মানক মডিউলগুলি) একই কাজ করে। (উপরের হিসাবে)
આરોোন এইচএস

এছাড়াও আপনার একই ফাইলটিতে দুটি ক্লাস ঘোষণা করা উচিত নয়
এরিয়েল

যতক্ষণ ব্যক্তিগত ক্লাস রফতানি না করা হয় ততক্ষণ "ব্যক্তিগত-জাতীয়" শ্রেণিগুলি (যা একক পাবলিক ক্লাসকে সহায়তা করে) একই ফাইলে থাকতে পারে। আপনি যদি এখনও দুটি ফাইলে এগুলি রিফেক্টর না করেন তবে এটি গ্রহণযোগ্যও। এটি করার সময়, আপনার পরীক্ষাগুলিও আলাদা আলাদা ফাইলগুলিতে বিভক্ত করতে ভুলবেন না। অথবা আপনার পরিস্থিতির জন্য আপনার যা প্রয়োজন তা কেবল করুন।
তমুসজেরোয়েস

@ অ্যারোনএইচএস আপনি উল্লেখ করছেন ঠিক পার্থক্য কি? এটি "উপরের" উত্তরেও পরিষ্কার নয়।
ব্যবহারকারী 1944491

16

ব্যবহার

// aspect-type.js
class AspectType {

}

export default AspectType;

তারপরে এটি আমদানি করতে

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

আরও তথ্যের জন্য http://babeljs.io/docs/learn-es2015/# মডুলগুলি পড়ুন


1
আমি একটি পেয়েছি SyntaxError: Unexpected reserved word, আপনি একটি সম্পূর্ণ কোড উদাহরণ প্রদান করতে পারেন?
জেরুমে ভার্সট্রিঞ্জ

9
নোড ব্যবহার করে এমন ভি 8 তে রফতানি এবং আমদানি কার্যকর করা হয়নি। আপনার এখনও ব্যবহার করতে হবেmodule.exports
ইভান লুকাস

2
... বা ট্রাইপাইল (অর্থাত্ বাবেল), সত্যিই। নোডজেএসের সর্বাধিক ES6 বৈশিষ্ট্য রয়েছে .. বাদে import / export(এখনও সত্য, মে 2017) রয়েছে।
ফ্রাঙ্ক নোক্কে

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

অন্যান্য বেশ কয়েকটি উত্তর নিকটে আসে তবে সত্য বলে আমি মনে করি আপনি সবচেয়ে পরিষ্কার, সহজ বাক্য গঠন নিয়ে যাওয়াই ভাল better ওপি ES6 / ES2015 এ কোনও শ্রেণি রফতানির মাধ্যমের অনুরোধ করেছে। আমি মনে করি না এর চেয়ে আপনি আরও পরিষ্কার পেতে পারেন:

'use strict';

export default class ClassName {
  constructor () {
  }
}

2
ভুল। কারণ: আপনি নোড 4 এ ইএস 6 ব্যবহার করছেন, আপনি ট্রান্সপ্লার ছাড়া ইএস 6 মডিউল সিনট্যাক্স ব্যবহার করতে পারবেন না, তবে কমনজেএস মডিউলগুলি (নোডের মানক মডিউলগুলি) একই কাজ করে। (উপরের হিসাবে)
આરોোন এইচএস

3
হ্যাক এখনও নোড 4 ব্যবহার করছে? আমি মনে করি এটি 99% লোকের জন্য একটি বৈধ উত্তর।
ক্রেটস

এটি আক্ষরিক অর্থেই প্রশ্নের শিরোনামে।
হারুন এইচএস

0

আমারও একই সমস্যা ছিল। আমি যা পেয়েছি তাকে আমার পুনরুদ্ধারকারী বস্তুটি শ্রেণীর নাম হিসাবে একই নাম বলা হয়েছিল। উদাহরণ:

const AspectType = new AspectType();

এই বিভ্রান্ত জিনিসগুলি এইভাবে ... আশা করি এটি সাহায্য করবে


0

কখনও কখনও আমাকে একটি ফাইলে একাধিক ক্লাস ঘোষণা করতে হয়, বা আমার বেসব্ল্যাস সম্পাদক এটিকে আরও ভাল বোঝার কারণে আমি বেস ক্লাসগুলি রফতানি করতে এবং তাদের নাম রফতানি রাখতে চাই। আমি শুধু ব্যবহার

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

এবং অন্য কোথাও:

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

1
এটি একটি খারাপ পথ এই কাজ করতে ... এটি হবে একদিন একটি সংঘর্ষের স্থাপিত।
ব্র্যাড

হ্যাঁ ভাল। মালিকানাধীন প্রকল্পগুলিতে সংঘর্ষের সমস্যা নেই। এবং যদি আপনি প্রয়োজনীয় / মডিউল.এক্সপোর্টগুলির মাধ্যমে খাঁটিভাবে আমদানি করেন তবে আপনি সমস্যাটিকে কেবল মডিউল-নামগুলিতে স্থানান্তর করছেন।
জেলমার জেল্লেমা

জাভাস্ক্রিপ্টে পিএইচপি লেখার চেষ্টা বন্ধ করুন: পি জোকস একপাশে - অন্য প্রত্যেকে যেমন বলেছেন, এটি কেবল নিজেকে সমস্যা সমাধানের জন্য লাইনে রেখে দিচ্ছে। গ্লোবাল একটি খুব খারাপ খুব ভাল খুব খারাপ ধারণা।
রবার্টমেইন

1
তারা নিজের কোড ট্র্যাক করতে না পারার জন্য। প্রয়োজনীয় ব্যবহৃত ফাইলের নামগুলিও গ্লোবালগুলি ভুলে যাবেন না। নো-গ্লোবাল ডগমা এর সীমাবদ্ধতাও রয়েছে।
জেলমার জেল্লেমা

ওয়েল, @ টিমহবস, বাচ্চারা যে জিনিসগুলি বলেছে .. স্টাফ "তারা কেবলমাত্র, পিরিয়ড"। প্রকৃত যুক্তির অভাবে আপনি লোকদের কাছ থেকে ঠিক এ জাতীয় যুক্তি শুনেন। তুমি জান. এমনকি নোডজেগুলি গ্লোবাল ব্যবহার করে। এমনকি যখন আপনার ডকুমেন্টেড গ্লোবালগুলি সহ একটি সুসংজ্ঞাত কাঠামো থাকবে তখনও কোনও সমস্যা নেই। শুনে খুব ভাল লাগল যে এত বছর পড়াশুনার পরে, কম লাউড গ্র্যাজুয়েশন এবং 20 বছর ধরে নিজেকে এবং আমার পরিবারকে খাওয়ানো, এটি কেবল "যাই হোক আমি কী করতে চাই"। আমাকে যুক্তি দিন বা একটি বাচ্চার মতো অভিনয় করা বন্ধ করুন।
জেলমার জেল্লেমা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.