Der Standardexportwert () in Babel 6.x kann nicht benötigt werden

85

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.jsfehlerfrei 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?

XGHeaven
quelle
Hast du eine .babelrc? Geben Sie irgendwo Babel-Optionen an? Ich frage, weil Babel 6 standardmäßig nichts transpiliert und Sie die es2015Voreinstellung in dem von Ihnen geposteten Code nicht angeben.
Igor Raush
@IgorRaush Ich habe wirklich ein .babelrc, das andere es6-Skript läuft normal
XGHeaven
Bitte lesen Sie die Tag-Beschreibungen. babelist für Fragen für eine Python-Bibliothek mit diesem Namen.
Felix Kling
Exportieren Sie einfach keine Funktion aus app.js, sondern führen Sie sie sofort aus
Bergi
@ FelixKling sorry, ich kenne den gleichen Namen auch nicht in Python ...
XGHeaven

Antworten:

156

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 zugewiesen module.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 nicht require-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 kann

import 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. Zu requirediesem Modul müssen Sie tun

require('./app').default();
Igor Raush
quelle
19
Für mich hat require('./app').default;gearbeitet. default()zurückgekehrtundefined
thinklinux
14
@thinklinux require(...).defaultgibt einen Verweis auf die exportierte Funktion. default()nennt es. Wenn Ihre Funktion nichts zurückgibt (oder leer ist), ist das Ergebnis natürlich undefined.
Igor Raush
10
require('path').default()funktioniert nicht, require('path').defaultfunktioniert für mich
Soulmachine
2
Sie sollten verwenden, require('./app').default;wenn Sie ein Objekt anstelle einer Funktion exportieren.
Tokenyet
7

Nur um die richtige Antwort oben zu finden.

Wenn Sie das Standardexportverhalten von babel@5verwenden möchten , können Sie das Plugin babel-plugin-add-module-exports ausprobieren .

Es funktioniert ziemlich gut für mich.

Haotang
quelle
2

Wenn das nicht funktioniert

require('./app').default()

verwenden

require('./app').default

Ohne den Funktionsaufruf am Ende.

Ska
quelle
Wie Igor im obigen Kommentar ( stackoverflow.com/questions/33704714/… ) sagt, ruft das erste Ihrer Beispiele die Funktion auf, während das zweite eine Referenz gibt
Stefano