2017-03-03 56 views
1

我想如何製作動態ES6模塊?


以下模塊是我想什麼(在節點運行前使用通天transpile我的代碼)使用函數生成將從ES6模塊導出一個普通的對象使...

module_a

function generatePlainObject(param1, param2, param3) { 
    return { 
     newProp1: param1, 
     newProp2: param2, 
     newProp3: param3, 
    }; 
} 

export generatePlainObject(1, 2, 3); 

......這樣我就可以在另一個模塊使用import { newProp1, newProp2, newProp3 } from 'module_a',並輕鬆訪問屬性。

但是這會引發錯誤(unexpected token)。

我已經嘗試使用傳播運算符(...),並使用Object.assign({}, funcResults)並在導出前將其存儲在const中,但它們都彈出錯誤。


這甚至有可能嗎?我誤解了我可以導出哪種對象?我是否必須顯式輸出普通對象幷包含它的屬性?

任何幫助表示讚賞。

+0

您正在使用哪種JavaScript環境並支持'export'? – zzzzBov

+3

ES6導入和導出是靜態的,它們應該是靜態分析的。有沒有辦法阻止你將這個對象導出爲默認導出?您可以使用CJS模塊執行動態導出。 – estus

+2

'export {a,b,c};'不是對象表達式,它是要導出的名稱列表,因此不能用任意表達式替換它。 – loganfsmyth

回答

2

根據規格,ES6模塊必須爲靜態可分析。這意味着它們不能在運行時生成。這允許進行很多優化,如tree shaking

如果你真的想這樣做,你可以使用CommonJS的模塊,像這樣...

module.exports = generatePlainObject(1, 2, 3); 

並導入這樣的...

import { newProp1, newProp2 } from './otherFile'; 

另一種選擇是以默認方式導出,然後像這樣導入整個對象...

export default generatePlainObject(1, 2, 3); 

並導入這樣的...

import theWholeObj from './otherFile'; 
console.log(theWholeObj.newProp1); 

這兩種方法都是不靜態分析的因此使樹搖動不可能的。這意味着,無論您是否使用它們,只要您導入newProp1,您也將導入newProp2newProp3