2015-11-14 73 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'。 –