NodeJs 之模塊系統

前言

隨着前端的發展,工程模塊兒化已經是必不可少的一部分了,爲了讓NodeJs的文件可以相互調用,NodeJs提供了一個簡單的模塊系統;簡單點說:一個 nodeJs 文件就是一個模塊兒 。

通過代碼來實踐認識一下,創建一個模塊兒,上邊我們說到一個nodeJs 文件就是一個模塊兒,那麼創建一個模塊兒其實就是創建一個 NodeJs 文件,這裏我們創建一個 hello.js 文件,內容如下:

通過 exports.變量導出變量,變量可以是函數,構造函數,對象等。

// exports 導出一個函數
 exports.fun = function () {
   console.log("hello module")
 }

接下來,如何使用這個模塊兒? 我們創建一個module.js 來導入一下,module.js 內容如下

通過 require(nodeJs文件路徑) 來導入這個模塊兒

// require  hello.js
var hello = require('./hello');

//調用 hello.fun 函數
hello.fun();

結果不言而喻,肯定是輸出:hello module , 在這裏 module.js 也是一個模塊兒,也可以被其它模塊兒引用。

再來實踐一個導出對象模塊兒,對象裏包含參數,函數等; 同上的文件,我們修改代碼:

這裏呢,我們稍微修改一點點導出的模式,之前我們是通過 exports.變量 導出,看起來並不是那麼靈活,因爲只能導出一個對象或者函數等,爲了更靈活,NodeJs還有一種導出方式 module.exports = {變量1,變量2 ...},如果是隻導出一個對象的話,那麼就可以簡化爲下邊這種寫法。

//  導出一個對象
const obj = {
  arg: "參數",
  func: function () {
    console.log("fun1");
  },
  func2: function () {
    console.log("fun2");
  }
}
module.exports = obj; // 導出對象本身
// module.exports = { obj } // 導出對象包含obj對象本身,可以導出多個對象

輸出結果

hello // { arg: '參數', func: [Function: func], func2: [Function: func2] }
hello.arg // 參數
hello.func //  fun1 

總結:

如果要對外暴露屬性或方法,就用 exports 就行,要暴露對象(類似class,包含了很多屬性和方法),就用 module.exports。

擴展
NodeJs 模塊兒分爲 原生模塊和文件模塊 加載順序也是有一定規則的。

原生模塊:http、fs、path等。
文件模塊:相對路徑,絕對路徑,非原生模塊的文件都屬於文件模塊

通過菜鳥教程的一張圖來了解一下模塊的加載順序和機制
在這裏插入圖片描述
在這裏我就不舉例子來實踐模塊的加載順序了,有興趣的同學可以自行實踐一下。

結論:
1,不管什麼模塊首先在文件模塊緩存中查找,找不到再查看是不是原生模塊兒
2,是原生模塊,首先查找原生模塊緩存(有則導出),不是則查找文件模塊
3,加載對應模塊並添加緩存
4,導出

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