ES2015是否可以导出“import * as”的结果?

11
在ES2015中,可以将整个模块作为一个对象导入,其属性是该模块的导出内容:
import * as name from 'module';

我发现这个对于命名空间非常有用,而且我一直在使用它。

同时也可以重新导出其他模块的导出内容:

export { name } from 'module'; // selectively
export * from 'other-module'; // indiscriminately

现在我正在尝试以这种方式编写具有命名空间的库。将所有内容收集到顶层模块中的直观方法是这样的:

export * as name from 'module';

但是这似乎行不通;Babel和Rollup都拒绝它。

我可以将模块作为对象导入,通过迭代其键创建克隆,并将其导出,但那只会成为一个普通的动态对象,因此我将失去Rollup提供的巨大优势。

那么,使用声明性模块语法真的没有办法做到这一点吗?对我来说,似乎没有借口。


我不明白你试图通过 export * as name from 'module'; 实现什么目的。你打算如何使用这样的导出方式?导入 * 总是需要命名空间 as X,因此无论你在导出语句中指定什么名称都是无关紧要的——对吗? - user663031
@torazaburo name 是模块对象导出的名称。例如,如果模块“abc”包含 export * as xyz from 'xyz',并且你使用 import * as abc from 'abc' 导入它,那么你将能够通过 abc.xyz 访问 "xyz" 的导出内容。 - Permutator
1个回答

23

不,这在ES6中仅仅是被遗漏了。然而,有一个一阶段提案来添加它们,而且Rollup将考虑实现它

在那之前,您需要使用两个声明和本地绑定,尽管无需克隆对象:

import * as name from 'module';
export { name };

哦,太棒了!这正是我所需要的!我没有意识到你需要花括号来做这个,因为 MDN 没有包含它们。 - Permutator
MDN在哪些地方不使用花括号?当然,在许多其他的导出声明(默认值,变量等)中,它们是不需要的。 - Bergi
在导出语句的页面顶部,它将命名导出的语法列为export name1, name2, ..., nameN;,没有大括号。此外,在描述中,它给出了这个例子:export myFunction; // exports a function declared earlier - Permutator
哦,那些文档似乎很少。最好看看http://www.2ality.com/2014/09/es6-modules-final.html(我会去修复MDN)。 - Bergi
顺便说一下,如果你检查了但没有看到问题,那是因为我刚刚改过它。第一次编辑,希望我没有搞砸。 - Permutator

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接