Nodejs教程10:Nodejs的模塊化

閱讀更多系列文章請訪問個人GitHub博客,示例代碼請訪問這裏

Nodejs定義模塊

Nodejs的模塊化因爲出現的較早,所以它遵循的是CommonJS規範,而非ES6的模塊化。node

在Nodejs的模塊化中,最經常使用到的有module對象、exports對象、require方法。git

其中module和exports用於輸出模塊,require用於引用模塊。github

一個簡單的模塊例子

示例代碼:/lesson10/module1.js、/lesson10/require.jsbash

先新建一個module1.js文件,代碼以下:less

module.exports.a = 1
module.exports.b = 2

let c = 3
複製代碼

在require.js中,引入模塊並打印:模塊化

const module1 = require('./module1')

console.log(module1)
複製代碼

能夠看到打印結果:{ a: 1, b: 2 }。函數

這段代碼的含義以下:ui

  1. module1.js對外輸出了module.exports,module.exports爲一個對象,它含有a和b屬性。
  2. module1.js中雖然定義了變量c,但它只在module1.js這個模塊中存在,從外部沒法訪問。
  3. 在require.js中引用module1.js,必須使用相對路徑或絕對路徑。
  4. 若引用時不帶路徑,而是直接使用模塊名稱,則會默認引用項目目錄下的node_modules文件夾下的模塊,如:
const module2 = require('module2')

console.log(module2)  // { a: 1, b: 2 }
複製代碼

若此時項目目錄下的node_modules文件夾下存在module2.js文件,則會引用該文件。this

若不存在,則會查找系統的node_modules文件夾下,即全局安裝的模塊,是否存在module2。spa

若還不存在該模塊,則會報錯。

經過require導入的模塊,能夠被任意命名,所以寫成const a = require('module2')也是能夠的。

module.exports

上面這個例子中的模塊導出,還能夠省略module,直接寫成exports.a = 1; exports.b = 1; ...。

但直接使用exports導出,也僅支持這種寫法,若寫成:

exports = {
  a: 1,
  b: 2
}

複製代碼

在引用模塊時,只能接收到{},也就是說exports只支持exports.a = 1;這樣的語法。

若是要將整個模塊直接定義爲一個對象、函數、變量、類,則須要使用module.exports = 123。

以下:

示例代碼:/lesson10/module3.js

module.exports = {
  a: 1,
  b: 2
}

module.exports = 123

module.exports = {
  a: 1,
  b: 2,
  c: 3
}

module.exports = function () {
  console.log('test')
}

module.exports = class {
  constructor(name) {
    this.name = name
  }

  show() {
    console.log(`Show ${this.name}`)
  }
}
複製代碼

module.exports能夠讓模塊被賦值成任意類型,但須要注意的是此時module.exports相似於一個模塊內的全局變量。

對它的重複賦值,只有最後的值有效,以前的值會直接被覆蓋。

在這個例子中,module3.js模塊最終導出爲一個類。

所以,一般推薦使用module.exports,能夠避免出錯。

相關文章
相關標籤/搜索