在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語句寫在一起。

上面代碼中,export和import語句可以結合在一起,寫成一行。但需要注意的是,寫成一行以后,foo和bar實際上並沒有被導入當前模塊,只是相當於對外轉發了這兩個接口,導致當前模塊不能直接使用foo和bar。