1. 程式人生 > >node中匯入模組require和import的區別

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是遲早的事

 。如果你現在仍然在程式碼中部署require,那麼等到ES6被引擎支援時,你必須升級你的程式碼,而如果現在開始部署import,那麼未來可能只需要做很少的改動。