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
.