遵循的規(guī)則
????require/exports是JavaScript社區(qū)中的開發(fā)者自己草擬的規(guī)則,遵循AMD,統(tǒng)治了所有ES6之前的所有模塊化編程
????import/export則是名門正派,是ES6的一個語法標準。遵循CommonJs
? ? 補充:webpack一開始的目的就是打包CommonJs模塊(CommonJs是Node.js的規(guī)范)
? ??????????????babel會把你編寫的import/export最終編譯成require/exports來執(zhí)行
調用時間
? ??require是運行時調用,所以require理論上可以運用在代碼的任何地方。在使用時,完全可以忽略模塊化這個概念來使用require。僅僅把它當做一個node內置的全局函數(shù),它的參數(shù)可以是表達式
????import是編譯時調用,所以必須放在文件開頭
本質:
? ? require是賦值過程,其實require的結果就是對象、數(shù)字、字符串、函數(shù)等,再把require的結構賦值給某個變量
? ? import是解析過程,但是目前所有的引擎都還沒有實現(xiàn)import,我們在node中使用babel支持ES6,也僅僅是將ES6轉碼為ES5再執(zhí)行,import語法會被轉碼為require
? ??ES6 Module(import/export)中倒入模塊的屬性或者方法是強綁定的,包括基礎類型。而CommonJs(require/exports)則是普通的值傳遞(基礎類型)或者引用傳遞(引用類型)

在編寫上面的過程中發(fā)現(xiàn),使用import方法調用,在node執(zhí)行的過程中會報錯。

因為當前的node版本不支持import,所以還是需要先使用babel將import編譯成require,所以這里就不好進行比較。
如果引用的是數(shù)組

看看下面的運行結果

那么,這里就對require得出一個結論:對基礎類型是值拷貝、對引用類型的值是淺拷貝
default關鍵字:
????default?是ES6?Module?所獨有的關鍵字,export?default fs?輸出默認的接口對象,import fs from 'fs'?可直接導入這個對象。說白了,它其實就是別名的語法糖(別名是通過 as?關鍵字來取的)
到底是使用require還是import?
????這個問題就目前而言,沒有辦法回答。以為目前所有的引擎都還沒有實現(xiàn)import,import語法會被轉碼為require,這也是為什么在模塊導出時使用module.exprts,在引入模塊時使用import仍然起效。本質上來說,import會被轉碼為require去執(zhí)行。但是從長遠角度來看,還是使用import,在未來瀏覽器引擎支持import的時候,只需要做出很少的改動
參考地址:
