在es6标准发布之前,js是没有模块化的概念的,也就是说原生js是无法将一个大型程序拆分成若干相互依赖的小模块的。而es6针对这个问题提出了Module的概念,设计思想是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。
关于静态化是指直接从指定模块取出想要的方法,其他的不加载。比如
此时只加载fs中的stat、exists和readFile三个模块,其他的不加载。而比如CommonJS和 AMD 模块,都只能在运行时确定这些东西。也就是先加载整个fs,然后再从中找到想要的模块。
Module模块功能主要由两个命令构成:import 和 export。
export用于对外输出本模块(一个文件可以理解为一个模块)变量的接口,可以使用as对要输出的变量进行重命名。
import用于在一个模块中加载另一个含有export接口的模块,可以使用as对引入的变量进行重命名。import命令具有提升效果,会提升到整个模块的头部,首先执行。如果多次重复执行同一句import语句,那么只会执行一次,而不会执行多次。
也就是说使用export命令定义了模块的对外接口以后,其他JS文件就可以通过import命令加载这个模块(文件)。
export 和 export default 异同:
1、二者均用于导出常量、函数、文件、模块等;
2、你可以在其它文件或模块中通过import+(常量 | 函数 | 文件 | 模块)名的方式,将其导入,以便能够对其进行使用;
3、在一个文件或模块中,export、import可以有多个,export default仅有一个;
4、通过export方式导出,在导入时要加{ },export default则不需要。
5、在用import引入时,如果是用export方法定义的导出,必须要知道指定的变量名。而如果使用export default定义的时候,import可以起任意的名字,这里可以理解为,用export default声明导出模块时,自动生成了一个叫default的变量,当使用import命令导入时,会自动将这个defualt变量赋值给声明的变量中。这也就解释了为什么export default仅有一个。注:export default命令其实只是输出一个叫做default的变量,所以它后面不能跟变量声明语句.
import和export的复合写法:
如果在一个模块之中,先输入后输出同一个模块,import语句可以与export语句写在一起。
![](https://img2018.cnblogs.com/blog/1718271/201907/1718271-20190724195318842-1334252423.png)
上面代码中,export和import语句可以结合在一起,写成一行。但需要注意的是,写成一行以后,foo和bar实际上并没有被导入当前模块,只是相当于对外转发了这两个接口,导致当前模块不能直接使用foo和bar。