在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插件。
这对我来说工作得很好。