Care este diferența între Nod's module.exporturile și ES6's
export default? Am'm încercat să-mi dau seama de ce nu obține "__ nu este un constructor" eroare cand incerc sa export default
în Node.js 6.2.2.
'use strict'
class SlimShady {
constructor(options) {
this._options = options
}
sayName() {
return 'My name is Slim Shady.'
}
}
// This works
module.exports = SlimShady
'use strict'
class SlimShady {
constructor(options) {
this._options = options
}
sayName() {
return 'My name is Slim Shady.'
}
}
// This will cause the "SlimShady is not a constructor" error
// if in another file I try `let marshall = new SlimShady()`
export default SlimShady
Problema este cu
La momentul de scris acest lucru, nu mediu sprijină ES6 module nativ. Atunci când le folosesc în Node.js trebuie să utilizați ceva de genul Babel pentru a converti module pentru a CommonJS. Dar cum se întâmplă asta?
Mulți oameni consideră module.exporturile = ... să fie echivalent la export default ... " și " exporturile.foo ... să fie echivalent la export const foo = ...
. Ca's nu destul de adevărat, deși, sau cel puțin nu cum Babel nu.
ES6 "default" exporturile sunt, de fapt, de asemenea, nume exporturilor, cu excepția faptului că "default" este un "rezervate" numele și există o sintaxă specială pentru ea. Vă permite să aibă o privire cât de Babel compilează numit și implicit a exporturilor:
// input
export const foo = 42;
export default 21;
// output
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var foo = exports.foo = 42;
exports.default = 21;
Aici putem vedea că implicit de export devine o proprietate pe "exporturi" de obiect, la fel ca "foo".
Putem importa modulul în două moduri: Fie folosind CommonJS sau folosind ES6 "import" de sintaxă.
Problema: eu cred că faci ceva de genul:
var bar = require('./input');
new bar();
mă așteptam la asta " bar " este atribuit valoarea default de export. Dar după cum putem vedea în exemplul de mai sus, default export este atribuit "default" proprietate!
Deci, în scopul de a accesa default export de fapt avem de-a face
var bar = require('./input').default;
Dacă vom folosi ES6 modul de sintaxă, și anume
import bar from './input';
console.log(bar);
Babel se va transforma pentru a
'use strict';
var _input = require('./input');
var _input2 = _interopRequireDefault(_input);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
console.log(_input2.default);
Puteți vedea că fiecare acces la " bar " este convertit la acces .default
.
tl;dr, chiar acum, pentru ca aceasta să funcționeze, fișierul care este solicitat sau importatoare SlimShady
trebuie să fi compilat folosind Babel cu 'utilizarea strict'
.
Am'm folosind babel-cli
6.18.0 în proiect în cazul în care inițial am intampinat aceasta eroare.
var SlimShady = require('./slim-shady');
var marshall = new SlimShady(); // uh, oh...
'use strict'
import SlimShady from './slim-shady'
var marshall = new SlimShady() // all good in the hood