一、爲何會有Module?瀏覽器
答: 由於js以前一直沒有模塊體系,也就是Module體系。服務器
二、在ES6以前,有哪些模塊加載方案?函數
答:有兩種,CommonJS和AMD。ui
三、兩種加載方案的區別是什麼?spa
答:CommonJS用於服務器,AMD用於瀏覽器。設計
四、Module的設計思想是什麼?code
答:靜態化。對象
五、什麼是靜態化?blog
答:在編譯的時候就能肯定模塊的依賴關係,以及輸入和輸出的變量。接口
六、Module是對象嗎?
答:不是。運行時加載的纔是對象。
七、默寫靜態加載與運行時加載的代碼。
答:靜態加載加載的不是對象,而是從模塊裏面加載了相應的方法,所以它的效率要比運行時加載高。運行時加載加載的是一個對象,只有在運行時才能獲得這個對象,從而獲得這個對象的方法。
import {start} from './fs.js' //靜態加載 const {start} = require('./fs.js') //運行時加載
八、export和import命令分別是作什麼的?
答:export命令用於規定模塊的對外接口,import命令用於輸入其餘模塊提供的功能。
九、使用模塊內部變量的時候須要注意什麼?
答:若是外部想要讀取模塊內部的變量,必須使用export命令,並用花括號包括。花括號表示這是一個對外的接口。
十、export命令能夠輸出什麼?
答: 變量,類,和方法。
十一、給下面兩句代碼找錯。
export 1;
答:錯誤。不能直接輸出1,由於它沒有提供對外的接口。
var m = 1;
export m;
答:錯誤。這種寫法經過變量直接輸出1, 1只是一個值,不是一個接口,仍然是沒喲提供對外的接口。
十二、export的位置有要求嗎?
答:export能夠在模塊的任何位置,只要處在模塊的頂層就能夠。可是不能處在塊級做用域。
------import命令分割線--------
1、export命令
暴露的能夠是變量,函數和類,語法以下:
let name="Alice"; let age=18; let year=2009; let person={ name:"Tony", age:20 }
-
(1)暴露的對象必須加{},它表示暴露的是一個接口。若是不加的話,它表示暴露的是一個值,這樣就會報錯。好比下面這段代碼,就是錯誤的。
var name="Alice"; export name;
-
(2)as關鍵字,能夠給暴露的對象換名字,同一個對象能夠屢次使用as關鍵字,用不一樣的名字暴露出去。
(3)export命令必須處於模塊的頂層,位置無所謂。
(4)export暴露的對象是動態綁定關係,若是發生變化,外部引用也會變化。
2、import命令
語法以下:
import {name,age,year as born} from "./main";
import有如下幾個特色:
(1)引用的文件能夠省略.js後綴。
(2)可使用as關鍵字。
(3)import具備變量提高的效果,因此放在引用的對象後面也無所謂。
(4)ES6的import命令最好不要跟CommonJS模塊的require命令放在一塊。由於import會變量提高,會最先解析。
(5)import接收對象是否用花括號括起來,要看對象的暴露方式。默認輸出就不用加花括號,若是是export,就要加花括號。
3、export default命令
import命令,在引用的時候必須得知道這個文件中所暴露的全部變量的名字。若是我不知道export變量的名字,怎麼引用呢?就是在暴露的時候用export default命令,該命令爲模塊指定默認輸出。
暴露:
export default function onlyOne(){ console.log("只能用一次"); }
import only from "./main";
only();
export default命令的特色:
(1)export default命令在一個模塊中只能使用一次,由於是默認暴露值,因此默認的輸出值只能是惟一的嘛。
(2)引用的時候不須要知道暴露的對象名,能夠給他起隨意的名字。
(3)引用的時候不須要加花括號。
-
Node是JS語言的服務器運行環境,他對ES6的支持度很高。雖然個人電腦上也安裝了Node.js環境,可是這個倒黴孩子,電腦居然不支持ES6的Module模塊,雖然是爲啥他不支持我也不明白。但這也就意味着上面的前兩個命令我都無法用。
看了看書,Node不支持ES6模塊的緣由我彷佛知道了。
Node自己帶有支持模塊的功能,他支持CommonJS模塊。
模塊分爲CommonJS裏的模塊與ES6裏面的模塊,這兩種模塊是不同的東西。export命令和import命令是ES6裏面的模塊。 而CommonJS模塊與ES6模塊的功能不兼容。
-
CommonJS模塊與ES6模塊的區別是什麼呢?
(1)CommonJS暴露和加載的是一個對象,而ES6只是暴露和加載了一個接口。
(2)上面這個區別致使了,CommonJS的引用是靜態的,而ES6的引用是動態綁定的。參見上面export命令的第(4)條。
-
在電腦不支持ES6Module的狀況下,想要引用暴露的文件怎麼辦呢?就用CommonJS的模塊。
暴露:module.exports={}方法
暴露的能夠有變量、對象和方法。
let year=2009; let person={ name:"Tony", age:20 } let test=function(){ console.log("It is a function!") } module.exports={year,person,test};
-
引入:let 對象名=require(「相對路徑」);
引入的info是一整個對象。這種引入是CommonJS模塊裏的功能。
var info = require("./main.js"); console.log('引入文件', info); info.test();
-
注意:上面的這兩種方法都不能使用as關鍵字。