最近在學習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'