在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.exports 。  require这个模块,你需要这样做 
 require('./app').default(); 
只是为了跟上上面的正确答案。
 如果你想使用babel@5默认导出行为,你可以试试babel-plugin-add-module-exports插件。 
这对我来说工作得很好。