不需要()Babel 6.x中的默认导出值


85

在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(...)不是函数

我想知道为什么吗?


你有.babelrc吗?您是否在某处指定Babel选项?我问是因为Babel 6默认不翻译任何东西,并且您未es2015在发布的代码中指定预设。
伊戈尔·拉什

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

请阅读标签说明。babel是针对具有上述名称的Python库的问题。
菲利克斯·克林

只是不要从中导出功能app.js,而是立即运行它
Bergi 2015年

@FelixKling抱歉,我在python中也不知道这个名字...
XGHeaven

Answers:


156

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

19
为我require('./app').default;工作。default()返回undefined
thinklinux

14
@thinklinux,require(...).default提供了对导出函数的引用。default()叫它。如果您的函数未返回任何内容(或为空),那么结果当然是undefined
伊戈尔·拉什

10
require('path').default()不起作用,require('path').default为我工作
soulmachine'Mar

2
您应该使用require('./app').default;If导出对象而不是函数。
Tokenyet


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.