如何在Node 4中正确导出ES6类?

时间:2015-09-18 17:08:24

标签: javascript node.js module export

我在模块中定义了一个类:

"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问题,但是当我尝试实现他们的解决方案时,我收到了其他错误消息。

8 个答案:

答案 0 :(得分:95)

如果您在节点4中使用ES6,则在没有转换器的情况下不能使用ES6模块语法,但CommonJS模块(节点的标准模块)的工作方式相同。

myConstants.constant1

应该是

module.export.AspectType

因此错误消息&#34;无法设置属性&#39; AspectType&#39;未定义&#34;因为module.exports.AspectType

另外,

module.export === undefined
你可以写

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

并获得基本相同的行为。

答案 1 :(得分:92)

// 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 :(得分:28)

使用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();

答案 3 :(得分:11)

class expression 可以用来简化。

 // 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 :(得分:8)

其他几个答案接近,但老实说,我认为你最好采用最干净,最简单的语法。 OP要求在ES6 / ES2015中输出一个类。我认为你不能比这更清洁:

'use strict';

export default class ClassName {
  constructor () {
  }
}

答案 5 :(得分:8)

我只是这样写的

AspectType文件中的

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

并像这样导入:

<div class="jumbotron my-jumbotron">
    <img class="img-responsive" src=
    {{'https://static.pexels.com/photos/2232/vegetables-italian-pizza-
    restaurant.jpg'}}>
</div>

答案 6 :(得分:0)

我遇到了同样的问题。 我发现的是我称我的接收对象与类名同名。例如:

const AspectType = new AspectType();
这样搞砸了...... 希望这有帮助

答案 7 :(得分:-1)

有时我需要在一个文件中声明多个类,或者我想导出基类并保持其名称导出,因为我的JetBrains编辑器更了解它。我只是用

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

以及其他地方:

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