2017-03-03 53 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