了解 ES6 命名导入

Understanding ES6 Named Imports

我正在阅读 MDN docs 上的 ES6 import 声明。

我大体上理解它是如何工作的,但想深入了解,我不理解语法的一个方面。

MDN syntax of import所述,这些都是将代码导入当前module/scope的不同方式:

import defaultExport from "module-name";
import * as name from "module-name";
import { export } from "module-name";
import { export as alias } from "module-name";
import { export1 , export2 } from "module-name";
import { foo , bar } from "module-name/path/to/specific/un-exported/file";
import { export1 , export2 as alias2 , [...] } from "module-name";
import defaultExport, { export [ , [...] ] } from "module-name";
import defaultExport, * as name from "module-name";
import "module-name";
var promise = import("module-name");

我想了解的是这两行之间的区别:

import { export1 , export2 } from "module-name";
import { foo , bar } from "module-name/path/to/specific/un-exported/file";

这两者不会完全一样吗?我们没有导入默认 export,因此我们必须导入命名 exports.


为什么它们是两个独立的语法定义?

为什么第二个有这个:

from "module-name/path/to/specific/un-exported/file";
import { export1 , export2 } from "module-name";
import { foo , bar } from "module-name/path/to/specific/un-exported/file";

Why are they two separate syntax definitions?

可能只是为了说明绝对模块名称也可以包含路径。

然后,"module-name"将根据通常的模块解析规则进行解析,然后foobar将从该模块中包含的某个文件中导入。

这样,您就可以访问未从模块主文件中导出的内容。

然而,许多模块作者认为只有模块主文件的导出才构成 public API。其他一切,包括文件名和路径,都是一个实现细节,可能会随着每个版本以不可预测和不兼容的方式发生变化。