`export Module from "module"` 是有效的 JavaScript 语法吗?

Is `export Module from "module"` a valid JavaScript syntax?

问题

在我公司的 React Native 项目中,我遇到了这样的代码,聚合了多个模块的导出:

export Icon from "./Icon";
export Input from "./Input";
export Pills from "./Pills";

我的编辑强调这是无效语法。我检查了 MDN docs on export ,实际上他们没有列出这样的聚合语法。从他们列出的内容看来,合适的应该是:

export { default as Icon } from "./Icon";
export { default as Input } from "./Input";
export { default as Pills } from "./Pills";

但是第一个代码在我所在的 React Native 项目中工作。

问题

这是否是 JavaScript 中的有效语法,还是仅可用于我们在项目中使用的某些第三方包?

你是对的,但你不是真正使用ES6模块。

您正在使用 metro-react-native-babel-preset 的 babel。这使得上述语法有效。

一如既往,有一个 proposal 使其成为语言的一部分,但它目前处于第一阶段。

来自提案:

The proposed addition follows this same symmetric pattern:

Importing the "default" name (existing):

import v from "mod";

Exporting that name (existing):

import v from "mod"; export {v};

Symmetric "export from" (proposed):

export v from "mod";

在 ES6 和 Javascript 的上下文中。从语法上讲,本机方法是无效的。然而,正如@federkun 所建议的,它在 babel 的上下文中是有效的,并且已经在同一个桌面上提出了建议。 但是,"default"用于导出默认导出,可以再次导出

export {default} from '.\example.js'

或者您可以使用花括号中的名称导出来仅导出命名导出。此外,要导出所有命名导出,您可以使用“*”

export * from '.\example.js'
export {test} from '.\example.js'

或者您可以添加 babel 依赖项以使用相同的语法。