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

时间:2015-11-14 03:09:56

标签: javascript ecmascript-6 babeljs

在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')();

导致错误

  

require(...)不是函数

我想知道为什么?

3 个答案:

答案 0 :(得分:129)

<强> 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转换模块的兼容性(就像你正在做的那样)。它也不一致;如果模块包含命名导出和默认导出,则不能是require - d。

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

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();

答案 1 :(得分:6)

只是跟进上面的正确答案。

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

它对我来说非常好。

答案 2 :(得分:3)

如果这不起作用

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

使用

require('./app').default

最后没有函数调用。