咱們在編寫js過程當中,常常會碰到 requrie和import的寫法,也會看到export default,exports的寫法,他們能不能混用呢,咱們來探究一下node
node版本 v9.6.1
操做系統 Mac
咱們打印出module,結果以下
數組
module.id 模塊的識別符,一般是帶有絕對路徑的模塊文件名。
module.filename 模塊的文件名,帶有絕對路徑。
module.loaded 返回一個布爾值,表示模塊是否已經完成加載。
module.parent 返回一個對象,表示調用該模塊的模塊。
module.children 返回一個數組,表示該模塊要用到的其餘模塊。
module.exports 表示模塊對外輸出的值。
咱們能夠看到在模塊中exports和module.exports 是同一個對象
就至關於,文件執行前默認執行了一下語句ui
let exports = module.exports;
var firstName = 'Michael'; var lastName = 'Jackson'; var year = 1958; export {firstName, lastName, year};
執行結果
spa
咱們看到在node v9.6.1 版本中並不支持export,咱們使用bable轉譯後看一下操作系統
其實使用export,編譯後仍是使用的exportscode
var firstName = 'Michael'; var lastName = 'Jackson'; export default firstName; export {lastName };
因此node中導出模塊只會用到了module.exports,其餘語法都只是一些包裝而已對象
module.js圖片
var firstName = 'Michael'; var lastName = 'Jackson'; exports.default = firstName; exports.lastName = lastName;
index.jsip
const test4 = require('./modle'); console.log(test4);
結果it
{ default: 'Michael', lastName: 'Jackson' }
module.js
var firstName = 'Michael'; var lastName = 'Jackson'; export default firstName; export lastName = lastName;
index.js
const test4 = require('./modle'); console.log(test4);
結果:
{ default: 'Michael', lastName: 'Jackson' }
require接受到的是module.exports對象
當你使用export default firstName時,轉化成了exports.default = firstName;
因此不管你使用什麼樣的形式導出模塊,對於require來講都是同樣的
var firstName = 'Michael'; var lastName = 'Jackson'; export default firstName; export { lastName };
index.js
import test6 from './module'; console.log(test6);
結果
Michael
這裏就和require不同了,import默認導出的是 export default
index.js
import * as test6 from './module'; console.log(test6);
結果:
{ default: 'Michael', lastName: 'Jackson' }
這時候導出的結果才和require一致
當import test6 from './module'是,默認會查找default,假如沒有export default那麼 test6爲undefined,那麼要導出lastName就得使用
import { lastName } from './module';
var lastName = 'Jackson'; var firstName = 'Michael'; exports = { lastName , firstName };
index.js
import test7 from './module'; console.log(test7);
結果
{ firstName: 'Michael', lastName: 'Jackson' }
導出模塊可使用 export和exports,引入模塊可使用 import和require,但兩兩能夠交叉使用,import/export 最終都是編譯爲 require/exports 來執行的只是export 會有一個default的不一樣,但通常來講export對應import,exports對應require。