无法在Babel中使用来自'file'的es6`export Module

时间:2015-10-13 17:16:54

标签: javascript ecmascript-6 babeljs

我正在使用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.jsimport所有邮件文件,然后重新export。这样,用户就可以import * as Message from 'package_name/messages'访问Message.Type1Message.Type2等消息类型。

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

messages.js

然而,当我在export Type1 from './messages/type1'; export Type2 from './messages/type2'; ... 的任何文件上运行Babel时,我得不到任何结果。 (它很明显没有做任何事情)。

当我将文件更改为具有以下内容时,一切都按预期工作:

import * as Messages from 'package_name/messages'

为什么其他方式不起作用?

2 个答案:

答案 0 :(得分:4)

仔细阅读official spec表明只有两种方法可以使用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

答案 1 :(得分:0)

我只是想补充一点,我有一个非常类似的问题。我试图直接从另一个文件导出的变量/模块以undefined的形式返回。但是,如果我通过先导入然后将其导出回原来将其分解为两个步骤,那就没问题了。问题的原因最终是我正在进行某种类型的循环导入。