In Babel 5.x kann ich folgenden Code schreiben:
app.js.
export default function (){}
index.js
require('babel/register');
require('./app')();
Dann kann ich node index.js
fehlerfrei laufen . Verwenden Sie jedoch Babel 6.x, und führen Sie den folgenden Code aus
index.es6.js
require('babel-core/register');
require('./app')();
führt zu einem Fehler
require (...) ist keine Funktion
Ich möchte wissen warum?
javascript
ecmascript-6
babeljs
XGHeaven
quelle
quelle
.babelrc
? Geben Sie irgendwo Babel-Optionen an? Ich frage, weil Babel 6 standardmäßig nichts transpiliert und Sie diees2015
Voreinstellung in dem von Ihnen geposteten Code nicht angeben..babelrc
, das andere es6-Skript läuft normalbabel
ist für Fragen für eine Python-Bibliothek mit diesem Namen.app.js
, sondern führen Sie sie sofort ausAntworten:
TL; DR
Du musst benutzen
require('./app').default();
Erläuterung
Babel 5 hatte früher einen Kompatibilitäts-Hack für
export default
: Wenn ein Modul nur einen Export enthielt und es sich um einen Standardexport handelte, wurde es zugewiesenmodule.exports
. So zum Beispiel Ihr Modul app.js.export default function () {}
würde darauf übertragen werden
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = function () {}; module.exports = exports["default"];
Dies wurde nur aus Kompatibilitätsgründen mit
require
-ing Babel-transpiled Modulen durchgeführt (wie Sie es tun). Es war auch inkonsistent; Wenn ein Modul sowohl benannte als auch Standardexporte enthielt, konnte es nichtrequire
-d sein.In der Realität unterscheidet sich ein Standardexport gemäß der ES6-Modulspezifikation nicht von einem benannten Export mit dem Namen
default
. Es ist nur syntaktischer Zucker, der zur Kompilierungszeit statisch aufgelöst werden kannimport something from './app';
ist das gleiche wie das
import { default as something } from './app';
Abgesehen davon scheint Babel 6 beschlossen zu haben, den Interoperabilitäts-Hack beim Transpilieren von Modulen fallen zu lassen. Jetzt wird Ihr Modul app.js als transpiliert
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function () {};
Wie Sie sehen, keine Zuordnung mehr zu
module.exports
. Zurequire
diesem Modul müssen Sie tunrequire('./app').default();
quelle
require('./app').default;
gearbeitet.default()
zurückgekehrtundefined
require(...).default
gibt einen Verweis auf die exportierte Funktion.default()
nennt es. Wenn Ihre Funktion nichts zurückgibt (oder leer ist), ist das Ergebnis natürlichundefined
.require('path').default()
funktioniert nicht,require('path').default
funktioniert für michrequire('./app').default;
wenn Sie ein Objekt anstelle einer Funktion exportieren.Nur um die richtige Antwort oben zu finden.
Wenn Sie das Standardexportverhalten von
babel@5
verwenden möchten , können Sie das Plugin babel-plugin-add-module-exports ausprobieren .Es funktioniert ziemlich gut für mich.
quelle
Wenn das nicht funktioniert
require('./app').default()
verwenden
require('./app').default
Ohne den Funktionsaufruf am Ende.
quelle