Hoe exporteer je een ES6-klasse op de juiste manier in Node 4?

Ik heb een klasse in een module gedefinieerd:

"use strict";
var AspectTypeModule = function() {};
module.exports = AspectTypeModule;
var AspectType = class AspectType {
    // ...    
};
module.export.AspectType = AspectType;

Maar ik krijg de volgende foutmelding:

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

Hoe moet ik deze klasse exporteren en in een andere module gebruiken? Ik heb andere SO-vragen gezien, maar ik krijg andere foutmeldingen wanneer ik hun oplossingen probeer te implementeren.


Antwoord 1, autoriteit 100%

Als je ES6 gebruikt in Node 4, kun je de syntaxis van de ES6-module niet gebruiken zonder een transpiler, maar CommonJS-modules (de standaardmodules van Node) werken hetzelfde.

module.export.AspectType

zou moeten zijn

module.exports.AspectType

vandaar de foutmelding “Kan eigenschap ‘AspectType’ van undefined niet instellen” omdat module.export === undefined.

Ook voor

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

kun je gewoon schrijven

class AspectType {
    // ...    
}

en krijg in wezen hetzelfde gedrag.


Antwoord 2, autoriteit 96%

// 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();

Antwoord 3, autoriteit 43%

Met ECMAScript 2015 kunt u op deze manier meerdere klassen exporteren en importeren

class Person
{
    constructor()
    {
        this.type = "Person";
    }
}
class Animal{
    constructor()
    {
        this.type = "Animal";
    }
}
module.exports = {
    Person,
    Animal
};

dan waar je ze gebruikt:

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

In het geval van botsingen tussen namen, of u geeft de voorkeur aan andere namen, kunt u deze als volgt hernoemen:

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

Antwoord 4, autoriteit 14%

Gebruik

// aspect-type.js
class AspectType {
}
export default AspectType;

Om het vervolgens te importeren

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

Lees http://babeljs.io/docs/learn-es2015/#modulesVoor meer informatie


Antwoord 5, Autoriteit 11%

Ik schrijf het gewoon op deze manier

In het aspectype-bestand:

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

en importeer het als volgt:

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

Antwoord 6, Autoriteit 10%

klassexpressie kan voor eenvoud worden gebruikt.

// 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);

Antwoord 7, Autoriteit 9%

Verschillende van de andere antwoorden komen dichtbij, maar eerlijk, ik denk dat je beter af bent met de schoonste, eenvoudigste syntaxis. Het OP heeft een middel aan het exporteren van een klasse in ES6 / ES2015. Ik denk niet dat je veel schoner kunt krijgen dan dit:

'use strict';
export default class ClassName {
  constructor () {
  }
}

Antwoord 8

Ik had hetzelfde probleem.
Wat ik vond was dat ik mijn ontvangende object dezelfde naam noemde als de klassenaam. voorbeeld:

const AspectType = new AspectType();

dit heeft de boel zo verpest…
hoop dat dit helpt


Antwoord 9

Soms moet ik meerdere klassen in één bestand declareren, of ik wil basisklassen exporteren en hun namen geëxporteerd houden omdat mijn JetBrains-editor dat beter begrijpt. ik gebruik gewoon

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

En ergens anders:

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

Other episodes