【问题标题】:Can't require() default export value in Babel 6.x在 Babel 6.x 中不能 require() 默认导出值
【发布时间】:2016-02-15 17:47:29
【问题描述】:

在 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脚本运行正常
  • 请阅读标签说明。 babel 是针对具有上述名称的 Python 库 的问题。
  • 只是不要从app.js 导出函数,而是立即运行它
  • @FelixKling 对不起,我不知道 python 中的同名...

标签: javascript ecmascript-6 babeljs


【解决方案1】:

TL;DR

你必须使用

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

说明

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-transpiled 模块兼容(就像你正在做的那样)。它也不一致;如果一个模块同时包含命名导出和默认导出,则它不能是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这个模块,你需要做的

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

或者,更简洁,更接近您的原始代码:

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

【讨论】:

  • 对我来说require('./app').default; 工作。 default() 返回undefined
  • @thinklinux, require(...).default 给出了导出函数的引用。 default() 调用它。如果您的函数没有返回任何内容(或为空),那么结果当然是undefined
  • require('path').default() 不起作用,require('path').default 适合我
  • 如果你导出对象而不是函数,你应该使用require('./app').default;
  • 我已经编辑了答案以澄清require('./app').default 通常是您想要的。对于原始问题,require('./app').default() 有效,因为 OP 正在导入一个函数并立即执行它。
【解决方案2】:

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

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

对我来说效果很好。

【讨论】:

    【解决方案3】:

    如果这不起作用

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

    使用

    require('./app').default
    

    最后没有函数调用。

    【讨论】:

    猜你喜欢
    • 2017-01-16
    • 2017-06-09
    • 2017-02-21
    • 1970-01-01
    • 2017-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多