Babel 6.x中不能要求()默认导出值

XGH*_*ven 78 javascript ecmascript-6 babeljs

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

app.js

export default function (){}
Run Code Online (Sandbox Code Playgroud)

index.js

require('babel/register');
require('./app')();
Run Code Online (Sandbox Code Playgroud)

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

index.es6.js

require('babel-core/register');
require('./app')();
Run Code Online (Sandbox Code Playgroud)

导致错误

require(...)不是函数

我想知道为什么?

Igo*_*ush 138

TL; DR

你必须使用

require('./app').default();
Run Code Online (Sandbox Code Playgroud)

说明

Babel 5曾经有过兼容性攻击export default:如果一个模块只包含一个导出,并且它是默认导出,则将其分配给module.exports.所以,例如,你的模块app.js

export default function () {}
Run Code Online (Sandbox Code Playgroud)

将被转化为此

"use strict";

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

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

module.exports = exports["default"];
Run Code Online (Sandbox Code Playgroud)

完全是为了与require-Babel-transformediled模块兼容(就像你正在做的那样).它也不一致; 如果模块包含命名和默认导出,则它不能是require-d.

实际上,根据ES6模块规范,默认导出与具有名称的命名导出没有什么不同default.它只是语法糖,可以在编译时静态解析,所以这

import something from './app';
Run Code Online (Sandbox Code Playgroud)

与此相同

import { default as something } from './app';
Run Code Online (Sandbox Code Playgroud)

话虽如此,似乎Babel 6决定在转换模块时放弃互操作性攻击.现在,您的模块app.js被转换为

'use strict';

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

exports.default = function () {};
Run Code Online (Sandbox Code Playgroud)

如你所见,没有更多的任务module.exports.对于require这个模块,你需要做

require('./app').default();
Run Code Online (Sandbox Code Playgroud)

  • 对我来说`require('./ app').默认;`工作.`default()`返回`undefined` (12认同)
  • @thinklinux,`require(...).default`给出了对导出函数的引用.`default()`调用它.如果你的函数没有返回任何东西(或者是空的),那么结果当然是`undefined`. (10认同)
  • `require('path').default()`不起作用,`require('path').default`对我有用 (7认同)
  • 如果导出对象而不是函数,则应该使用“require('./app').default;”。 (2认同)

hao*_*ang 7

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

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

它对我来说非常好用.


Ska*_*Ska 5

如果这不起作用

require('./app').default()
Run Code Online (Sandbox Code Playgroud)

require('./app').default
Run Code Online (Sandbox Code Playgroud)

最后没有函数调用。