2015-10-13 76 views
4

我正在使用ES6爲服務器建立JavaScript通信庫。服務器具有通過WebSocket發送和接收的特定類型的JSON編碼消息。無法在Babel中使用es6`file``的導出模塊

要確保包含所有消息字段並且沒有向服務器發送額外字段,每種消息類型都有自己的類。每條消息都在其自己的文件中定義具有以下結構:如果用戶在一個特定的文件,只需要一個或兩個消息類型

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是所有的消息文件,然後是它們的重新編號。這樣一來,用戶就可以做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/(標題爲「彙總模塊」),其他來源中科),我應該是可以使用以下作爲messages.js文件的內容:

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

然而,當我在,做任何import * as Messages from 'package_name/messages'文件運行通天,我沒有得到任何結果。 (它只是簡單的沒有做任何事情)。

當我更改文件有以下內容,一切都按預期:

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

爲什麼沒有其他的工作方式?

+0

所以從'./messages/type1'輸出Type1;'真的默默地失敗了?它沒有給出語法錯誤?這是Babel的一個實驗性功能,但如果它未啓用,它應該會引發錯誤。 – loganfsmyth

+0

@loganfsmyth是的,它靜靜地失敗了。 –

回答

3

official spec的細讀表明,只有兩種方式來使用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'; 
... 
+1

或許應該提到https://github.com/leebyron/ecmascript-more-export-from,因爲這是在Babel環境中,但是否則就是很好的答案。 – JMM

0

我只想補充一點,我有一個非常類似的問題。變量/模塊我試圖直接從另一個文件中導出,返回爲undefined。但是,如果我通過先導入然後再導出將其分解爲兩個步驟,那就沒問題了。問題的原因最終是我正在做某種類型的循環導入。