我认为我要求的是不可能的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}}。这有用吗? (我仍然希望有一个更简单的解决方案)。
答案 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
变量。