一、基本的导出
export 关键字将已发布代码部分公开给其他模块。最简单方法就是将 export放置在任意变量、函数或类声明之前,从模块中将它们公开出去:
二、基本的导入
import { identifier1, identifier2 } from "./example.js";
当从模块导入了一个绑定时,该绑定表现得就像使用了 const 的定义。这意味着你不能再定义另一个同名变量(包括导入另一个同名绑定),也不能在对应的 import 语句之前使用此标识符(也就是要受暂时性死区限制),更不能修改它的值。
在此代码中, example.js 中所有导出的绑定都被加载到一个名为 example 的对象中,具名导出( sum() 函数、 multiple() 函数与 magicNumber )都成为 example 的可用属性。这种导入格式被称为命名空间导入( namespace import ),这是因为该 example 对象并不存在于 example.js 文件中,而是作为一个命名空间对象被创建使用,其中包含了example.js 的所有导出成员。
export 与 import 都有一个重要的限制,那就是它们必须被用在其他语句或表达式的外部。例如,以下代码有语法错误:
三、导入绑定的一个微妙怪异点
ES6 的 import 语句为变量、函数与类创建了只读绑定,而不像普通变量那样简单引用了原始绑定。尽管导入绑定的模块无法修改绑定的值,但负责导出的模块却能做到这一点。例如,假设你想要使用以下模块:
当你导入了这两个绑定后, setName() 函数还可以改变 name 的值:
外部模块导入的 name 变量与在 example.js 模块内部的 name 变量对比,前者是对于后者的只读引用,会始终反映出后者的变化。就算后者的值在负责导出的模块中发生了变化,这种绑定关系也不会被破坏。模块导出与导入的绑定机制,与写在一个文件或模块内的代码是不同的。
四、重命名导出与导入
用不同的名称来导出一个函数,你可以使用 as 关键字来指定新的名称,以便在模块外部用此名称指代目标函数:
假若模块导入函数时想使用另一个名称,同样也可以用 as 关键字:
五、导出默认值 -default 关键字
此模块将一个函数作为默认值进行了导出, default 关键字标明了这是一个默认导出。此函数并不需要有名称,因为它就代表这个模块自身。
你也能在 export default 后面放置一个标识符,以指定默认的导出,正如:
将标识符作为默认导出来指定的第三种方式,是使用重命名语法,如下:
六、导入默认值
使用如下语法来从一个模块中导入默认值:
注意此处并未使用花括号,与之前在非默认的导入中看到的不同。
对于既导出了默认值、又导出了一个或更多非默认的绑定的模块,你可以使用单个语句来导入它的所有导出绑定
逗号将默认的本地名称与非默认的名称分隔开,后者仍旧被花括号所包裹。要记住在 import语句中默认名称必须位于非默认名称之前。
如同导出默认值,你也能使用重命名语法进行默认值的导入:
七、绑定的再导出
也许有时你会想将当前模块已导入的内容重新再导出(例如,假设要用几个小模块来创建一个库)
若你想将来自另一个模块的所有值完全导出,可以使用星号( * )模式:
使用完全导出,就可以导出目标模块的默认值及其所有具名导出,但这可能影响你从当前模块所能导出的值。例如,假设 example.js 具有一个默认导出,当你使用这种语法时,你就无法为当前模块另外再定义一个默认导出。