Comment exporter une classe ES6 correctement dans le nœud 4?

Je définis une classe dans un module:

"use strict";

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

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

module.export.AspectType = AspectType;

, Mais je reçois le message d'erreur suivant:

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

Comment dois-je exporter cette classe et l'utiliser dans un autre module? J'ai vu d'autres questions SO, mais je reçois d'autres messages d'erreur lorsque j'essaie d'implémenter leurs solutions.

57
demandé sur Bergi 2015-09-18 20:08:24

9 réponses

Si vous utilisez ES6 dans le nœud 4, vous ne pouvez pas utiliser la syntaxe du module ES6 sans transpiler, mais les modules CommonJS (modules standard du nœud) fonctionnent de la même manière.

module.export.AspectType

Devrait être

module.exports.AspectType

D'où le message d'erreur "Impossible de définir la propriété 'AspectType' de undefined " car module.export === undefined.

Aussi, pour

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

Pouvez-vous simplement écrire

class AspectType {
    // ...    
}

Et obtenir essentiellement le même comportement.

79
répondu loganfsmyth 2015-09-18 17:40:04
// 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();
68
répondu sitrakay 2017-02-24 07:24:56

expression de classe peut être utilisé pour la simplicité.

 // 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);
11
répondu masakielastic 2015-12-07 09:13:18

Utiliser

// aspect-type.js
class AspectType {

}

export default AspectType;

Puis pour l'importer

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

Lire http://babeljs.io/docs/learn-es2015/#modules pour plus de détails

10
répondu user633183 2015-09-18 17:21:04

Avec ECMAScript 2015, vous pouvez exporter et importer plusieurs classes comme ceci

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

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

module.exports = {
    Person,
    Animal
};

Alors où vous les utilisez:

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

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

En cas de collisions de noms, ou si vous préférez d'autres noms, Vous pouvez les renommer comme ceci:

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

const animal = new OtherAnimal();
const person = new OtherPerson();
10
répondu Jonas Brandel 2018-03-02 20:50:43

Plusieurs des autres réponses se rapprochent, mais honnêtement, je pense que vous feriez mieux d'aller avec la syntaxe la plus propre et la plus simple. Le PO a demandé un moyen d'exporter une classe dans ES6 / ES2015. Je ne pense pas que vous pouvez obtenir beaucoup plus propre que ceci:

'use strict';

export default class ClassName {
  constructor () {
  }
}
8
répondu Crates 2017-01-25 18:11:34

Je l'écris simplement de cette façon

Dans le fichier AspectType:

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

Et importez-le comme ceci:

const AspectType = require('./AspectType');
var aspectType = new AspectType;
2
répondu Behnam Ghiaseddin 2017-10-14 09:21:32

J'ai eu le même problème. Ce que j'ai trouvé, j'ai appelé ma réception de l'objet le même nom que le nom de la classe. exemple:

const AspectType = new AspectType();

Cette visser les choses de cette façon... j'espère que cela aide

0
répondu shahar taite 2016-09-21 12:50:17

Parfois, j'ai besoin de déclarer plusieurs classes dans un fichier, ou je veux exporter des classes de base et garder leurs noms exportés parce que mon éditeur JetBrains comprend mieux cela. Je viens d'utiliser

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

Et ailleurs:

require('baseclasses.js');
class MySubclass extends MyClass() { ... }
-1
répondu Jelmer Jellema 2017-05-15 14:09:55