我可以使用`export`导出一个对象作为“`module.export`”

时间:2016-09-02 13:59:59

标签: ecmascript-6 amd

我认为我要求的是不可能的OOB,但我想确认一下。

我们正在升级到ES6(使用Babel)。 Project是一个使用AMD(requirejs)的网站。我想将一个实用程序模块(foolib)转换为ES6,但是从 ES6(使用import)或现有的ES5 / AMD模块中使用它。

// foolib.es6
export { // as expected, this doesn't work
    method1: function () { ... },
    value1: 123.456
};

// consumer1.es6
import foolib from "foolib";

// consumer2.js
define(["foolib"], function (foolib) {});

我知道解决方法是按如下方式更改foolib.es6

export function method1() { ... };
export let value1 = 123.456;

但实际上,从foolib返回的条目数量是荒谬的。所以我希望有一种方法可以导出现有的对象文字,而无需重写每一行。

此外,我意识到这很可能是不可能的,因为AMD导入(使用define)和import机制之间存在差异(后来使用值为exports的{​​{1}}对象关闭它,包括default值,而前者期望返回单个值。

我认为可能有效的解决方案是从default将对象导出为foolib.es6,然后调整requirejs默认加载器以检查导入的值是否为esModule并返回默认值:{{ 1}}。这有用吗? (我仍然希望有一个更简单的解决方案)。

2 个答案:

答案 0 :(得分:4)

用于导出对象的语法无效,因为您没有为对象指定名称,因此它不能是命名导出,并且您没有指定它是默认导出,因此它不能是默认值出口。将其更改为默认导出:

// foolib.es6
export default {
  method1: function () {}, 
  value1: 123.456
}
// consumer.es6
import foolib from "foolib";

console.log(foolib.value) //=> 123.456

您可以使用babel-plugin-add-module-exports Babel插件将默认导出恢复为Node-land中module.exports的值。

正如您所发现的,请确保在任何其他-modules-插件之前包含此插件,例如transform-es2015-modules-amd

答案 1 :(得分:1)

这可能会迟到,但您也可以使用named export,这与@sdgluck提到的default方法略有不同。

const method1 = function () {};
const value1 = 123.456;

export { method1, value1 };

我喜欢这种方法,因为你可以import直接使用

import { method1, value1 } from 'foolib';

没有联系到default变量。