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

IT技术 javascript ecmascript-6 babeljs
2021-02-06 07:42:14

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

应用程序.js

export default function (){}

索引.js

require('babel/register');
require('./app')();

然后,我可以毫无错误地运行node index.js但是,使用 Babel 6.x,运行以下代码

index.es6.js

require('babel-core/register');
require('./app')();

导致错误

require(...) 不是函数

我想知道为什么?

3个回答

TL; 博士

你必须使用

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

解释

Babel 5 曾经export defaultmodule.exports. 因此,例如,您的moduleapp.js

export default function () {}

将被转译为这个

"use strict";

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

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

module.exports = exports["default"];

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

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

import something from './app';

和这个一样

import { default as something } from './app';

话虽如此,看来 Babel 6 决定在转译module时放弃互操作性黑客。现在,您的moduleapp.js被转译为

'use strict';

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

exports.default = function () {};

如您所见,不再分配给module.exports. 对于require这个module,你需要做

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

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

require('./app').default();
我已经编辑了答案以澄清这require('./app').default通常是您想要的。对于原始问题,require('./app').default()之所以有效是因为 OP 正在导入一个函数并立即执行它。
2021-03-14 07:42:14
@thinklinux,require(...).default提供了对导出函数的引用。default()称它。如果您的函数不返回任何内容(或为空),那么结果当然是undefined.
2021-03-19 07:42:14
你应该使用require('./app').default;If 你导出一个对象而不是一个函数。
2021-03-22 07:42:14
为我require('./app').default;工作。default()undefined
2021-03-23 07:42:14
require('path').default()不起作用,require('path').default对我有用
2021-03-27 07:42:14

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

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

它对我来说效果很好。

如果这不起作用

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

利用

require('./app').default

最后没有函数调用。

正如伊戈尔在上面的评论(stackoverflow.com/questions/33704714/...)中所说的,你的第一个例子将调用该函数,而第二个将给它一个参考
2021-03-21 07:42:14