node中匯入模組require和import的區別
該用require還是import?
require的使用非常簡單,它相當於module.exports的傳送門,module.exports後面的內容是什麼,require的結果就是什麼,物件、數字、字串、函式……再把require的結果賦值給某個變數,相當於把require和module.exports進行平行空間的位置重疊。
而且require理論上可以運用在程式碼的任何地方,甚至不需要賦值給某個變數之後再使用,比如:
require('./a')(); // a模組是一個函式,立即執行a模組函式
var data = require('./a').data; // a模組匯出的是一個物件
var a = require('./a')[0]; // a模組匯出的是一個數組
你在使用時,完全可以忽略模組化這個概念來使用require,僅僅把它當做一個node內建的全域性函式,它的引數甚至可以是表示式:
require(process.cwd() + '/a');
但是import則不同,它是編譯時的(require是執行時的),它必須放在檔案開頭,而且使用格式也是確定的,不容置疑。它不會將整個模組執行後賦值給某個變數,而是隻選擇import的介面進行編譯,這樣在效能上比require好很多。
從理解上,require是賦值過程,import是解構過程,當然,require也可以將結果解構賦值給一組變數,但是import在遇到default時,和require則完全不同: var
$ = require('jquery');
import $ from 'jquery'
是完全不同的兩種概念。
上面完全沒有回答“改用require還是import?”這個問題,因為這個問題就目前而言,根本沒法回答,因為目前所有的引擎都還沒有實現import,我們在node中使用babel支援ES6,也僅僅是將ES6轉碼為ES5再執行,import語法會被轉碼為require。這也是為什麼在模組匯出時使用module.exports,在引入模組時使用import仍然起效,因為本質上,import會被轉碼為require去執行。
但是,我們要知道這樣一個道理,ES7很快也會發布,js引擎們會盡快實現ES6標準的規定,如果一個引擎連標準都實現不了,就會被淘汰, ES6是遲早的事