如何制作动态ES6模块?

时间:2017-03-03 02:42:30

标签: javascript module ecmascript-6 babeljs

我想使用一个函数来生成一个普通的对象,该对象将从ES6模块导出(在Node中运行之前使用Babel来转换我的代码)

以下模块是我想要制作的......

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中,但它们都会弹出错误。

这甚至可能吗?我误解了我可以输出什么样的物品?我是否必须明确地输出普通对象并包含其属性?

感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

根据规范,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,无论您是否使用它们。