在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(...)不是函数
我想知道为什么?
答案 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)
答案 2 :(得分:3)
如果这不起作用
require('./app').default()
使用
require('./app').default
最后没有函数调用。