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?


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();

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


2

Wenn das nicht funktioniert

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

verwenden

require('./app').default

Ohne den Funktionsaufruf am Ende.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.