Das Problem ist mit
- wie ES6-Module in CommonJS emuliert werden
- wie Sie das Modul importieren
ES6 zu CommonJS
Zum Zeitpunkt des Schreibens unterstützt keine Umgebung ES6-Module nativ. Wenn Sie sie in Node.js verwenden, müssen Sie etwas wie Babel verwenden, um die Module in CommonJS zu konvertieren. Aber wie genau passiert das?
Viele Menschen halten module.exports = ...
es für gleichwertig export default ...
und exports.foo ...
gleichwertig export const foo = ...
. Das ist allerdings nicht ganz richtig oder zumindest nicht so, wie Babel es macht.
ES6- default
Exporte werden eigentlich auch als Exporte bezeichnet, außer dass dies default
ein "reservierter" Name ist und es eine spezielle Syntaxunterstützung dafür gibt. Schauen wir uns an, wie Babel benannte und Standardexporte kompiliert:
// 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;
Hier können wir sehen, dass der Standardexport exports
genau wie eine Eigenschaft für das Objekt wird foo
.
Importieren Sie das Modul
Wir können das Modul auf zwei Arten importieren: Entweder mit CommonJS oder mit ES6- import
Syntax.
Ihr Problem: Ich glaube, Sie tun so etwas wie:
var bar = require('./input');
new bar();
erwartet, dass bar
der Wert des Standardexports zugewiesen wird. Wie wir im obigen Beispiel sehen können, wird der default
Eigenschaft der Standardexport zugewiesen !
Um auf den Standardexport zugreifen zu können, müssen wir dies tatsächlich tun
var bar = require('./input').default;
Wenn wir die ES6-Modulsyntax verwenden, nämlich
import bar from './input';
console.log(bar);
Babel wird es verwandeln
'use strict';
var _input = require('./input');
var _input2 = _interopRequireDefault(_input);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
console.log(_input2.default);
Sie können sehen, dass jeder Zugriff auf bar
in Zugriff konvertiert wird .default
.
module.exports
,exports
undmodule.exports
unterschiedliche Werte haben, so die Zuordnungexports.defaults
keine Wirkung hat (damodule.exports
ist das, was exportiert wird). Mit anderen Worten, es ist genau das gleiche, als ob Sie es nur getan hättenmodule.exports = { ... }
.Sie müssen babel in Ihrem Projekt korrekt konfigurieren, um export default und export const foo zu verwenden
Fügen Sie dann unten Konfigration in .babelrc hinzu
quelle
Felix Kling hat einen großartigen Vergleich dieser beiden durchgeführt, für alle, die sich fragen, wie ein Exportstandard neben benannten Exporten mit module.exports in nodejs ausgeführt werden soll
quelle
Damit dies funktioniert, muss die Datei, die benötigt oder importiert
SlimShady
wird, mit Babel mit kompiliert werden'use strict'
.Ich verwende
babel-cli
6.18.0 in dem Projekt, in dem dieser Fehler ursprünglich aufgetreten ist.Ohne
'use strict'
ist schlechte Nachrichten Bären"Verwenden Sie streng", bitte
quelle
import
Deklarationen verwendet , ist ein Modul, und diese sind bereits streng. Der eigentliche Unterschied besteht im Erfordernis gegenüber dem Importieren.import
anstelle vonrequire
undexport default
anstelle vonexports.default
.