快速理解 nodejs 模塊

在博客閱讀:https://ssshooter.com/2019-03...

這個小短文用於快速理解 nodejs 模塊(也就是 CommonJS 規範)。

本質

module.exports 用於暴露一個值,這個值默認是對象,也可以覆蓋爲原始值。

嘗試在一個文件中直接 log 出 module 的值,可以得到:

{
  id: '.',
  exports: {}, // 默認空對象
  parent: null,
  filename: '/Users/a10.12/webpack-learning/src/module.js',
  loaded: false,
  children: [],
  paths:
   [ '...' ]
}

你需要通過修改 module 的 exports 屬性來輸出你需要輸出的東西,而 require 用於導入一個模塊,module.exports 的值是什麼,require 拿到的就是什麼。

使用

例如有 module.js

module.exports = {
  s: 2,
}

在 index.js 中引入

let v = require('./module.js')

console.log(v) // 輸出爲 { s: 2 }

原始值的情況也一樣

module.exports = 2

let v = require('./module.js')

console.log(v) // 輸出爲 2

因爲 module.exports 默認是個對象,在輸出對象的時候自然有這麼一種寫法:

module.exports.s = 2

這樣 require 得到的也是{ s: 2 }

簡寫

大概是大佬們覺得 module.exports 寫起來太長,於是把 exports 引用到了 module.exports,所以檢查這兩個東西是否相等時,返回 true:

console.log(exports === module.exports) // true

有了這個特性,在導出對象時能很方便地這麼寫:

exports.s = 2

let v = require('./module.js')

console.log(v) // 輸出爲 2

但是你卻不能這麼寫:

// 這樣
exports = 2
// 或這樣
exports = {
  s: 2,
}
// 都是不可以的

let v = require('./module.js')

console.log(v) // 輸出爲 {}

原因正如上面所說,exports 本來就只是一個對 module.exports 的引用,你可以對這個引用的對象添加屬性,但是一旦用上面兩種方法覆蓋了 exports 對 module.exports 的引用,exports 就等於無效了。

最後提醒,如果前面說的看不懂,可能需要加深對 ECMAScript 引用值和原始值的理解...

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章