W Babel 5.x mogę napisać następujący kod:
app.js
export default function (){}
index.js
require('babel/register');
require('./app')();
Wtedy mogę działać node index.js
bez błędów. Jednak używając Babel 6.x, uruchamiasz następujący kod
index.es6.js
require('babel-core/register');
require('./app')();
powoduje błąd
require (...) nie jest funkcją
Chcę wiedzieć dlaczego?
javascript
ecmascript-6
babeljs
XGHeaven
źródło
źródło
.babelrc
? Czy gdzieś określasz opcje Babel? Pytam, ponieważ Babel 6 domyślnie niczego nie transponuje i nie określasz ustawieniaes2015
wstępnego w opublikowanym kodzie..babelrc
, pozostałe skrypty es6 działają normalniebabel
dotyczy pytań do biblioteki Pythona o tej nazwie.app.js
, ale uruchom ją od razuOdpowiedzi:
TL; DR
Musisz użyć
require('./app').default();
Wyjaśnienie
Babel 5 miał kiedyś hack kompatybilności
export default
: jeśli moduł zawierał tylko jeden eksport i był to domyślny eksport, został przypisany domodule.exports
. Na przykład Twój moduł app.jsexport default function () {}
zostałby do tego przełożony
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = function () {}; module.exports = exports["default"];
Zrobiono to wyłącznie w celu zapewnienia zgodności z
require
modułami transpiled -ing Babel (tak jak robisz). Było to również niespójne; jeśli moduł zawierał zarówno nazwane, jak i domyślne eksporty, nie może to byćrequire
-d.W rzeczywistości, zgodnie ze specyfikacją modułu ES6, domyślny eksport nie różni się od nazwanego eksportu z nazwą
default
. Jest to po prostu cukier syntaktyczny, który można rozwiązać statycznie w czasie kompilacji, więc toimport something from './app';
jest taki sam jak ten
import { default as something } from './app';
To powiedziawszy, wygląda na to, że Babel 6 zdecydował się porzucić hack interoperacyjności podczas transpilacji modułów. Teraz twój moduł app.js jest transponowany jako
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function () {};
Jak widzisz, nie ma więcej przydziału do
module.exports
. Dorequire
tego modułu musisz zrobićrequire('./app').default();
źródło
require('./app').default;
działało.default()
powróciłundefined
require(...).default
zawiera odniesienie do wyeksportowanej funkcji.default()
nazywa to. Jeśli twoja funkcja nic nie zwraca (lub jest pusta), to oczywiście wynik będzieundefined
.require('path').default()
nie działa,require('path').default
działa dla mnierequire('./app').default;
Jeśli eksportujesz obiekt zamiast funkcji.Po prostu kontynuuj z poprawną odpowiedzią powyżej.
Jeśli chcesz użyć domyślnego zachowania eksportu programu
babel@5
, możesz wypróbować wtyczkę babel-plugin-add-module-export .U mnie działa całkiem nieźle.
źródło
Jeśli to nie zadziała
require('./app').default()
posługiwać się
require('./app').default
Bez wywołania funkcji na końcu.
źródło