无法在Babel中使用es6 ' export Module from 'file' '

Unable to use es6 `export Module from 'file'` in Babel

本文关键字:export Module file from es6 Babel      更新时间:2023-09-26

我正在使用ES6构建一个用于与服务器通信的JavaScript库。服务器有特定类型的json编码消息,它通过WebSocket发送和接收。

为了确保所有的消息字段都被包含,并且没有额外的字段被发送到服务器,每个消息类型都有自己的类。每条消息都在自己的文件中定义,结构如下:

export default class NameOfMessage extends BaseMessage {
    constructor(values) {
        // Here is code that checks values and sets them as properties
        // so that calling `JSON.stringify(obj)` will return the data
        // to be sent to the server.
    }
}

如果用户在一个特定的文件中只需要一种或两种消息类型,他们可以写import NameOfMessageType1 from 'package_name/messages/type1', import NameOfMessageType2 from 'package_name/messages/type2'等。

但是,如果用户需要许多消息类型,那么将它们全部包含将变得很麻烦。出于这个原因,我创建了一个额外的文件messages.js,其中import保存所有的消息文件,然后重新- export保存它们。这样,用户可以执行import * as Message from 'package_name/messages',并访问Message.Type1Message.Type2等消息类型。

根据我的阅读,(包括http://www.2ality.com/2014/09/es6-modules-final.html和https://hacks.mozilla.org/2015/08/es6-in-depth-modules/(标题为"聚合模块"的部分),以及其他来源),我应该能够使用以下内容作为messages.js文件的内容:

export Type1 from './messages/type1';
export Type2 from './messages/type2';
...

然而,当我在执行import * as Messages from 'package_name/messages'的任何文件上运行Babel时,我没有得到任何结果。(它只是不做任何事情)。

当我将文件更改为以下内容时,一切都如预期的那样工作:

import Type1 from './messages/type1';
import Type2 from './messages/type2';
export {Type1, Type2};
...

为什么另一种方法不行?

仔细阅读官方规范就会发现,使用export ... from ...只有两种方式:

ExportDeclaration :
    export * FromClause ;
    export ExportClause FromClause ;
    ... // More export declarations
ExportClause :
    { }
    { ExportsList }
    { ExportsList , }

export的所有其他用途都不接受FromClause。事实证明,from的唯一合法用途是与*连接,或者与用大括号括起来的出口列表连接。如果不显式引用default,则无法使用它。

既然是这种情况,下面的文件可以工作:

export {default as Type1} from './messages/type1';
export {default as Type2} from './messages/type2';
...

我只是想补充一下,我有一个非常类似的问题。变量/模块,我试图直接从另一个文件导出回来作为undefined。但是,如果我把它分成两步,先导入,然后再导出,那就没问题了。问题的原因最终是我在做某种类型的循环导入。