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- defaultExporte werden eigentlich auch als Exporte bezeichnet, außer dass dies defaultein "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 exportsgenau 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- importSyntax.
Ihr Problem: Ich glaube, Sie tun so etwas wie:
var bar = require('./input');
new bar();
erwartet, dass barder Wert des Standardexports zugewiesen wird. Wie wir im obigen Beispiel sehen können, wird der defaultEigenschaft 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 barin Zugriff konvertiert wird .default.