前言
隨着前端的發展,工程模塊兒化已經是必不可少的一部分了,爲了讓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,導出