2015-09-18 15 views
49

ho definire una classe in un modulo:Come esportare correttamente una classe ES6 nel nodo 4?

"use strict"; 

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

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

module.export.AspectType = AspectType; 

ma ricevo il seguente messaggio di errore:

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

Come dovrei esportare questa classe e utilizzarlo in un altro modulo? Ho visto altre domande su SO, ma ricevo altri messaggi di errore quando tento di implementare le loro soluzioni.

+0

In ES6 non è necessario '' utilizzare strict'' in un modulo o classe; è il comportamento predefinito. Ref. 10.2.1 Codice modalità rigida –

risposta

61

Se si utilizza ES6 a Nodo 4, non è possibile utilizzare la sintassi del modulo ES6 senza transpiler , ma i moduli CommonJS (i moduli standard del nodo) funzionano allo stesso modo.

module.export.AspectType 

dovrebbe essere

module.exports.AspectType 

da qui la "proprietà non è possibile impostare 'AspectType' di non definito" messaggio di errore perché module.export === undefined.

Inoltre, per

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

si può solo scrivere

class AspectType { 
    // ...  
} 

e ottenere sostanzialmente lo stesso comportamento.

+11

OMG 'export' invece di' exports', come mi sono perso? – JVerstry

+1

alla fine metto 'module.exports = ClassName' e funziona bene –

+0

grazie. questo funziona alla grande –

7

Usa

// aspect-type.js 
class AspectType { 

} 

export default AspectType; 

Poi, per importarlo

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

http://babeljs.io/docs/learn-es2015/#modules Leggi per maggiori dettagli

+1

Viene visualizzato un messaggio "Errore di sintassi: parola riservata inattesa", puoi fornire un esempio di codice completo? – JVerstry

+0

Questo è esattamente quello che ho fatto, ma ricevo comunque il messaggio di errore sopra .. – JVerstry

+0

Ho aperto un problema: https://github.com/nodejs/node/issues/2954 – JVerstry

9

class expression può essere utilizzato per semplicità.

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

Solo un avvertimento, in Nodo questo è soggetto all'ordine di caricamento del modulo. Quindi fai attenzione quando usi questo. Se cambi i nomi di questi file attorno all'esempio non funzionerebbe. – Dustin

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

Non funziona ... –

+0

@sitrakay dovresti davvero aggiungere una spiegazione di come questo risolve la domanda. –

0

Ho avuto lo stesso problema. Quello che ho trovato è stato chiamato il mio oggetto ricevente con lo stesso nome del nome della classe. Esempio:

const AspectType = new AspectType(); 

questa avvitato le cose in quel modo ... speranza che questo aiuta

9

Molte delle altre risposte si avvicinano, ma onestamente, penso che tu sia meglio andare con il più pulito, più semplice sintassi. Il PO ha richiesto un mezzo per esportare una classe in ES6/ES2015.Non credo che si può ottenere molto più pulito di questo:

'use strict'; 

export default class ClassName { 
    constructor() { 
    } 
} 
+0

non ha funzionato per me –

0

A volte ho bisogno di dichiarare più classi in un unico file, o io da esportare classi base e mantenere i loro nomi esportati a causa del mio editore capisce che JetBrains meglio. Mi basta usare

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

E da qualche altra parte:

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

Questo è un pessimo modo di fare questo ... sarà ** il risultato in una collisione un giorno. – Brad

+0

Pentiti dei tuoi peccati per salvare la tua anima coder! –

+0

Sì, bene. Nessun problema con collisioni in progetti di proprietà. E se si importano semplicemente le classi attraverso require/module.exports, si sta semplicemente spostando il problema sui nomi dei moduli. –

1

ho semplicemente scrivere in questo modo

nel file AspectType:

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

e importarlo in questo modo:

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

Con ECMAScript 2015 è possibile esportare e importare più classi come questo

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

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

module.exports = { 
    Person, 
    Animal 
}; 

allora dove li si usa:

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

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

In caso di conflitti tra i nomi, o se si preferisce altri nomi di loro è possibile rinominare In questo modo:

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

const animal = new OtherAnimal(); 
const person = new OtherPerson(); 
Problemi correlati