【问题标题】:How do I make a dynamic ES6 module?如何制作动态 ES6 模块?
【发布时间】:2017-07-23 00:30:57
【问题描述】:

我想使用一个函数来生成一个普通对象,该对象将从 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 中,但它们都会弹出错误。


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

感谢任何帮助。

【问题讨论】:

  • 您使用的是哪个 JavaScript 环境,它是否支持export
  • ES6 导入和导出是静态的,应该静态分析。是否有什么阻止您将此对象导出为默认导出?您可以使用 CJS 模块进行动态导出。
  • export {a, b, c}; 不是对象表达式,它是要导出的名称列表,因此不能用任意表达式替换它。

标签: javascript module ecmascript-6 babeljs


【解决方案1】:

根据规范,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

【讨论】:

    猜你喜欢
    • 2015-08-06
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    • 2020-03-11
    相关资源
    最近更新 更多