2015-11-14 50 views
54

在通天5.x的,我可以写下面的代码:不能要求巴贝尔6.x的()默认出口值

app.js

export default function(){} 

index.js

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

然后,我可以运行node index.js没有任何错误。然而,使用巴贝尔6.x中,运行下面的代码

index.es6.js

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

导致错误

需要(...)不是一个函数

我想知道为什么?

+0

你有'.babelrc'吗?你是否在某处指定了Babel选项?我问,因为Babel 6默认不会传输任何东西,而且您没有在您发布的代码中指定'es2015'预设。 –

+0

@IgorRaush我真的有'.babelrc',其他es6脚本正常运行 – XGHeaven

+0

请阅读标签说明。 'babel'是用于带有所述名称的* Python库*的问题。 –

回答

92

TL; DR

你必须使用

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

说明

巴贝尔5用于对export default兼容性黑客:如果一个模块中只有一个出口,这是默认导出,它被分配到module.exports。因此,举例来说,你的模块app.js

export default function() {} 

将transpiled这个

"use strict"; 

Object.defineProperty(exports, "__esModule", { 
    value: true 
}); 

exports["default"] = function() {}; 

module.exports = exports["default"]; 

这与require -ing巴贝尔-transpiled模块(像你做纯粹兼容性是做)。它也不一致;如果某个模块包含已命名和默认导出,则它不能为require -d。

实际上,根据ES6模块规范,默认导出为与名称为default的命名导出无异,。这只是语法糖,可以在编译时静态解析,所以这

import something from './app'; 

是一样的,因为这

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

话虽这么说,看来,巴贝尔6决定放弃互操作性黑客当传输模块时。现在,正如你看到的,没有更多的分配给module.exports你的模块app.js被transpiled为

'use strict'; 

Object.defineProperty(exports, "__esModule", { 
    value: true 
}); 

exports.default = function() {}; 

。为了require这个模块,你需要做的

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

谢谢,你解决我的问题... – XGHeaven

+6

对我来说'require('./app')。default;'工作。 'default()'返回'undefined' – thinklinux

+5

@thinklinux,'require(...)。default'提供对导出函数的引用。 'default()'调用它。如果你的函数没有返回任何东西(或者是空的),那么当然,结果将是'undefined'。 –