在Babel 6.x中不能要求()默认导出值

在Babel 5.x中,我可以编写下面的代码:

app.js

export default function (){} 

index.js

 require('babel/register'); require('./app')(); 

然后,我可以运行node index.js没有错误。 但是,使用Babel 6.x,运行下面的代码

index.es6.js

 require('babel-core/register'); require('./app')(); 

导致错误

要求(…)不是一个函数

我想知道为什么?

TL; DR

你必须使用

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

说明

Babel 5曾经有一个兼容性黑客export default :如果一个模块只包含一个导出,并且它是一个默认导出,它被分配到module.exports 。 所以,例如,你的模块app.js

 export default function () {} 

将被转译成这个

 "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = function () {}; module.exports = exports["default"]; 

完全是为了与require Babel转换模块兼容(就像你正在做的那样)。 这也是不一致的; 如果一个模块同时包含命名和默认导出,则不能使用-d。

实际上,根据ES6模块规范,默认导出与default名称的命名导出没有区别 。 它只是在编译时可以静态parsing的语法糖,所以这个

 import something from './app'; 

跟这个一样

 import { default as something } from './app'; 

话虽如此,看来Babel 6决定在模块转换时降低互操作性。 现在,您的模块app.js被转译为

 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function () {}; 

正如你所看到的,没有更多的分配给module.exportsrequire这个模块,你需要这样做

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

只是为了跟上上面的正确答案。

如果你想使用babel@5默认导出行为,你可以试试babel-plugin-add-module-exports插件。

这对我来说工作得很好。