web-dev-qa-db-fra.com

Comment exporter correctement une classe ES6 dans Node 4?

J'ai défini 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 SO questions, mais j'obtiens d'autres messages d'erreur lorsque j'essaie de mettre en œuvre leurs solutions.

87
Jérôme Verstrynge

Si vous utilisez ES6 dans Node 4, vous ne pouvez pas utiliser la syntaxe de module ES6 sans transpiler, mais les modules CommonJS (modules standard de Node) 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 non définie" car module.export === undefined.

Aussi pour

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

pouvez-vous simplement écrire

class AspectType {
    // ...    
}

et obtenez essentiellement le même comportement.

101
loganfsmyth
// 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();
99
sitrakay

Avec ECMAScript 2015, vous pouvez exporter et importer plusieurs classes comme celle-ci.

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 collision de noms, ou si vous préférez d’autres noms, vous pouvez les renommer comme suit:

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

const animal = new OtherAnimal();
const person = new OtherPerson();
31
Jonas Brandel

Utilisation

// aspect-type.js
class AspectType {

}

export default AspectType;

Puis l'importer

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

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

14
user633183

expression de classe peut être utilisé pour des raisons de 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);
12
masakielastic

Plusieurs autres réponses se rapprochent, mais honnêtement, je pense que vous feriez mieux d'utiliser la syntaxe la plus simple et la plus nette. Le PO a demandé un moyen d’exporter une classe dans ES6/ES2015. Je ne pense pas que vous puissiez être beaucoup plus propre que cela:

'use strict';

export default class ClassName {
  constructor () {
  }
}
8
Crates

Je l'écris simplement de cette façon

dans le fichier AspectType:

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

et l'importez comme ceci:

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

J'ai eu le même problème. Ce que j’ai trouvé c’est que j’ai appelé mon objet receveur le même nom que le nom de la classe. exemple:

const AspectType = new AspectType();

ce foutu les choses de cette façon ... espérons que cela aide

0
shahar taite