No Babel 5.x, posso escrever o seguinte código:
app.js
export default function (){}
index.js
require('babel/register');
require('./app')();
Então, posso executar node index.js
sem erros. No entanto, usando Babel 6.x, executando o seguinte código
index.es6.js
require('babel-core/register');
require('./app')();
resulta em um erro
require (...) não é uma função
Eu quero saber porque
javascript
ecmascript-6
babeljs
XGHeaven
fonte
fonte
.babelrc
? Você está especificando opções do Babel em algum lugar? Eu pergunto porque o Babel 6 não transpila nada por padrão e você não está especificando aes2015
predefinição no código que postou..babelrc
, o outro script es6 está rodando normalmentebabel
é para perguntas sobre uma biblioteca Python com o referido nome.app.js
, mas execute-a imediatamenteRespostas:
TL; DR
Você tem que usar
require('./app').default();
Explicação
O Babel 5 costumava ter um hack de compatibilidade para
export default
: se um módulo continha apenas uma exportação, e era uma exportação padrão, ele era atribuídomodule.exports
. Então, por exemplo, seu módulo app.jsexport default function () {}
seria transpilado para este
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = function () {}; module.exports = exports["default"];
Isso foi feito puramente para compatibilidade com
require
módulos -ing Babel-transpilados (como você está fazendo). Também era inconsistente; se um módulo contivesse exportações nomeadas e padrão, não poderia serrequire
-d.Na realidade, de acordo com as especificações do módulo ES6, uma exportação padrão não é diferente de uma exportação nomeada com o nome
default
. É apenas açúcar sintático que pode ser resolvido estaticamente em tempo de compilação, então esteimport something from './app';
é o mesmo que este
import { default as something } from './app';
Dito isto, parece que o Babel 6 decidiu abandonar o hack de interoperabilidade ao transpilar módulos. Agora, seu módulo app.js é transpilado como
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function () {};
Como você vê, não há mais atribuição para
module.exports
. Pararequire
este módulo, você precisa fazerrequire('./app').default();
fonte
require('./app').default;
funcionou.default()
retornouundefined
require(...).default
fornece uma referência à função exportada.default()
chama isso. Se sua função não retornar nada (ou estiver vazia), então, é claro, o resultado seráundefined
.require('path').default()
não funciona,require('path').default
funciona para mimrequire('./app').default;
Se exportar um objeto em vez de uma função.Apenas para acompanhar com a resposta correta acima.
Se você quiser usar o comportamento padrão de exportação de
babel@5
, você pode tentar o plugin babel-plugin-add-module-exports .Está funcionando muito bem para mim.
fonte
Se isso não funcionar
require('./app').default()
usar
require('./app').default
Sem a chamada de função no final.
fonte