我正在使用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.Type1
,Message.Type2
等消息类型。
根据我的阅读,(包括http://www.2ality.com/2014/09/es6-modules-final.html和https://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'
为什么其他方式不起作用?
答案 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
的形式返回。但是,如果我通过先导入然后将其导出回原来将其分解为两个步骤,那就没问题了。问题的原因最终是我正在进行某种类型的循环导入。