爲什麼需要模塊系統?¶
在Node.js中,我們可以將代碼拆分成多個獨立的文件,每個文件就是一個“模塊”。這樣做的好處是:
- 代碼複用:不同文件可以共享功能(比如工具函數、配置信息)。
- 代碼組織:將不同功能的代碼放在不同文件中,便於維護和查找。
- 避免全局污染:模塊內的變量和函數默認只在模塊內部可見,不會影響其他文件。
一、Node.js中的模塊是什麼?¶
每個.js文件都是一個獨立的模塊。例如,新建一個utils.js文件,它就是一個模塊。模塊內部的變量、函數、類等默認是“私有的”,只有通過導出機制才能被外部模塊訪問。
二、如何導出模塊內容(exports)?¶
要讓其他模塊使用當前模塊的內容,需要通過exports對象導出。exports是一個默認空的對象,我們可以向其中掛載屬性或方法。
1. 導出單個值¶
// utils.js
exports.PI = 3.14159; // 導出一個常量
exports.add = (a, b) => a + b; // 導出一個函數
2. 導出多個值¶
如果需要導出多個屬性或方法,可以直接給exports對象添加多個屬性:
// utils.js
exports.name = "Node.js";
exports.version = "18.0.0";
exports.log = (msg) => console.log("日誌:", msg);
3. 導出整個對象¶
如果需要導出一個複雜對象(如配置、類等),可以直接將對象賦值給exports:
// config.js
const config = {
port: 3000,
db: "mysql",
secret: "abc123"
};
module.exports = config; // 直接導出對象(注意:也可用 exports = config,但更推薦 module.exports)
三、如何導入模塊內容(require)?¶
要使用其他模塊的內容,使用require函數導入模塊。require會返回被導入模塊的導出內容。
1. 導入本地模塊¶
導入當前項目中的模塊時,需要使用相對路徑(以./或../開頭):
// main.js
const utils = require("./utils.js"); // 導入當前目錄下的 utils.js
const config = require("./config.js"); // 導入當前目錄下的 config.js
// 使用導出的內容
console.log(utils.PI); // 3.14159
console.log(utils.add(1, 2)); // 3
console.log(config.port); // 3000
2. 導入第三方模塊¶
如果是導入Node.js包(如express、lodash),直接寫包名即可:
const express = require("express"); // 導入 express 模塊
const _ = require("lodash"); // 導入 lodash 模塊
四、關鍵細節:exports與module.exports的關係¶
exports是module.exports的引用(即exports = module.exports),默認指向一個空對象。- 我們可以通過
exports直接掛載屬性(如exports.xxx = ...),或直接給module.exports賦值(如module.exports = { ... })。 - 注意:如果直接給
exports賦值(如exports = { a: 1 }),可能會覆蓋默認的module.exports,因此更推薦通過exports.xxx或module.exports導出。
五、綜合示例¶
假設我們有兩個文件:math.js(導出數學工具)和main.js(導入並使用)。
1. 導出模塊(math.js)¶
// math.js
exports.add = (a, b) => a + b;
exports.subtract = (a, b) => a - b;
exports.multiply = (a, b) => a * b;
2. 導入模塊(main.js)¶
// main.js
// 導入 math.js 模塊
const math = require("./math.js");
// 使用導出的函數
console.log("1+2=", math.add(1, 2)); // 輸出:1+2=3
console.log("5-3=", math.subtract(5, 3)); // 輸出:5-3=2
console.log("2*4=", math.multiply(2, 4)); // 輸出:2*4=8
3. 運行結果¶
在終端執行node main.js,即可看到輸出結果。
總結¶
- 模塊:每個
.js文件是一個模塊,內部內容默認私有。 - 導出:通過
exports或module.exports將內容暴露給外部。 - 導入:通過
require引入其他模塊,使用其導出的內容。
掌握exports和require是Node.js開發的基礎,後續學習框架(如Express)和工具庫(如Webpack)時會頻繁用到。多練習不同模塊的導出與導入,能快速提升代碼組織能力!