require和import的區別和使用


最近在學習node,剛開始不明白為什么寫node的時候,不能用import而只能用require,Node對CommonJS模塊規范的實現, CommonJS模塊基本上包括兩個基礎的部分:一個取名為exports的自由變量,它包含模塊希望提供給其他模塊的對象,以及模塊所需要的可以用來引入和導出其它模塊的函數, 所以node.js里面導出使用module.exports = 模塊名,引入的時候使用require

相關資料:
官方地址: http://nodejs.cn/api/modules.html
commonJs的知識鏈接: https://www.w3cschool.cn/zobyhd/1ldb4ozt.html
es6: https://es6.ruanyifeng.com/#docs/module

下面是node中使用的CommonJS的部分說明The module.syncBuiltinESMExports() method updates all the live bindings for builtin ES Modules to match the properties of the CommonJS exports

require和import的區別:
CommonJS 模塊就是對象,輸入時必須查找對象屬性

// CommonJS模塊
let { stat, exists, readfile } = require('fs');

// 等同於
let _fs = require('fs');
let stat = _fs.stat;
let exists = _fs.exists;
let readfile = _fs.readfile;

整體加載fs模塊(即加載fs的所有方法),生成一個對象(_fs),然后再從這個對象上面讀取 3 個方法。這種加載稱為“運行時加載”,因為只有運行時才能得到這個對象,導致完全沒辦法在編譯時做“靜態優化”

ES6 模塊不是對象,而是通過export命令顯式指定輸出的代碼,再通過import命令輸入

// 輸出
export const test = '11111'
export const exists= '11111'
export const readFile = '11111'
// ES6模塊
import { test , exists, readFile } from 'fs';

上面的代碼也可以寫成:

// 輸出
 const test = '11111'
 const exists= '11111'
 const readFile = '11111'
 export { test, exists, readFile }

上面代碼的實質是從fs模塊加載 3 個方法,其他方法不加載。這種加載稱為“編譯時加載”或者靜態加載,即 ES6 可以在編譯時就完成模塊加載,效率要比 CommonJS 模塊的加載方式高。當然,這也導致了沒法引用 ES6 模塊本身,因為它不是對象。

export 和export default 區別:
export輸出的時候 import必須要知道函數名,所以如果使用者不想去查函數命是什么,可以使用export default輸出一個模塊,然后import直接用,不用去查函數名是什么

// export-default.js
export default function () {
  console.log('foo');
}

使用:

// import-default.js
import customName from './export-default';
customName(); // 'foo'


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM