总结

ES6 为 JS 语言添加了模块,作为打包与封装功能的方式。模块的行为异于脚本,它们不会用自身顶级作用域的变量、函数或类去修改全局作用域,而模块的 this 值为 undefined 。为了实现这些行为,模块在被加载时使用了一种不同的方式。

你必须将模块中需要向外提供的任何功能都导出,变量、 函数与类都可以,并且每个模块允许存在一个默认导出。在导出之后,另一个模块就能导入该模块所导出的一个或多个名称了。这些导入的名称就像是被 let 所定义的,会被当作块级绑定,并且不允在同一模块内重复声明。

如果模块只是要在全局作用域上进行操纵,那么无须导出任何绑定。你实际上可以导入这样一个模块,而不会在当前模块作用域中引入任何绑定。

由于模块必须用与脚本不同的方式运行,浏览器就引入了 <script type="module">,以表示资源文件或内联代码需要作为模块来执行。使用 <script type="module"> 加载的模块文件会默认应用 defer 属性。一旦包含模块的页面文档完全被解析,模块就会按照它们在文档中的出现顺序依次执行。