当前位置: 首页 > 面试题库 >

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

贺立果
2023-03-14
问题内容

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

我想知道为什么吗?


问题答案:

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


 类似资料:
  • 我有一个VUE2项目,我编写了一个简单的函数来翻译日期中的月份,我想将它导入到我的一个组件中,但是我得到了一个错误: 在“@/utils/date-translation”中找不到导出“default”(导入为“translate date”) src文件夹中的相对文件路径是正确的,我导出的函数如下所示: 然后我将其导入到组件中,如下所示: 我做错了什么?

  • 问题内容: 除了* 使用如下所示的反射检查 之外 ,是否有任何方法 要求 类具有默认(无参数)构造函数?(以下方法可以工作,但是很hacky,反射速度很慢) * 问题答案: 您可以为此构建一个注释处理器。注释处理器是在编译时运行的编译器插件。它们的错误显示为编译器错误,甚至可能停止构建。 这是一个示例代码(尽管我没有运行它): 如果引入注释(例如RequiresDefaultAnnotation)

  • 问题内容: 如果要创建组件,似乎可以用很多不同的方式创建类。这些有什么区别?我怎么知道要使用哪个? 我只是假设他们做不同的事情,还是只是语法不同? 如果有人可以给我快速的解释或链接,我将不胜感激。我不想从一个新的框架开始,不知道到底有什么区别。 问题答案: 嗨,欢迎来到React! 我认为您在这里遇到的问题并不是与React特定的,而是与新的ES2015模块语法有关。在创建React类组件时,出于

  • 问题内容: 档案:SafeString.js 我从未见过。是否有任何等效的东西更容易理解? 问题答案: 它是ES6模块系统的一部分,该文档中还有一个有用的示例: 如果模块定义了默认导出: 那么您可以通过省略花括号来导入默认导出: 更新: 自2015年6月,该模块系统中定义§15.2和在特定语法中定义§15.2.3ECMAScript的2015规范的。

  • 文件:safeString.js 我以前从未见过。对于,是否有更容易理解的等效内容?