快速理解 nodejs 模塊

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

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

本質

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

嘗試在一個文件中直接 log 出 module 的值,能夠獲得:webpack

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

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

使用

例若有 module.jsssh

module.exports = {
  s: 2,
}

在 index.js 中引入ui

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

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

原始值的狀況也同樣code

module.exports = 2

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

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

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

module.exports.s = 2

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

簡寫

大概是大佬們以爲 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 引用值和原始值的理解...

相關文章
相關標籤/搜索