Javascript Can';t require()巴别塔6.x中的默认导出值

Javascript Can';t require()巴别塔6.x中的默认导出值,javascript,ecmascript-6,babeljs,Javascript,Ecmascript 6,Babeljs,在Babel 5.x中,我可以编写以下代码: app.js export default function (){} require('babel/register'); require('./app')(); require('babel-core/register'); require('./app')(); export default function () {} index.js export default function (){} require('babel/regi

在Babel 5.x中,我可以编写以下代码:

app.js

export default function (){}
require('babel/register');
require('./app')();
require('babel-core/register');
require('./app')();
export default function () {}
index.js

export default function (){}
require('babel/register');
require('./app')();
require('babel-core/register');
require('./app')();
export default function () {}
然后,我可以运行
node index.js
,没有错误。但是,使用Babel6.x,运行以下代码

index.es6.js

export default function (){}
require('babel/register');
require('./app')();
require('babel-core/register');
require('./app')();
export default function () {}
导致错误

require(…)不是一个函数

我想知道为什么;DR

你必须使用

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

Babel 5曾经对
导出默认值
进行过兼容性攻击:如果一个模块只包含一个导出,并且它是默认导出,那么它被分配给
模块.exports
。例如,您的模块app.js

export default function (){}
require('babel/register');
require('./app')();
require('babel-core/register');
require('./app')();
export default function () {}
会被传送到这个

"use strict";

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

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

module.exports = exports["default"];
这样做纯粹是为了与
require
-ing Babel transpiled模块兼容(就像您正在做的那样)。这也是不一致的;如果模块同时包含命名导出和默认导出,则它不能是
require
-d

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

import something from './app';
和这个一样吗

import { default as something } from './app';
尽管如此,巴贝尔6似乎决定在传输模块时放弃互操作性攻击。现在,您的模块app.js被传输为

'use strict';

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

exports.default = function () {};
如您所见,不再分配给
模块.exports
。若要
要求
此模块,您需要执行以下操作

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

只是为了跟进上面的正确答案

如果要使用
babel@5
,您可以尝试插件

这对我来说非常有效。

如果这不起作用

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

require('./app')。默认值

最后没有函数调用。

是否有
.babelrc
?您是否在某处指定了Babel选项?我这样问是因为Babel 6在默认情况下不传输任何内容,并且您没有在发布的代码中指定
es2015
预设。@igorrush我确实有一个
。babelrc
,其他es6脚本正在正常运行。请阅读标记说明
babel
是针对具有上述名称的Python库的问题。只是不要从
app.js
导出函数,而是正确运行它away@FelixKling对不起,我不知道python中也有相同的名称…对我来说
require('./app')。默认工作
default()
返回
undefined
@thinklinux,
require(…)。default
提供导出函数的引用<代码>默认值()
调用它。如果你的函数没有返回任何东西(或者是空的),那么,当然,结果将是
未定义
require('path')。default()
不起作用,
require('path')。默认值对我有效你应该使用
require('./app')。默认值如果导出的是一个对象而不是一个函数。正如Igor在上面的注释()中所说,您的第一个示例将调用该函数,而第二个示例将为其提供一个引用